options { STATIC = false; // LOOKAHEAD = 2; } PARSER_BEGIN(WhileParser) class WhileParser { public static void main(String[] args) throws ParseException, TokenMgrError { WhileParser parser = new WhileParser(System.in); parser.Start(); } } PARSER_END(WhileParser) SKIP : { " " | "\t" | "\n" | "\r" | < "//"(~["\n", "\r"])* ("\n" | "\r" | "\r\n")> } TOKEN : { < INTLIT: "0" | ["1"-"9"](["0"-"9"])* > } TOKEN : { < STRLIT: "\"" (~["\"", "\n", "\r"])* "\"" > } TOKEN : { < NUMBER: (["0"-"9"])+ > } TOKEN : { < IF: "if" > } TOKEN : { < ELSE: "else" > } TOKEN : { < WHILE: "while" > } TOKEN : { < PRINTLN: "println" > } TOKEN : { < ID: <LETTER> (<LETTER> | ["0"-"9"])* > | < #LETTER: ["A"-"Z","a"-"z","_"] > } void Start() : {} { (Statement())* <EOF> } void Statement() : {} { Print() | Assign() | If() | While() | Block() } void Print() : {} { <PRINTLN> "(" <STRLIT> "," <ID> ")" ";" } void Assign() : {} { <ID> "=" Expr() ";" } void If() : {} { <IF> "(" Expr() ")" Statement() <ELSE> Statement() } void While() : {} { <WHILE> "(" Expr() ")" Statement() } void Block() : {} { "{" (Statement())* "}" } void Expr() : {} { EqExpr() (("&&" | "||") EqExpr())* } void EqExpr() : {} { CompExpr() ("==" CompExpr())* } void CompExpr() : {} { AddExpr() (("<" | ">") AddExpr())* } void AddExpr() : {} { FactExpr() (("+" | "-") FactExpr())* } void FactExpr() : {} { PrimaryExpr() (("*" | "/" | "%") PrimaryExpr())* } void PrimaryExpr() : {} { "(" Expr() ")" | <ID> | <INTLIT> | ("-" | "!") PrimaryExpr() }