public class Parser { static Token nextToken; static Lexer l; // expr // Parses strings in the language generated by the rule: // -> {(+ | -) } public static void expr() { System.out.println("Enter "); term(); while ((nextToken.getTokenID() == TokenTypes.ADD_OP) || (nextToken.getTokenID() == TokenTypes.SUB_OP)) { nextToken = l.lex(); term(); } System.out.println("Exit "); } // term // Parses strings in the language generated by the rule: // -> {(* | /) } public static void term() { System.out.println("Enter "); factor(); while ((nextToken.getTokenID() == TokenTypes.MULT_OP) || (nextToken.getTokenID() == TokenTypes.DIV_OP)) { nextToken = l.lex(); factor(); } System.out.println("Exit "); } // factor // Parses strings in the language generated by the rule: // -> id | int_constant | ( ) public static void factor() { System.out.println("Enter "); if ((nextToken.getTokenID() == TokenTypes.IDENT) || (nextToken.getTokenID() == TokenTypes.INT_LIT)) nextToken = l.lex(); else { // if the RHS is ( ), pass over (, call expr, check for ) if (nextToken.getTokenID() == TokenTypes.LPAREN) { nextToken = l.lex(); expr(); if (nextToken.getTokenID() == TokenTypes.RPAREN) nextToken = l.lex(); else { error("Expecting RPAREN"); System.exit(-1); } } else { error("Expecting LPAREN"); System.exit(-1); } } System.out.println("Exit "); } public static void error(String s) { System.out.println("SYNTAX ERROR: "+s); } public static void main(String args[]) { l = new Lexer(args[0]); nextToken = l.lex(); expr(); } }