13/10/2003 - 25/11 - 2/4/2004 - 18/6 - 13/10 - 16/2/2005
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) ; }
Opening, but not extension, can be qualified:
concrete NumberSystems of Systems = open (Bin = Binary), (Dec = Decimal) in { lin BZero = Bin.Zero ; DZero = Dec.Zero }
Version 2.1 introduces multiple inheritance: a module can extend several modules at the same time, for instance,
abstract Dialogue = User, System ** { ...}may be used to put together "User's moves" and "System's moves" into one Dialogue System grammar.
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
If the compilation of a grammar fails at some module, the state of the GF shell contains all modules read up to that point. This makes it faster to compile the faulty module again after fixing it.
Use the command po = print_options to see what modules are in the state.
To force compilation:
The sometimes exploding size of generated gfc and gfr files has made it urgent to find optimizations that reduce the size of the code. There are five combinations optimizations that can be chosen, as the value of the optimize flag:
An optimization can be selected individually for each resource and concrete module by including the judgement
flags optimize=(share|parametrize|values|all|none) ;in the module body. These flags can be overridden by a flag given in the i command, e.g.
i -src -optimize=none Foo.gfNotice that the option -src is needed if there already are generated files created with other optimization flags.
-path=.:../resource/russian:../preludeenables files to be found in three different directories. By default, only the current directory is included. If a path flag is given, the current directory . must be explicitly included if it is wanted.
The path flag can be set in any of the following places:
Very old GF grammars (from versions before 0.9), with the completely different notation, do not work. They should be first converted to GF1 by using GF version 1.2.
The import command i can be given the option -old. E.g.
i -old tut1.Eng.g2But this is no more necessary: GF2 detects automatically if a grammar is in the GF1 format.
Importing a set of GF2 files 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.
Resource libraries and some example grammars have been converted. Most old example grammars work without any changes. However, there is a new resource API with many new constructions, and which is recommended.
Soundness checking of module depencencies and completeness is not complete. This means that some errors may show up too late.
Latex and XML printing of grammars do not work yet.