From bbcbf3cc68ceed8ab65ee0cc5aebeba6f9f6b94c Mon Sep 17 00:00:00 2001 From: aarne Date: Wed, 29 Mar 2006 11:53:30 +0000 Subject: [PATCH] reference card --- doc/gf-reference.html | 574 ++++++++++++++++++++++++++++++++++++++++++ doc/gf-reference.pdf | Bin 0 -> 50694 bytes doc/gf-reference.txt | 215 ++++++++-------- 3 files changed, 686 insertions(+), 103 deletions(-) create mode 100644 doc/gf-reference.html create mode 100644 doc/gf-reference.pdf diff --git a/doc/gf-reference.html b/doc/gf-reference.html new file mode 100644 index 000000000..f019a383d --- /dev/null +++ b/doc/gf-reference.html @@ -0,0 +1,574 @@ + + + + +GF Quick Reference + +

GF Quick Reference

+ +Aarne Ranta
+Wed Mar 29 13:21:48 2006 +
+ +

+
+

+ + +

+
+

+

+This is a quick reference on GF grammars. +Help on GF commands is obtained on line by the +help command (h). +

+ +

A Quick Example

+

+This is a complete example, dividing a grammar +into three files. +

+

+abstract, concrete, and resource. +

+

+File Order.gf +

+
+  abstract Order = {
+  cat 
+    Order ; 
+    Item ;
+  fun 
+    One, Two : Item -> Order ;
+    Pizza : Item ;
+  }
+
+

+File OrderEng.gf (the top file): +

+
+  --# -path=.:prelude
+  concrete OrderEng of Order = 
+   open Res, Prelude in {
+  flags startcat=Order ;
+  lincat 
+    Order = SS ; 
+    Item  = {s : Num => Str} ;
+  lin 
+    One it = ss ("one" ++ it.s ! Sg) ;
+    Two it = ss ("two" ++ it.s ! Pl) ;
+    Pizza  = regNoun "pizza" ;
+  }
+
+

+File Res.gf: +

+
+  resource Res = open Prelude in {
+  param Num = Sg | Pl ;
+  oper regNoun : Str -> {s : Num => Str} =
+    \dog -> {s = table {
+      Sg => dog ;
+      Pl => dog + "s"
+      }
+    } ;
+  }
+
+

+To use this example, do +

+
+    % gf             -- in shell: start GF
+    > i OrderEng.gf  -- in GF: import grammar
+    > p "one pizza"  --        parse string
+    > l Two Pizza    --        linearize tree
+
+

+ +

Modules and files

+

+One module per file. +File named Foo.gf contains module named +Foo. +

+

+Each module has the structure +

+
+  moduletypename =   
+    Inherits **        -- optional
+    open Opens in      -- optional
+    { Judgements }   
+
+

+Inherits are names of modules of the same type. +Inheritance can be restricted: +

+
+    Mo[f,g],  -- inherit only f,g from Mo
+    Lo-[f,g]  -- inheris all but f,g from Lo
+
+

+Opens are possible in concrete and resource. +They are names of modules of these two types, possibly +qualified: +

+
+    (M = Mo), -- refer to f as M.f or Mo.f
+    (Lo = Lo) -- refer to f as Lo.f
+
+

+Module types and judgements in them: +

+
+  abstract A          -- cat, fun, def, data
+  concrete C of A     -- lincat, lin, lindef, printname
+  resource R          -- param, oper
+  
+  interface I         -- like resource, but can have
+                         oper f : T without definition
+  instance J of I     -- like resource, defines opers
+                         that I leaves undefined
+  incomplete          -- functor: concrete that opens 
+   concrete CI of A =    one or more interfaces
+    open I in ...
+  concrete CJ of A =  -- completion: concrete that
+    CI with              instantiates a functor by
+      (I = J)            instances of open interfaces
+
+

+The forms +param, oper +may appear in concrete as well, but are then +not inherited to extensions. +

+

+All modules can moreover have flags and comments. +Comments have the forms +

+
+  -- till the end of line
+  {- any number of lines between -}
+  --# reserved for compiler pragmas
+
+

+A concrete can be opened like a resource. +It is translated as follows: +

