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