token Infix (["@.:-^*+=<>&%$!#%|/\\"]+) ; separator Op "," ; separator Term "," ; terminator nonempty Ident "::" ; terminator Case ""; terminator Guard ""; terminator Fixity ""; terminator Export ";"; Module. Module ::= "module" [Ident] ";" [Export] Term ; Export. Export ::= "export" Symbol ; FQIdent. QIdent ::= [Ident] Ident; FQInfix. QInfix ::= [Ident] Infix ; IdSym. Symbol ::= QIdent ; OpSym. Symbol ::= "(" Op ")" ; InfOp. Op ::= QInfix ; IdOp. Op ::= "`" Symbol "`" ; _. Term ::= Term1 ; Seq. Term ::= Term ";" Term1 ; _. Term1 ::= Term2 ; Binding. Term1 ::= Term4 "=" Term1 ; _. Term2 ::= Term3 ; OpApp. Term2 ::= Term2 Op Term3 ; _. Term3 ::= Term4 ; App. Term3 ::= Term3 Term4 ; Var. Term4 ::= Symbol ; Form. Term4 ::= "{" [Case] "}" ; Block. Term4 ::= "{" Term "}" ; Tuple. Term4 ::= "(" [Term] ")" ; OpDecl. Term4 ::= "operator" Op Assoc [Fixity] ; PatCase. Case ::= "case" Term [Guard] ; NormGuard. Guard ::= "|" Term ":" Term ; DefaultGuard. Guard ::= "|" "default" ":" Term ; LeftAssoc. Assoc ::= "left" ; RightAssoc. Assoc ::= "right" ; NoAssoc. Assoc ::= ; GtFixity. Fixity ::= "precedes" "(" [Op] ")" ; LtFixity. Fixity ::= "succeeds" "(" [Op] ")" ;