+
+  cat C          --->  oper C : Type = 
+  lincat C = T           T ** {lock_C : {}}
+  
+  fun f : G -> C --->  oper f : A* -> C* = \g -> 
+  lin f = t              t g ** {lock_C = <>}          
+
+

+An abstract can be opened like an interface. +Any concrete of it then works as an instance. +

+ +

Judgements

+
+  cat C               -- declare category C
+  cat C (x:A)(y:B x)  -- dependent category C
+  cat C A B           -- same as C (x : A)(y : B)
+  fun f : T           -- declare function f of type T
+  def f = t           -- define f as t
+  def f p q = t       -- define f by pattern matching
+  data C = f | g      -- set f,g as constructors of C
+  data f : A -> C     -- same as 
+                         fun f : A -> C; data C=f
+  
+  lincat C = T        -- define lin.type of cat C
+  lin f = t           -- define lin. of fun f
+  lin f x y = t       -- same as lin f = \x y -> t
+  lindef C = \s -> t  -- default lin. of cat C
+  printname fun f = s -- printname shown in menus
+  printname cat C = s -- printname shown in menus
+  printname f = s     -- same as printname fun f = s
+  
+  param P = C | D Q R -- define parameter type P 
+                         with constructors
+                         C : P, D : Q -> R -> P
+  oper h : T = t      -- define oper h of type T
+  oper h = t          -- omit type, if inferrable
+  
+  flags p=v           -- set value of flag p
+
+

+Judgements are terminated by semicolons (;). +Subsequent judgments of the same form may share the +keyword: +

+
+  cat C ; D ;         -- same as cat C ; cat D ;
+
+

+Judgements can also share RHS: +

+
+  fun f,g : A         -- same as fun f : A ; g : A
+
+

+ +

Types

+

+Abstract syntax (in fun): +

+
+  C                -- basic type, if cat C
+  C a b            -- basic type for dep. category
+  (x : A) -> B     -- dep. functions from A to B
+  (_ : A) -> B     -- nondep. functions from A to B
+  (p,q : A) -> B   -- same as (p : A)-> (q : A) -> B
+  A -> B           -- same as (_ : A) -> B
+  Int              -- predefined integer type
+  Float            -- predefined float type
+  String           -- predefined string type
+
+

+Concrete syntax (in lincat): +

+
+  Str              -- token lists
+  P                -- parameter type, if param P
+  P => B           -- table type, if P param. type
+  {s : Str ; p : P}-- record type
+  {s,t : Str}      -- same as {s : Str ; t : Str}
+  {a : A} **{b : B}-- record type extension, same as  
+                      {a : A ; b : B}
+  A * B * C        -- tuple type, same as
+                      {p1 : A ; p2 : B ; p3 : C}
+  Ints n           -- type of n first integers
+
+

+Resource (in oper): all those of concrete, plus +

+
+  Tok              -- tokens (subset of Str)
+  A -> B           -- functions from A to B
+  Int              -- integers
+  Strs             -- list of prefixes (for pre)
+  PType            -- parameter type
+  Type             -- any type
+
+

+As parameter types, one can use any finite type: +param constants P, +Ints n, and record types of parameter types. +

+ +

Expressions

+

+Syntax trees = full function applications +

+
+  f a b              -- : C if fun f : A -> B -> C
+  1977               -- : Int
+  3.14               -- : Float
+  "foo"              -- : String
+
+

+Higher-Order Abstract syntax (HOAS): functions as arguments: +

+
+  F a (\y -> b)      -- : C if a : A, b : B (x : A), 
+                        fun F : A -> (B -> C) -> C
+
+

+Tokens and token lists +

+
+  "hello"            -- : Tok, singleton Str
+  "hello" ++ "world" -- : Str
+  ["hello world"]    -- : Str, same as "hello" ++ "world"
+  "hello" + "world"  -- : Tok, computes to "helloworld"
+  []                 -- : Str, empty list
+
+

+Parameters +

+
+  Sg                   -- atomic constructor
+  VPres Sg P2          -- applied constructor
+  {n = Sg ; p = P3}    -- record of parameters
+
+

