Ocaml { Exp = let rec ident Argument* eq Exp in Exp -- letrec | let ident Argument* eq Exp in Exp -- let | fun Argument+ rarrow Exp -- fun | if Exp then Exp else Exp -- if | ExpPresOne -- infix ExpPresOne = ExpPresOne comma ExpPresTwo -- pair | ExpPresTwo ExpPresTwo = ExpPresTwo "||" ExpPresThree -- or | ExpPresThree ExpPresThree = ExpPresThree "&&" ExpPresFour -- and | ExpPresFour ExpPresFour = ExpPresFour "|>" ExpPresFive -- revapp | ExpPresFour "<>" ExpPresFive -- neq | ExpPresFour eq eq ExpPresFive -- pheq | ExpPresFour eq ExpPresFive -- eq | ExpPresFour "!" eq ExpPresFive -- npheq | ExpPresFour "<" eq ExpPresFive -- lte | ExpPresFour ">" eq ExpPresFive -- gte | ExpPresFour "<" ExpPresFive -- lt | ExpPresFour ">" ExpPresFive -- gt | ExpPresFive ExpPresFive = ExpPresFive "@@" ExpPresSixA -- app | ExpPresSixA ExpPresSixA = ExpPresSixA cons ExpPresSixB -- cons | ExpPresSixB ExpPresSixB = ExpPresSixB "-" ExpPresSeven -- sub | ExpPresSeven ExpPresSeven = ExpPresSeven "+" ExpPresEight -- plus | ExpPresEight ExpPresEight = ExpPresEight "*" ExpPresNine -- mult | ExpPresEight "mod" ExpPresNine -- mod | ExpPresNine ExpPresNine = ExpPresNine "/" ExpPresNine -- div | "+" Argument -- unadd | "-" Argument -- unneg | ExpPresTen ExpPresTen = ExpPresTen Argument+ -- app | Argument -- arg let = "let" rec = "rec" eq = "=" in = "in" if = "if" then = "then" else = "else" cons = "::" comma = "," lbracket = "(" rbracket = ")" rarrow = "->" fun = "fun" keyword = let | rec | fun | eq | in | if | then | else | cons | comma | lbracket | rbracket | infixoptoken | unnop letterkeywords = let | rec | fun | rarrow | in | if | then | else | "mod" | "hd" | "tl" | "failwith" | "not" | "~-" | "~+" | "succ" | "pred" | "abs" | "fst" | "snd" | "empty" | "fold_right" | "fold_left" | "min" | "max" Argument = | lbracket Exp rbracket -- argbracket | lbracket infixoptoken rbracket -- infixbracket | number -- num | List -- list | bool -- bool | "MAX_INT" -- maxint | "MIN_INT" -- minint | "\"" char+ "\"" -- string | unnop -- unnop | ident char = "\\\"" | (~"\"" any) bool = "true" | "false" List = "[" "]" -- emptylist | "[" ListElems "]" -- nonemptylist ListElems = Exp ";" ListElems -- head | Exp -- end infixoptoken = "||" -- or | "&&" -- and | "|>" -- revapp | "<>" -- neq | eq eq -- pheq | eq -- eq | "!" eq -- npheq | "<" eq -- lte | ">" -- gte | "<" -- lt | ">" -- gt | "@@" -- app | cons -- cons | "-" -- sub | "+" -- plus | "*" -- mult | "mod" -- mod | "/" -- div unnop = "hd" | "tl" | "failwith" | "not" | "~-" | "~+" | "succ" | "pred" | "abs" | "fst" | "snd" | "empty" | "fold_right" | "fold_left" | "min" | "max" ident (an identifier) = letterkeywords lower alnum* (underscore alnum*)* -- key | ~letterkeywords lower alnum* (underscore alnum*)* -- nokey underscore = "_" number (a number) = digit+ -- whole }