forked from GitHub/gf-core
171 lines
4.3 KiB
CFEngine3
171 lines
4.3 KiB
CFEngine3
-- top-level grammar
|
|
|
|
-- Canonical GF. AR 27/4/2003
|
|
|
|
entrypoints Canon, Line ;
|
|
|
|
-- old approach: read in a whole grammar
|
|
|
|
MGr. Canon ::= "grammar" [Ident] "of" Ident ";" [Module] ;
|
|
Gr. Canon ::= [Module] ;
|
|
|
|
-- new approach: read line by line
|
|
|
|
LMulti. Line ::= "grammar" [Ident] "of" Ident ";" ;
|
|
LHeader. Line ::= ModType "=" Extend Open "{" ;
|
|
LFlag. Line ::= Flag ";" ;
|
|
LDef. Line ::= Def ";" ;
|
|
LEnd. Line ::= "}" ;
|
|
|
|
Mod. Module ::= ModType "=" Extend Open "{" [Flag] [Def] "}" ;
|
|
|
|
MTAbs. ModType ::= "abstract" Ident ;
|
|
MTCnc. ModType ::= "concrete" Ident "of" Ident ;
|
|
MTRes. ModType ::= "resource" Ident ;
|
|
MTTrans. ModType ::= "transfer" Ident ":" Ident "->" Ident ;
|
|
|
|
separator Module "" ;
|
|
|
|
Ext. Extend ::= [Ident] "**" ;
|
|
NoExt. Extend ::= ;
|
|
|
|
Opens. Open ::= "open" [Ident] "in" ;
|
|
NoOpens. Open ::= ;
|
|
|
|
|
|
-- judgements
|
|
|
|
Flg. Flag ::= "flags" Ident "=" Ident ; --- to have the same res word as in GF
|
|
|
|
AbsDCat. Def ::= "cat" Ident "[" [Decl] "]" "=" [CIdent] ;
|
|
AbsDFun. Def ::= "fun" Ident ":" Exp "=" Exp ;
|
|
AbsDTrans. Def ::= "transfer" Ident "=" Exp ;
|
|
|
|
ResDPar. Def ::= "param" Ident "=" [ParDef] ;
|
|
ResDOper. Def ::= "oper" Ident ":" CType "=" Term ;
|
|
|
|
CncDCat. Def ::= "lincat" Ident "=" CType "=" Term ";" Term ;
|
|
CncDFun. Def ::= "lin" Ident ":" CIdent "=" "\\" [ArgVar] "->" Term ";" Term ;
|
|
|
|
AnyDInd. Def ::= Ident Status "in" Ident ;
|
|
|
|
ParD. ParDef ::= Ident [CType] ;
|
|
|
|
-- the canonicity of an indirected constant
|
|
|
|
Canon. Status ::= "data" ;
|
|
NonCan. Status ::= ;
|
|
|
|
-- names originating from resource modules: prefixed by the module name
|
|
|
|
CIQ. CIdent ::= Ident "." Ident ;
|
|
|
|
-- types and terms in abstract syntax; no longer type-annotated
|
|
|
|
EApp. Exp1 ::= Exp1 Exp2 ;
|
|
EProd. Exp ::= "(" Ident ":" Exp ")" "->" Exp ;
|
|
EAbs. Exp ::= "\\" Ident "->" Exp ;
|
|
EAtom. Exp2 ::= Atom ;
|
|
EData. Exp2 ::= "data" ;
|
|
|
|
EEq. Exp ::= "{" [Equation] "}" ; -- list of pattern eqs; primitive notion: []
|
|
|
|
coercions Exp 2 ;
|
|
|
|
SType. Sort ::= "Type" ;
|
|
|
|
Equ. Equation ::= [APatt] "->" Exp ;
|
|
|
|
APC. APatt ::= "(" CIdent [APatt] ")" ;
|
|
APV. APatt ::= Ident ;
|
|
APS. APatt ::= String ;
|
|
API. APatt ::= Integer ;
|
|
APF. APatt ::= Double ;
|
|
APW. APatt ::= "_" ;
|
|
|
|
separator Decl ";" ;
|
|
terminator APatt "" ;
|
|
terminator Equation ";" ;
|
|
|
|
AC. Atom ::= CIdent ;
|
|
AD. Atom ::= "<" CIdent ">" ;
|
|
AV. Atom ::= "$" Ident ;
|
|
AM. Atom ::= "?" Integer ;
|
|
AS. Atom ::= String ;
|
|
AI. Atom ::= Integer ;
|
|
AT. Atom ::= Sort ;
|
|
|
|
Decl. Decl ::= Ident ":" Exp ;
|
|
|
|
|
|
-- types, terms, and patterns in concrete syntax
|
|
|
|
RecType. CType ::= "{" [Labelling] "}" ;
|
|
Table. CType ::= "(" CType "=>" CType ")" ;
|
|
Cn. CType ::= CIdent ;
|
|
TStr. CType ::= "Str" ;
|
|
TInts. CType ::= "Ints" Integer ;
|
|
|
|
Lbg. Labelling ::= Label ":" CType ;
|
|
|
|
Arg. Term2 ::= ArgVar ;
|
|
I. Term2 ::= CIdent ; -- from resources
|
|
Par. Term2 ::= "<" CIdent [Term2] ">" ;
|
|
LI. Term2 ::= "$" Ident ; -- from pattern variables
|
|
|
|
R. Term2 ::= "{" [Assign] "}" ;
|
|
P. Term1 ::= Term2 "." Label ;
|
|
T. Term1 ::= "table" CType "{" [Case] "}" ;
|
|
V. Term1 ::= "table" CType "[" [Term2] "]" ;
|
|
S. Term1 ::= Term1 "!" Term2 ;
|
|
C. Term ::= Term "++" Term1 ;
|
|
FV. Term1 ::= "variants" "{" [Term2] "}" ; --- no separator!
|
|
|
|
EInt. Term2 ::= Integer ;
|
|
EFloat. Term2 ::= Double ;
|
|
K. Term2 ::= Tokn ;
|
|
E. Term2 ::= "[" "]" ;
|
|
|
|
KS. Tokn ::= String ;
|
|
KP. Tokn ::= "[" "pre" [String] "{" [Variant] "}" "]" ;
|
|
internal KM. Tokn ::= String ; -- mark-up
|
|
|
|
Ass. Assign ::= Label "=" Term ;
|
|
Cas. Case ::= [Patt] "=>" Term ;
|
|
Var. Variant ::= [String] "/" [String] ;
|
|
|
|
coercions Term 2 ;
|
|
|
|
L. Label ::= Ident ;
|
|
LV. Label ::= "$" Integer ;
|
|
A. ArgVar ::= Ident "@" Integer ; -- no bindings
|
|
AB. ArgVar ::= Ident "+" Integer "@" Integer ; -- with a number of bindings
|
|
|
|
PC. Patt ::= "(" CIdent [Patt] ")" ;
|
|
PV. Patt ::= Ident ;
|
|
PW. Patt ::= "_" ;
|
|
PR. Patt ::= "{" [PattAssign] "}" ;
|
|
PI. Patt ::= Integer ;
|
|
PF. Patt ::= Double ;
|
|
|
|
PAss. PattAssign ::= Label "=" Patt ;
|
|
|
|
--- here we use the new pragmas to generate list rules
|
|
|
|
terminator Flag ";" ;
|
|
terminator Def ";" ;
|
|
separator ParDef "|" ;
|
|
separator CType "" ;
|
|
separator CIdent "" ;
|
|
separator Assign ";" ;
|
|
separator ArgVar "," ;
|
|
separator Labelling ";" ;
|
|
separator Case ";" ;
|
|
separator Term2 "" ;
|
|
separator String "" ;
|
|
separator Variant ";" ;
|
|
separator PattAssign ";" ;
|
|
separator Patt "" ;
|
|
separator Ident "," ;
|
|
|