/* FP */ identifier := "[A-Za-z_'$][A-Za-z0-9_'$]*" number := "[0-9]+" string := "\"(\\.|[^\"])+\"" whitespace := "[ \t\n\r]+|(#[^\n]*)" program -> definition ... definition -> "def" id = identifier "=" exp = expression : #sx(list (car id) exp) expression -> exp1 exp1 ... exp1 -> "while" exp2 exp1 | exp2 "->" exp2 [";" exp1] | exp2 exp2 -> exp3 (operator1 exp2) ... exp3 -> exp4 (operator2 exp3) ... exp4 -> exp5 (operator3 exp4) ... exp5 -> exp6 "." exp5 | exp6 exp6 -> value (operator4 exp6) ... operator1 -> "&" | "|" operator2 -> ">=" | "<=" | "==" | "!=" | ">" | "<" operator3 -> "+" | "-" operator4 -> "*" | "%" value -> constant | "def" ~ | identifier | "/" value | "\\" value | "@" value | "[" "]" | "[" expression ("," expression) ... "]" | "(" (operator1 | operator2 | operator3 | operator4) ")" | "(" expression ")" constant -> number | string | "<" constant ("," constant) ... ">" start -> program