options { OUTPUT_DIRECTORY="src"; DEBUG_PARSER=false; } PARSER_BEGIN(SimpleCalculator) import java.io.*; public class SimpleCalculator { public static void main(String[] args) { Reader sr = new InputStreamReader(System.in); SimpleCalculator calc = new SimpleCalculator(sr); try { for (;;) { System.out.print("\nExpression? "); double value = calc.calculate(); System.out.println("= " + value); } } catch (Exception ex) { ex.printStackTrace(); } } } PARSER_END(SimpleCalculator) SKIP : { } TOKEN : { )+> | | | | | | | | <#DIGIT : ["0"-"9"]> } double calculate() throws NumberFormatException : { double v; } { v = expression() { return v; } } double expression() throws NumberFormatException : { double v; } { v = simpleExpr() { return v; } } double simpleExpr() throws NumberFormatException : { double v, value; } { value = term() ( v = term() { value += v; } | v = term() { value -= v; } )* { return value; } } double term() throws NumberFormatException : { double v, value; } { value = factor() ( v = factor() { value *= v; } | v = factor() { value /= v; } )* { return value; } } double factor() throws NumberFormatException : { double value; } { value = primary() { return value; } | value = factor() { return -value; } | value = expression() { return value; } } double primary() throws NumberFormatException : { Token t; } { t = { return Double.parseDouble(t.image); } }