+Tables +

+
+  table {              -- by full branches
+    Sg => "mouse" ;
+    Pl => "mice"
+    }
+  table {              -- by pattern matching
+    Pl => "mice" ;
+    _  => "mouse"      -- wildcard pattern
+    }
+  table {               
+    n => regn n "cat" ;-- variable pattern 
+    }
+  table Num {...}      -- table given with arg. type
+  table ["ox"; "oxen"] -- table as course of values
+  \\_ => "fish"        -- same as table {_ => "fish"} 
+  \\p,q => t           -- same as \\p => \\q => t
+  
+  t ! p                -- select p from table t
+  case e of {...}      -- same as table {...} ! e 
+
+

+Records +

+
+  {s = "Liz"; g = Fem} -- record in full form
+  {s,t = "et"}         -- same as {s = "et";t= "et"}
+  
+  {s = "Liz"} **       -- record extension: same as
+    {g = Fem}             {s = "Liz" ; g = Fem}
+  
+  <a,b,c>        -- tuple, same as {p1=a;p2=b;p3=c}
+
+

+Functions +

+
+  \x -> t            -- lambda abstract
+  \x,y -> t          -- same as \x -> \y -> t
+  \x,_ -> t          -- binding not in t
+
+

+Local definitions +

+
+  let x : A = d in t -- let definition
+  let x = d in t     -- let defin, type inferred
+  let x=d ; y=e in t -- same as 
+                        let x=d in let y=e in t
+  let {...} in t     -- same as let ... in t
+  
+  t where {...}      -- same as let ... in t
+
+

+Free variation +

+
+  variants {x ; y}     -- both x and y possible
+  variants {}          -- nothing possible
+
+

+Prefix-dependent choices +

+
+  pre {"a" ; "an" / v} -- "an" before v, "a" otherw.
+  strs {"a" ; "i" ;"o"}-- list of condition prefixes
+
+

+Typed expression +

+
+  <t:T>                -- same as t, to help type inference
+
+

+Accessing bound variables in lin: use fields $1, $2, $3,.... +Example: +

+
+  fun F : (A : Set) -> (El A -> Prop) -> Prop ; 
+  lin F A B = {s = ["for all"] ++ A.s ++ B.$1 ++ B.s}
+
+

+ +

Pattern matching

+

+These patterns can be used in branches of table and +case expressions. +

+
+  C                 -- atomic param constructor
+  C p q             -- param constr. appl- to patterns
+  x                 -- variable, matches anything
+  _                 -- wildcard, matches anything
+  "foo"             -- string
+  56                -- integer
+  {s = p ; y = q}   -- record, matches extensions too
+  <p,q>             -- tuple, same as {p1=p ; p2=q}
+  p | q             -- disjunction, binds to first match
+  x@p               -- binds x to what p matches
+  - p               -- negation
+  p + "s"           -- sequence of two string patterns
+  p*                -- repetition of a string pattern
+
+

+ +

Sample library functions

+
+  -- lib/prelude/Predef.gf
+  drop   : Int -> Tok -> Tok   -- drop prefix of length
+  take   : Int -> Tok -> Tok   -- take prefix of length
+  tk     : Int -> Tok -> Tok   -- drop suffix of length
+  dp     : Int -> Tok -> Tok   -- take suffix of length
+  occur  : Tok -> Tok -> PBool -- test if substring
+  occurs : Tok -> Tok -> PBool -- test if any char occurs
+  show   : (P:Type) -> P ->Tok -- param to string
+  read   : (P:Type) -> Tok-> P -- string to param
+  toStr  : (L:Type) -> L ->Str -- find "first" string
+  
+  -- lib/prelude/Prelude.gf
+  param Bool = True | False
+  oper
+    SS  : Type                   -- the type {s : Str}
+    ss  : Str -> SS              -- construct SS
+    cc2 : (_,_ : SS) -> SS       -- concat SS's
+    optStr : Str -> Str          -- string or empty
+    strOpt : Str -> Str          -- empty or string
+    bothWays : Str -> Str -> Str -- X++Y or Y++X 
+    init : Tok -> Tok            -- all but last char
+    last : Tok -> Tok            -- last char
+    prefixSS : Str -> SS -> SS
+    postfixSS : Str -> SS -> SS
+    infixSS : Str -> SS -> SS -> SS
+    if_then_else : (A : Type) -> Bool -> A -> A -> A
+    if_then_Str : Bool -> Str -> Str -> Str
+
+

