Commentable space line block = {space | line | block} ; CommentLine = prefix, {_ - (↵ | eoi)} ; CommentBlock = begin, {_ - end}, end ; Lexeme g = g, Commentable (␣ | ↵, ␣) CommentLine CommentBlock ; Parens g = Lexeme "(", g, Lexeme ")" ; begin, in, end | next Type = TypeFun ; TypeFun = infixr TypeList (Lexeme "->") ; TypeList = Lexeme "[", (Type | ""), Lexeme "]" | TypeTuple2 ; TypeTuple2 = Parens (infixr Type (Lexeme ",")) | TypeApp ; TypeApp = {TypeAtom}- ; TypeAtom = Parens Type | TypeConst | TypeVar ; TypeConst = Lexeme ModNameTy ; TypeVar = Lexeme (Unicat LowercaseLetter, {Unicat_Letter | Unicat_Number}) ; Term = TermAbst | TermOperators | TermLet ; TermOperators = operators TermAtom TermPrefix TermInfix TermPostfix ; TermAtom = teinteger | ModNameTe | TermGroup ; TermGroup = Parens Term ; TermAbst = Lexeme "\", {TermAbstDecl}-, Lexeme "->", Term ; TermAbstDecl = Parens (NameTe, (Lexeme "::" | Lexeme ":"), Type) ; TermLet = Lexeme "let", NameTe, {TermAbstDecl}, Lexeme "=", Term, Lexeme "in", Term ; ModNameTe = Lexeme (ModNameTeId | Parens ModNameTeOp) ; NameTe = Lexeme (NameTeId | Parens NameTeOp) ; NameTeId = Unicat_Letter, {NameTeIdTail} - NameTeIdKey, (_ - NameTeIdTail) ; NameTeIdTail = Unicat_Letter | Unicat_Number ; NameTeIdKey = "in" | "let" ; ModNameTeOp = [PathMod, "."], NameTeOp ; NameTeOp = {NameTeOpOk}- - NameTeOpKey, (_ - NameTeOpOk) ; NameTeOpOk = (Unicat_Symbol | Unicat_Punctuation | Unicat_Mark) - ("(" | ")" | "`" | "'" | "," | "[" | "]") ; NameTeOpKey = "\" | "->" | "=" | "@" ;