Gr.  Grammar ::= [Def] ;

DPar.  Def ::= "param" Ident "=" [Constr] ;
DOper. Def ::= "oper" Ident ":" Type "=" Exp ;
DOpty. Def ::= "oper" Ident "=" Type ;
DLin.  Def ::= "lin" Ident ":" Type "=" Exp ;

terminator Def ";" ;

Con. Constr ::= Ident [Type] ;

separator nonempty Constr "|" ;

TBas. Type1 ::= Ident ;
TVal. Type1 ::= "Ints" Integer ;
TRec. Type1 ::= "{" [Typing] "}" ;
TFun. Type  ::= Type1 "->" Type ;

coercions Type 1 ;

terminator Type "" ;

FTyp. Typing ::= Label ":" Type ;

separator Typing ";" ;

Lab.  Label ::= Ident "#" Integer ;

EVar. Exp2 ::= "$" Ident ;
EOpr. Exp2 ::= "&" Ident ;
ECon. Exp2 ::= Ident ;
EVal. Exp2 ::= Integer ;
EStr. Exp2 ::= String ;
ECst. Exp2 ::= "(" Ident "@" [Exp] ")" ;
ERec. Exp2 ::= "{" [Assign] "}" ;
EApp. Exp1 ::= Exp1 Exp2 ;
ESel. Exp1 ::= Exp1 "!" Exp2 ;
EPro. Exp1 ::= Exp1 "." Label ;
ETab. Exp1 ::= "table" Type "{" [Case] "}" ;
ECat. Exp  ::= Exp "++" Exp1 ;
EAbs. Exp  ::= "\\" Ident "->" Exp ;

coercions Exp 2 ;

separator Exp "," ;

FExp. Assign ::= Label "=" Exp ;

separator Assign ";" ;

Cas.  Case ::= Patt "=>" Exp ;

separator Case ";" ;

PVal. Patt ::= Integer ;
PVar. Patt ::= "$" Ident ;
PRec. Patt ::= "{" [AssPatt] "}" ;
PCon. Patt ::= "(" Ident [Patt] ")" ;

terminator Patt "" ;

FPatt. AssPatt ::= Label "=" Patt ;

separator AssPatt ";" ;

comment "--" ;
comment "{-" "-}" ;