+ +

Flags

+

+Flags can appear, with growing priority, +

+ + +

+Some common flags used in grammars: +

+
+  startcat=cat    use this category as default 
+  
+  lexer=literals  int and string literals recognized
+  lexer=code      like program code
+  lexer=text      like text: spacing, capitals
+  lexer=textlit   text, unknowns as string lits
+  
+  unlexer=code    like program code
+  unlexer=codelit code, remove string lit quotes
+  unlexer=text    like text: punctuation, capitals
+  unlexer=textlit text, remove string lit quotes
+  unlexer=concat  remove all spaces
+  unlexer=bind    remove spaces around "&+"
+  
+  optimize=all_subs  best for almost any concrete
+  optimize=values    good for lexicon concrete
+  optimize=all       usually good for resource
+  optimize=noexpand  for resource, if =all too big
+
+

+For the full set of values for flag, +use on-line h -flag. +

+ +

File paths

+

+Colon-separated lists of directories tried in the +given order: +

+
+  --# -path=.:../abstract:../common:prelude
+
+

+This can be (in order of growing preference), as +first line in the top file, as flag to gf +when invoked, or as flag to the i command. +The prefix --# is used only in files. +

+

+If the variabls GF_LIB_PATH is defined, its +value is automatically prefixed to each directory to +extend the original search path. +

+ +

Alternative grammar formats

+

+Old GF (before GF 2.0): +all judgements in any kinds of modules, +division into files uses includes. +A file Foo.gf is recognized as the old format +if it lacks a module header. +

+

+Context-free (file foo.cf). The form of rules is e.g. +

+
+  Fun. S ::= NP "is" AP ;
+
+

+If Fun is omitted, it is generated automatically. +Rules must be one per line. The RHS can be empty. +

+

+Extended BNF (file foo.ebnf). The form of rules is e.g. +

+
+  S ::= (NP+ ("is" | "was") AP | V NP*) ;
+
+

+where the RHS is a regular expression of categories +and quoted tokens: "foo", T U, T|U, T*, T+, T?, or empty. +Rule labels are generated automatically. +

+

+Probabilistic grammars (not a separate format). +You can set the probability of a function f (in its value category) by +

+
+  --# prob f 0.009
+
+

+These are put into a file given to GF using the probs=File flag +on command line. This file can be the grammar file itself. +

+

+Example-based grammars (file foo.gfe). Expressions of the form +

+
+  in Cat "example string"
+
+

+are preprocessed by using a parser given by the flag +

+
+  --# -resource=File
+
+

+and the result is written to foo.gf. +

+ +

References

+

+GF Homepage +

+

+A. Ranta, Grammatical Framework: A Type-Theoretical Grammar Formalism. +The Journal of Functional Programming, vol. 14:2. 2004, pp. 145-189. +

