// polynomial ::= term ("+" term)* def parsePolynomial = { parseTerm while (lex.current==PLUS) { lex.next parseTerm } } // term ::= factor ("*" factor)* def parseTerm = { parseFactor while (lex.current==MUL) { lex.next parseFactor } } // factor ::= constant | variable | "(" polynomial ")" def parseFactor = { if (lex.current==CONST) lex.next else if (lex.current==IDENT) lex.next else if (lex.current==OPAREN) { lex.next parsePolynomial eat(CPAREN) } else error("Expected const, ident, or open paren") } } def eat(t : Token) = { if (lex.current==t) lex.next else error("Expected token " + t) }