1 package fri.patterns.interpreter.parsergenerator.examples; 2 3 import fri.patterns.interpreter.parsergenerator.*; 4 import fri.patterns.interpreter.parsergenerator.semantics.*; 5 import fri.patterns.interpreter.parsergenerator.builder.SerializedParser; 6 7 14 15 public class Calculator extends ReflectSemantic 16 { 17 private static String [][] rules = { { "EXPRESSION", "TERM" }, 19 { "EXPRESSION", "EXPRESSION", "'+'", "TERM" }, 20 { "EXPRESSION", "EXPRESSION", "'-'", "TERM" }, 21 { "TERM", "FACTOR", }, 22 { "TERM", "TERM", "'*'", "FACTOR" }, 23 { "TERM", "TERM", "'/'", "FACTOR" }, 24 { "FACTOR", "`number`", }, 25 { "FACTOR", "'-'", "FACTOR" }, { "FACTOR", "'('", "EXPRESSION", "')'" }, 27 { Token.IGNORED, "`whitespaces`" }, 28 }; 29 30 public Object EXPRESSION(Object TERM) { 31 return TERM; } 33 public Object EXPRESSION(Object EXPRESSION, Object operator, Object TERM) { 34 if (operator.equals("+")) 35 return new Double (((Double ) EXPRESSION).doubleValue() + ((Double ) TERM).doubleValue()); 36 return new Double (((Double ) EXPRESSION).doubleValue() - ((Double ) TERM).doubleValue()); 37 } 38 public Object TERM(Object FACTOR) { 39 return FACTOR; } 41 public Object TERM(Object TERM, Object operator, Object FACTOR) { 42 if (operator.equals("*")) 43 return new Double (((Double ) TERM).doubleValue() * ((Double ) FACTOR).doubleValue()); 44 return new Double (((Double ) TERM).doubleValue() / ((Double ) FACTOR).doubleValue()); 45 } 46 public Object FACTOR(Object number) { 47 return Double.valueOf((String ) number); 48 } 49 public Object FACTOR(Object minus, Object FACTOR) { 50 return new Double ( - ((Double ) FACTOR).doubleValue() ); 51 } 52 public Object FACTOR(Object leftParenthesis, Object EXPRESSION, Object rightParenthesis) { 53 return EXPRESSION; 54 } 55 56 57 58 public static void main(String [] args) 59 throws Exception 60 { 61 if (args.length <= 0) { 62 System.err.println("SYNTAX: java "+Calculator.class.getName()+" \"(4+2.3) *(2 - -6) + 3*2\""); 63 System.exit(1); 64 } 65 66 String input = args[0]; 67 for (int i = 1; i < args.length; i++) 68 input = input+" "+args[i]; 69 70 System.err.println("Calculating input >"+input+"<"); 71 72 Parser parser = new SerializedParser().get(rules, "Calculator"); 73 boolean ok = parser.parse(input, new Calculator()); 74 System.err.println("Parse return "+ok+", result: "+parser.getResult()); 75 76 85 } 86 87 } 88 | Popular Tags |