+ + + + diff --git a/doc/gf-reference.pdf b/doc/gf-reference.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4a43a863592bacc7672aad996797b728fa75bf04 GIT binary patch literal 50694 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 O8k=&ds=E5SaRC5SMf0Wr literal 0 HcmV?d00001 diff --git a/doc/gf-reference.txt b/doc/gf-reference.txt index edfe0fd49..16e7b2378 100644 --- a/doc/gf-reference.txt +++ b/doc/gf-reference.txt @@ -16,41 +16,48 @@ help command (``h``). ==A Quick Example== -This is a complete example using +This is a complete example, dividing a grammar +into three files. + ``abstract``, ``concrete``, and ``resource``. + +File ``Order.gf`` ``` --- in file Order.gf abstract Order = { - cat - Order ; - Item ; - fun - One, Two : Item -> Order ; - Pizza : Item ; - } - --- in file OrderEng.gf -concrete OrderEng of Order = open Res in { - flags startcat=Order ; - cat - Order = {s : Str} ; - Item = {s : Num => Str} ; - fun - One it = {s = "one" ++ it.s ! Sg} ; - Two it = {s = "two" ++ it.s ! Pl} ; - Pizza = regNoun "pizza" ; - } - --- in file Res.gf -resource Res = { - param Num = Sg | Pl ; - oper regNoun : Str -> {s : Num => Str} = - \dog -> {s = table { - Sg => dog ; - Pl => dog + "s" - } - } ; - } ; +cat + Order ; + Item ; +fun + One, Two : Item -> Order ; + Pizza : Item ; +} +``` +File ``OrderEng.gf`` (the top file): +``` +--# -path=.:prelude +concrete OrderEng of Order = + open Res, Prelude in { +flags startcat=Order ; +lincat + Order = SS ; + Item = {s : Num => Str} ; +lin + One it = ss ("one" ++ it.s ! Sg) ; + Two it = ss ("two" ++ it.s ! Pl) ; + Pizza = regNoun "pizza" ; +} +``` +File ``Res.gf``: +``` +resource Res = open Prelude in { +param Num = Sg | Pl ; +oper regNoun : Str -> {s : Num => Str} = + \dog -> {s = table { + Sg => dog ; + Pl => dog + "s" + } + } ; +} ``` To use this example, do ``` @@ -64,29 +71,29 @@ To use this example, do ==Modules and files== -In standard GF, there is one module per file. +One module per file. File named ``Foo.gf`` contains module named ``Foo``. Each module has the structure ``` moduletypename = - Extends ** -- optional - open Opens in -- optional + Inherits ** -- optional + open Opens in -- optional { Judgements } ``` -Extends are names of modules of the same type. -They can be restricted: +Inherits are names of modules of the same type. +Inheritance can be restricted: ``` - Mo[f,g], -- inherit only f,g - Lo-[f,g] -- inheris all but f,g + Mo[f,g], -- inherit only f,g from Mo + Lo-[f,g] -- inheris all but f,g from Lo ``` Opens are possible in ``concrete`` and ``resource``. They are names of modules of these two types, possibly qualified: ``` - (M = Mo), -- references M.f or Mo.f - (Lo = Lo) -- references Lo.f + (M = Mo), -- refer to f as M.f or Mo.f + (Lo = Lo) -- refer to f as Lo.f ``` Module types and judgements in them: ``` @@ -95,23 +102,28 @@ concrete C of A -- lincat, lin, lindef, printname resource R -- param, oper interface I -- like resource, but can have - -- oper f : T without definition + oper f : T without definition instance J of I -- like resource, defines opers - -- that I leaves undefined + that I leaves undefined incomplete -- functor: concrete that opens - concrete CI of A = -- one or more interfaces + concrete CI of A = one or more interfaces open I in ... concrete CJ of A = -- completion: concrete that - CI with -- instantiates a functor by giving - (I = J) -- instances of its open interfaces + CI with instantiates a functor by + (I = J) instances of open interfaces ``` The forms ``param``, ``oper`` -may appear in ``concrete`` as well, but are not inherited to -extensions. - -All modules can moreover have ``flag``s. +may appear in ``concrete`` as well, but are then +not inherited to extensions. +All modules can moreover have ``flags`` and comments. +Comments have the forms +``` +-- till the end of line +{- any number of lines between -} +--# reserved for compiler pragmas +``` A ``concrete`` can be opened like a ``resource``. It is translated as follows: ``` @@ -130,13 +142,14 @@ Any ``concrete`` of it then works as an ``instance``. ``` cat C -- declare category C -cat C (x : A) -- dependent category C -cat C A -- same as C (x : A) +cat C (x:A)(y:B x) -- dependent category C +cat C A B -- same as C (x : A)(y : B) fun f : T -- declare function f of type T def f = t -- define f as t def f p q = t -- define f by pattern matching -data C = f -- set f as constructor of C -data f : A -> C -- same as fun f : A; data C=f +data C = f | g -- set f,g as constructors of C +data f : A -> C -- same as + fun f : A -> C; data C=f lincat C = T -- define lin.type of cat C lin f = t -- define lin. of fun f @@ -146,15 +159,16 @@ printname fun f = s -- printname shown in menus printname cat C = s -- printname shown in menus printname f = s -- same as printname fun f = s -param P = C | D Q R -- define ptype P with constrs - -- C : P, D : Q -> R -> P +param P = C | D Q R -- define parameter type P + with constructors + C : P, D : Q -> R -> P oper h : T = t -- define oper h of type T oper h = t -- omit type, if inferrable -flag p=v -- define value of flag p +flags p=v -- set value of flag p ``` Judgements are terminated by semicolons (``;``). -Subsequent judgments of the same form may share their +Subsequent judgments of the same form may share the keyword: ``` cat C ; D ; -- same as cat C ; cat D ; @@ -187,9 +201,9 @@ P => B -- table type, if P param. type {s : Str ; p : P}-- record type {s,t : Str} -- same as {s : Str ; t : Str} {a : A} **{b : B}-- record type extension, same as - -- {a : A ; b : B} + {a : A ; b : B} A * B * C -- tuple type, same as - -- {p1 : A ; p2 : B ; p3 : C} + {p1 : A ; p2 : B ; p3 : C} Ints n -- type of n first integers ``` Resource (in ``oper``): all those of concrete, plus @@ -197,7 +211,7 @@ Resource (in ``oper``): all those of concrete, plus Tok -- tokens (subset of Str) A -> B -- functions from A to B Int -- integers -Strs -- list of prefixes +Strs -- list of prefixes (for pre) PType -- parameter type Type -- any type ``` @@ -219,14 +233,14 @@ f a b -- : C if fun f : A -> B -> C Higher-Order Abstract syntax (HOAS): functions as arguments: ``` F a (\y -> b) -- : C if a : A, b : B (x : A), - -- fun F : A -> (B -> C) -> C + fun F : A -> (B -> C) -> C ``` Tokens and token lists ``` "hello" -- : Tok, singleton Str "hello" ++ "world" -- : Str ["hello world"] -- : Str, same as "hello" ++ "world" -"hello" + "world" -- : Str, computes to "helloworld" +"hello" + "world" -- : Tok, computes to "helloworld" [] -- : Str, empty list ``` Parameters @@ -248,24 +262,21 @@ table { -- by pattern matching table { n => regn n "cat" ;-- variable pattern } - -\\_ => "fish" -- same as table {n => "fish"} +table Num {...} -- table given with arg. type +table ["ox"; "oxen"] -- table as course of values +\\_ => "fish" -- same as table {_ => "fish"} \\p,q => t -- same as \\p => \\q => t -table Num [ -- table given with arg. type - "mouse" ; "mice" -- and course of values - ] - t ! p -- select p from table t case e of {...} -- same as table {...} ! e ``` Records ``` -{s = "Liz" ; g = Fem}-- record in full form +{s = "Liz"; g = Fem} -- record in full form {s,t = "et"} -- same as {s = "et";t= "et"} {s = "Liz"} ** -- record extension: same as - {g = Fem} -- {s = "Liz" ; g = Fem} + {g = Fem} {s = "Liz" ; g = Fem} -- tuple, same as {p1=a;p2=b;p3=c} ``` @@ -273,13 +284,14 @@ Functions ``` \x -> t -- lambda abstract \x,y -> t -- same as \x -> \y -> t +\x,_ -> t -- binding not in t ``` Local definitions ``` let x : A = d in t -- let definition let x = d in t -- let defin, type inferred let x=d ; y=e in t -- same as - -- let x=d in let y=t in d + let x=d in let y=e in t let {...} in t -- same as let ... in t t where {...} -- same as let ... in t @@ -298,10 +310,11 @@ Typed expression ``` -- same as t, to help type inference ``` -Accessing bound variables in HOAS: use fields ``$1, $2, $3,...``. +Accessing bound variables in ``lin``: use fields ``$1, $2, $3,...``. Example: ``` -lin F a b = {s = ["for all"] ++ a.s ++ b.$1 ++ b.s} +fun F : (A : Set) -> (El A -> Prop) -> Prop ; +lin F A B = {s = ["for all"] ++ A.s ++ B.$1 ++ B.s} ``` @@ -329,15 +342,15 @@ p* -- repetition of a string pattern ``` -- lib/prelude/Predef.gf -drop : Int -> Tok -> Tok -- drop prefix of length -take : Int -> Tok -> Tok -- take prefix of length -tk : Int -> Tok -> Tok -- drop suffix of length -dp : Int -> Tok -> Tok -- take suffix of length -occur : Tok -> Tok -> PBool -- test if substring -occurs : Tok -> Tok -> PBool -- test if any char occurs -show : (P : Type) -> P ->Tok -- param to string -read : (P : Type) -> Tok-> P -- string to param -toStr : (L : Type) -> L ->Str -- find "first" string +drop : Int -> Tok -> Tok -- drop prefix of length +take : Int -> Tok -> Tok -- take prefix of length +tk : Int -> Tok -> Tok -- drop suffix of length +dp : Int -> Tok -> Tok -- take suffix of length +occur : Tok -> Tok -> PBool -- test if substring +occurs : Tok -> Tok -> PBool -- test if any char occurs +show : (P:Type) -> P ->Tok -- param to string +read : (P:Type) -> Tok-> P -- string to param +toStr : (L:Type) -> L ->Str -- find "first" string -- lib/prelude/Prelude.gf param Bool = True | False @@ -347,7 +360,7 @@ oper cc2 : (_,_ : SS) -> SS -- concat SS's optStr : Str -> Str -- string or empty strOpt : Str -> Str -- empty or string - bothWays : Str -> Str -> Str -- XY or YX + bothWays : Str -> Str -> Str -- X++Y or Y++X init : Tok -> Tok -- all but last char last : Tok -> Tok -- last char prefixSS : Str -> SS -> SS @@ -361,8 +374,7 @@ oper ==Flags== Flags can appear, with growing priority, -- in files, with judgement keyword ``flags`` - and without dash (``-``) +- in files, judgement ``flags`` and without dash (``-``) - as flags to ``gf`` when invoked, with dash - as flags to various GF commands, with dash @@ -383,18 +395,19 @@ unlexer=textlit text, remove string lit quotes unlexer=concat remove all spaces unlexer=bind remove spaces around "&+" -optimize=values good for lexicon concrete optimize=all_subs best for almost any concrete +optimize=values good for lexicon concrete optimize=all usually good for resource optimize=noexpand for resource, if =all too big ``` -For the full set of flags, use on-line ``h -flag``. +For the full set of values for ``flag``, +use on-line ``h -flag``. ==File paths== -Colon-separated lists of search directories tried in the +Colon-separated lists of directories tried in the given order: ``` --# -path=.:../abstract:../common:prelude @@ -417,23 +430,19 @@ division into files uses ``include``s. A file ``Foo.gf`` is recognized as the old format if it lacks a module header. -**Context-free** (file ``foo.cf``). The form of rules is +**Context-free** (file ``foo.cf``). The form of rules is e.g. ``` - Fun. Cat ::= Cat "tok" Cat ; +Fun. S ::= NP "is" AP ; ``` -where ``Fun`` is optional. Rules must be one per line. -The RHS can be empty. +If ``Fun`` is omitted, it is generated automatically. +Rules must be one per line. The RHS can be empty. -**Extended BNF** (file ``foo.ebnf``). The form of rules is +**Extended BNF** (file ``foo.ebnf``). The form of rules is e.g. ``` - Cat ::= Reg ; +S ::= (NP+ ("is" | "was") AP | V NP*) ; ``` -where ``Reg`` is a regular expression of categories -and quoted tokens: -``` - T U, T|U, T*, T+, T? -``` -The RHS can also be empty. +where the RHS is a regular expression of categories +and quoted tokens: ``"foo", T U, T|U, T*, T+, T?``, or empty. Rule labels are generated automatically. @@ -447,11 +456,11 @@ on command line. This file can be the grammar file itself. **Example-based grammars** (file ``foo.gfe``). Expressions of the form ``` -in Mo.Cat "example string" +in Cat "example string" ``` are preprocessed by using a parser given by the flag ``` ---# resource=File +--# -resource=File ``` and the result is written to ``foo.gf``.