skip WHITESPACE '\s+' token OP '\+|-' token MOP '\*|/' token NUM '[0-9]+' % ::= ::= **= ::= **= ::= % Start %%{ public void $run() { System.out.println(exp.calculate()); } %%} Exp %%{ public int calculate() { int x = mult.calculate(); return exprest.calculate(x); } %%} Exprest %%{ public int calculate(int resultSoFar) { Iterator opIt = opList.iterator(); Iterator multIt = multList.iterator(); while(opIt.hasNext()) { String op = opIt.next().toString(); int n = multIt.next().calculate(); switch(op) { case "+": resultSoFar += n; break; case "-": resultSoFar -= n; break; } } return resultSoFar; } %%} Mult %%{ public int calculate() { int x = value.getValue(); return multrest.calculate(x); } %%} Multrest %%{ public int calculate(int resultSoFar) { Iterator mopIt = mopList.iterator(); Iterator valueIt = valueList.iterator(); while(mopIt.hasNext()) { String op = mopIt.next().toString(); int n = valueIt.next().getValue(); switch(op) { case "*": resultSoFar *= n; break; case "/": resultSoFar /= n; break; } } return resultSoFar; } %%} Value %%{ public int getValue() { return Integer.parseInt(num.toString()); } %%}