13/10/2003
GF1 grammars can be automatically translated to GF2 (although result not as good as manual). The results can be saved in GF2 files, but this is not necessary.
Example grammars and resource libraries are in the process of be converted. At the same time, their API has grown with new constructions. English and German resources are up-to-date. Finnish and Swedish are also, but their derived libraries have not been adapted to the use of security-bringing lock fields.
A make facility works, finding out which modules have to be recompiled. There is some room for improvement.
The module type grammar (to build multilingual grammars) not yet
implemented.
Abstract modules (interface, instance, and incomplete)
have not been stress-tested, but work in the examples in
resource/romance and resource/french.
Soundness checking of module depencencies and completeness is not
complete.
The option -o causes GF2 to write these modules into files.
The flags -abs, -cnc, and -res can be used
to give custom names to the modules. In particular, it is good to use
the -abs flag to guarantee that the abstract syntax module
has the same name for all grammars in a multilingual environmens:
The same flags as in the import command can be used when invoking
GF2 from the system shell. Many grammars can be imported on the same command
line, e.g.
Moreover:
Example of qualified opening:
The module header is the beginning of the module code up to the
first left bracket ({). The header gives
filename = modulename . extension
File name extensions:
What the make facility does when compiling Foo.gf
How to use GF 1.* files
The import command i is given the option -old. E.g.
i -old tut1.Eng.g2
This generates, internally, three modules:
abstract tut1 = ...
resource ResEng = ...
concrete Eng of tut1 = open ResEng in ...
(The names are different if the file name has fewer parts.)
i -old -abs=Numerals hungarian.gf
i -old -abs=Numerals tamil.gf
i -old -abs=Numerals sanskrit.gf
% gf2 -old -abs=Tutorial tut1.Eng.gf tut1.Fin.gf tut1.Fra.gf
Abstract, concrete, and resource modules
Judgement forms are sorted as follows:
Example:
abstract Sums = {
cat
Exp ;
fun
One : Exp ;
plus : Exp -> Exp -> Exp ;
}
concrete EnglishSums of Sums = open ResEng in {
lincat
Exp = {s : Str ; n : Number} ;
lin
One = expSg "one" ;
sum x y = expSg ("the" ++ "sum" ++ "of" ++ x.s ++ "and" ++ y.s) ;
}
resource ResEng = {
param
Number = Sg | Pl ;
oper
expSG : Str -> {s : Str ; n : Number} = \s -> {s = s ; n = Sg} ;
}
Opening and extending modules
A concrete or resource can open a
resource. This means that
A module of any type can moreover extend a module of the same type.
This means that
Examples of extension:
abstract Products = Sums ** {
fun times : Exp -> Exp -> Exp ;
}
-- names exported: Exp, plus, times
concrete English of Products = EnglishSums ** open ResEng in {
lin times x y = expSg ("the" ++ "product" ++ "of" ++ x.s ++ "and" ++ y.s) ;
}
Another important difference:
concrete NumberSystems of Systems = open (Bin = Binary), (Dec = Decimal) in {
lin
BZero = Bin.Zero ;
DZero = Dec.Zero
}
Compiling modules
Separate compilation assumes there is one module per file.
Only gf files should ever be written/edited manually!