import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.BailErrorStrategy; //import org.antlr.v4.runtime.ANTLRErrorStrategy; import java.io.*; import java.util.*; import java.lang.*; public class WAE { static boolean evalError = false; static public void main(String argv[]) { System.out.print("WAE> "); do { String input = readInput().trim(); if (input.equals("exit")) break; else input += ";"; try { CharStream in = CharStreams.fromString(input); WAELexer lexer = new WAELexer(in); CommonTokenStream tokens = new CommonTokenStream(lexer); WAEParser parser = new WAEParser(tokens); parser.setErrorHandler(new BailErrorStrategy()); WAENode tree = (WAENode) parser.waeStart().value; //Integer level = new Integer(1); //displayTree(tree,level); evalError = false; double answer = evalTree(tree); if (evalError) System.out.println("\nEVALUATION ERROR\n"); else System.out.println("\nThe value is "+answer+"\n"); } catch (Exception e) { System.out.println("\nSYNTAX ERROR\n"); //e.printStackTrace(); } } while (true); } static double evalTree(WAENode t) { if (t.getNodeType().equals("num")) { return t.getValue(); } else if (t.getNodeType().equals("plus")) { double v1 = evalTree(t.getChild1()); if (evalError) return 0; double v2 = evalTree(t.getChild2()); if (evalError) return 0; return v1+v2; } else if (t.getNodeType().equals("minus")) { double v1 = evalTree(t.getChild1()); if (evalError) return 0; double v2 = evalTree(t.getChild2()); if (evalError) return 0; return v1-v2; } else if (t.getNodeType().equals("multiply")) { double v1 = evalTree(t.getChild1()); if (evalError) return 0; double v2 = evalTree(t.getChild2()); if (evalError) return 0; return v1*v2; } else if (t.getNodeType().equals("divide")) { double v1 = evalTree(t.getChild1()); if (evalError) return 0; double v2 = evalTree(t.getChild2()); if (evalError) return 0; if (v2 != 0) return v1/v2; else { evalError = true; return 0; } } else if (t.getNodeType().equals("if")) { double v1 = evalTree(t.getChild1()); if (evalError) return 0; if (v1 != 0) return evalTree(t.getChild2()); else return evalTree(t.getChild3()); } else { evalError = true; return 0; } } static void displayTree(WAENode t,Integer level) { for (int i=1; i "); System.out.flush(); } c = System.in.read(); } return buffer.toString().trim(); } catch (IOException e) { return ""; } } }