options{ //DEBUG_PARSER = true; DEBUG_TOKEN_MANAGER = true; } PARSER_BEGIN(Calculator) import java.util.HashMap; public class Calculator { private static HashMap variables = new HashMap(); public static void main(String[] args) { Calculator parser = new Calculator(System.in); while (true){ System.out.print("Type your expression: "); try{ double value = parser.evaluateNextLine(); System.out.println("Returned: " + value); }catch (ParseException e){ System.out.println(e.getMessage()); try{ parser.passStatement(); // wiping the tokens of the malformed expression }catch (ParseException ex){ System.out.println(ex.getMessage()); } } } } } PARSER_END(Calculator) SKIP : { " "|"\t" } TOKEN : { | | | | | | | | | | } double statement() : { Token id; double i = 0.0; } { { System.exit(0); }| i=expression() { return i; }| id= i=expression() { variables.put(id.image,i); //Storing the variable return i; } } double expression() : { Token op = null; double l = 0.0; double r = 0.0; } { l=term() ((op= | op=) r=term() { // folding everything in the l variable if (op != null){ if (op.image.equals("+")) l += r; else l -= r; } } )* { //returning the parsed value return l; } } double term() : { Token op = null; double l = 0.0; double r = 0.0; } { l=factor() ((op=
| op=) r=factor() { // folding everything in the l variable if (op != null){ if (op.image.equals("/")) l /= r; else l *= r; } } )* { //returning the parsed value return l; } } double factor() : { Token t = null; Token id = null; double i = 0.0; } { (t= | id= | (i=expression())? ) { if(id != null){ Object var = variables.get(id.image); if (var != null) i = (double) var; else throw new ParseException("'" + id.image + "' is not yet defined."); }else if(t != null) i = Double.parseDouble(t.image); return i; }| (t= | id= | (i=expression())? ) { if(id != null){ i = (double)variables.get(id.image); }else if(t != null) i = Double.parseDouble(t.image); return i*(-1); } } double evaluateNextLine() : { double result = 0.0; } { (result=statement())? {return result;}| {System.out.println("\nBuffer was closed. Exiting."); System.exit(0);} } void passStatement() : {} { | {System.out.println("\nBuffer was closed. Exiting."); System.exit(0);} }