index and tutorial

This commit is contained in:
aarne
2005-05-12 16:12:03 +00:00
parent 73a60aabf5
commit f496c49263
11 changed files with 201 additions and 23 deletions

View File

@@ -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>
Neolithic: fire, wheel, think,...
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.
<!-- 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>