13/10/2003 - 25/11 - 24/3/2004
The updated HelpFile (accessible through h command) marks unsupported but expected features with *.
GF1 grammars can be automatically translated to GF2 (although result not as good as manual, since indentation and comments are destroyed). The results can be saved in GF2 files, but this is not necessary.
It is also possible to write a GF2 grammar back to GF1.
Example grammars and resource libraries are have been converted. There is a new resource API with many new constructions. The new versions lie in grammars/newresource.
A make facility works, finding out which modules have to be recompiled. There is some room for improvement.
transfer modules have to be called by flags.
Soundness checking of module depencencies and completeness is not complete. This means that some errors may show up too late.
i -old tut1.Eng.g2This 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.)
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:
i -old -abs=Numerals hungarian.gf i -old -abs=Numerals tamil.gf i -old -abs=Numerals sanskrit.gf
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.
% gf2 -old -abs=Tutorial tut1.Eng.gf tut1.Fin.gf tut1.Fra.gf
To write a GF2 grammar back to GF1 (as one big file), use the command
> pg -old
GF2 has more reserved words than GF 1.2. When old files are read, a preprocessor replaces every identifier that has the shape of a new reserved word with a variant where the last letter is replaced by Z, e.g. instance is replaced by instancZ. This method is of course unsafe and should be replaced by something better.
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} ;
}
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:
Moreover:
Example of qualified opening:
concrete NumberSystems of Systems = open (Bin = Binary), (Dec = Decimal) in {
lin
BZero = Bin.Zero ;
DZero = Dec.Zero
}
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