diff options
Diffstat (limited to 'doc/tutorial')
| -rw-r--r-- | doc/tutorial/Fish.gf | 4 | ||||
| -rw-r--r-- | doc/tutorial/FishEng.gf | 5 | ||||
| -rw-r--r-- | doc/tutorial/Gatherer.gf | 5 | ||||
| -rw-r--r-- | doc/tutorial/Gatherer.gif | bin | 0 -> 12415 bytes | |||
| -rw-r--r-- | doc/tutorial/GathererEng.gf | 5 | ||||
| -rw-r--r-- | doc/tutorial/Mushrooms.gf | 4 | ||||
| -rw-r--r-- | doc/tutorial/MushroomsEng.gf | 5 | ||||
| -rw-r--r-- | doc/tutorial/Neolithic.gf | 5 | ||||
| -rw-r--r-- | doc/tutorial/NeolithicEng.gf | 6 | ||||
| -rw-r--r-- | doc/tutorial/gf-tutorial2.html | 168 |
10 files changed, 189 insertions, 18 deletions
diff --git a/doc/tutorial/Fish.gf b/doc/tutorial/Fish.gf new file mode 100644 index 000000000..c404115e9 --- /dev/null +++ b/doc/tutorial/Fish.gf @@ -0,0 +1,4 @@ +abstract Fish = { + cat Fish ; + fun Salmon, Perch : Fish ; +} diff --git a/doc/tutorial/FishEng.gf b/doc/tutorial/FishEng.gf new file mode 100644 index 000000000..560f6cda4 --- /dev/null +++ b/doc/tutorial/FishEng.gf @@ -0,0 +1,5 @@ +concrete FishEng of Fish = { + lin + Salmon = {s = "salmon"} ; + Perch = {s = "perch"} ; +} diff --git a/doc/tutorial/Gatherer.gf b/doc/tutorial/Gatherer.gf new file mode 100644 index 000000000..254a46ec0 --- /dev/null +++ b/doc/tutorial/Gatherer.gf @@ -0,0 +1,5 @@ +abstract Gatherer = Paleolithic, Fish, Mushrooms ** { + fun + UseFish : Fish -> CN ; + UseMushroom : Mushroom -> CN ; +}
\ No newline at end of file diff --git a/doc/tutorial/Gatherer.gif b/doc/tutorial/Gatherer.gif Binary files differnew file mode 100644 index 000000000..758b8ea8b --- /dev/null +++ b/doc/tutorial/Gatherer.gif diff --git a/doc/tutorial/GathererEng.gf b/doc/tutorial/GathererEng.gf new file mode 100644 index 000000000..3dfc7c8fd --- /dev/null +++ b/doc/tutorial/GathererEng.gf @@ -0,0 +1,5 @@ +concrete GathererEng of Gatherer = PaleolithicEng, FishEng, MushroomsEng ** { + lin + UseFish x = x ; + UseMushroom x = x ; +} diff --git a/doc/tutorial/Mushrooms.gf b/doc/tutorial/Mushrooms.gf new file mode 100644 index 000000000..87f14de96 --- /dev/null +++ b/doc/tutorial/Mushrooms.gf @@ -0,0 +1,4 @@ +abstract Mushrooms = { + cat Mushroom ; + fun Cep, Agaric : Mushroom ; +} diff --git a/doc/tutorial/MushroomsEng.gf b/doc/tutorial/MushroomsEng.gf new file mode 100644 index 000000000..d4e18d6d4 --- /dev/null +++ b/doc/tutorial/MushroomsEng.gf @@ -0,0 +1,5 @@ +concrete MushroomsEng of Mushrooms = { + lin + Cep = {s = "cep"} ; + Agaric = {s = "agaric"} ; +} diff --git a/doc/tutorial/Neolithic.gf b/doc/tutorial/Neolithic.gf new file mode 100644 index 000000000..2f5c6d116 --- /dev/null +++ b/doc/tutorial/Neolithic.gf @@ -0,0 +1,5 @@ +abstract Neolithic = Paleolithic ** { + fun + Fire, Wheel : CN ; + Think : V ; +} diff --git a/doc/tutorial/NeolithicEng.gf b/doc/tutorial/NeolithicEng.gf new file mode 100644 index 000000000..005781a7e --- /dev/null +++ b/doc/tutorial/NeolithicEng.gf @@ -0,0 +1,6 @@ +concrete NeolithicEng of Neolithic = PaleolithicEng ** { + lin + Fire = {s = "fire"} ; + Wheel = {s = "wheel"} ; + Think = {s = "thinks"} ; +} diff --git a/doc/tutorial/gf-tutorial2.html b/doc/tutorial/gf-tutorial2.html index 18e5342ab..51b300cd1 100644 --- a/doc/tutorial/gf-tutorial2.html +++ b/doc/tutorial/gf-tutorial2.html @@ -11,15 +11,18 @@ <b>3rd Edition, for GF version 2.2 or later</b> -</p><p> +<p> <a href="http://www.cs.chalmers.se/~aarne">Aarne Ranta</a> -</p> <p> <tt>aarne@cs.chalmers.se</tt> -</p></center> + +<p> + +12 May 2005 +</center> <!-- NEW --> @@ -29,12 +32,13 @@ The term GF is used for different things: <ul> <li> a <b>program</b> used for working with grammars <li> a <b>programming language</b> in which grammars can be written -<li> a <b>theory</b> about the concepts of grammars and languages +<li> a <b>theory</b> about grammars and languages </ul> <p> -This tutorial is about the GF program and the GF programming language. +This tutorial is primarily about the GF program and +the GF programming language. It will guide you <ul> <li> to use the GF program @@ -43,8 +47,9 @@ It will guide you </ul> + <!-- NEW --> -<h3>The GF program</h3> +<h3>Getting the GF program</h3> The program is open-source free software, which you can download from the GF Homepage:<br> @@ -60,8 +65,8 @@ There you can download <li> grammar libraries and examples </ul> If you want to compile GF from source, you need Haskell and Java -compilers. But normally you don't have to compile, and you don't -need to know Haskell or Java to use GF. +compilers. But normally you don't have to compile, and you definitely +don't need to know Haskell or Java to use GF. <p> @@ -127,7 +132,7 @@ you imported. Try parsing something else, and you fail > p "hello world" No success in cf parsing no tree found -<pre> +</pre> <!-- NEW --> @@ -183,6 +188,7 @@ generate ten strings with one and the same command: To generate <i>all</i> sentence that a grammar can generate, use the command <tt>generate_trees = gt</tt>. <pre> + > generate_trees | l this louse laughs this louse sleeps this louse swims @@ -197,12 +203,13 @@ You get quite a few trees but not all of them: only up to a given <b>depth</b> of trees. To see how you can get more, use the <tt>help = h</tt> command, <pre> - h gr + help gr </pre> <b>Quiz</b>. If the command <tt>gt</tt> generated all trees in your grammar, it would never terminate. Why? + <!-- NEW --> <h3>More on pipes; tracing</h3> @@ -509,10 +516,38 @@ Each module is compiled into a <tt>.gfc</tt> file. Import <tt>PaleolithicEng.gf</tt> and try what happens <pre> - + > i PaleolithicEng.gf </pre> -Nothing more than before, except that the GFC files -are generated. +The GF program does not only read the file +<tt>PaleolithicEng.gf</tt>, but also all other files that it +depends on - in this case, <tt>Paleolithic.gf</tt>. + +<p> + +For each file that is compiles, a <tt>.gfc</tt> file +is generated. The GFC format (="GF Canonical") is the +"machine code" of GF, which is faster to process than +GF source files. When reading a module, GF knows whether +to use an existing <tt>.gfc</tt> file or to generate +a new one, by looking at modification times. + + + +<!-- NEW --> +<h4>Multilingual grammar</h4> + +The main advantage of separating abstract from concrete syntax is that +one abstract syntax can be equipped with many concrete syntaxes. +A system with this property is called a <b>multilingual grammar</b>. + +<p> + +Multilingual grammars can be used for applications such as +translation. Let us buid an Italian concrete syntax for +<tt>Paleolithic</tt> and then test the resulting +multilingual grammar. + + <!-- NEW --> @@ -554,17 +589,39 @@ lin Import without first emptying <pre> - + > i PaleolithicEng.gf + > i PaleolithicIta.gf </pre> Try generation now: <pre> + > gr | l + un pidocchio uccide questo ragazzo + > gr | l -lang=PaleolithicEng + that louse eats a louse </pre> Translate by using a pipe: <pre> - + > p -lang=PaleolithicEng "the boy eats the snake" | l -lang=PaleolithicIta + il ragazzo mangia il serpente </pre> -Inspect the shell state (<tt>print_options = po</tt>): + + +<!-- NEW --> +<h4>The multilingual shell state</h4> + +A GF shell is at any time in a state, which +contains a multilingual grammar. One of the concrete +syntaxes is the "main" one, which means that parsing and linearization +are performed by using it. By default, the main concrete syntax is the +last-imported one. As we saw on previous slide, the <tt>lang</tt> flag +can be used to change the linearization and parsing grammar. + +<p> + +To see what the multilingual grammar is (as well as some other +things), you can use the command +<tt>print_options = po</tt>: <pre> > print_options main abstract : Paleolithic @@ -574,11 +631,86 @@ Inspect the shell state (<tt>print_options = po</tt>): <!-- NEW --> -<h4>Extending the grammar</h4> +<h4>Extending a grammar</h4> + +The module system of GF makes it possible to <b>extend</b> a +grammar in different ways. The syntax of extension is +shown by the following example. +<pre> + abstract Neolithic = Paleolithic ** { + fun + Fire, Wheel : CN ; + Think : V ; + } +</pre> +Parallel to the abstract syntax, extensions can +be built for concrete syntaxes: +<pre> + concrete NeolithicEng of Neolithic = PaleolithicEng ** { + lin + Fire = {s = "fire"} ; + Wheel = {s = "wheel"} ; + Think = {s = "thinks"} ; + } +</pre> +The effect of extension is that all of the contents of the extended +and extending module are put together. -Neolithic: fire, wheel, think,... +<!-- NEW --> +<h4>Multiple inheritance</h4> + +Specialized vocabularies can be represented as small grammars that +only do "one thing" each, e.g. +<pre> + abstract Fish = { + cat Fish ; + fun Salmon, Perch : Fish ; + } + + abstract Mushrooms = { + cat Mushroom ; + fun Cep, Agaric : Mushroom ; + } +</pre> +They can afterwards be combined in bigger grammars by using +<b>multiple inheritance</b>, i.e. extension of several grammars at the +same time: +<pre> + abstract Gatherer = Paleolithic, Fish, Mushrooms ** { + fun + UseFish : Fish -> CN ; + UseMushroom : Mushroom -> CN ; + } +</pre> + + + +<!-- NEW --> +<h4>Visualizing module structure</h4> + +When you have created all the abstract syntaxes and +one set of concrete syntaxes needed for <tt>Gatherer</tt>, +your grammar consists of eight GF modules. To see how their +dependences look like, you can use the command +<tt>visualize_graph = vg</tt>, +<pre> + > visualize_graph +</pre> +and the graph will pop up in a separate window. It can also +be printed out into a file, e.g. a <tt>.gif</tt> file that +can be included in an HTML document +<pre> + > pm -printer=graph | wf Gatherer.dot + > ! dot -Tgif Gatherer.dot > Gatherer.gif +</pre> +The latter command is a Unix command, issued from GF by using the +shell escape symbol <tt>!</tt>. The resulting graph is shown below. + +<p> + +<img src="Gatherer.gif"> </body> </html>
\ No newline at end of file |
