PARSER_BEGIN(calc)
public class calc {
    public static void main(String args[]) throws ParseException {
        int result;
        calc parser = new calc(System.in);
        result = parser.complete_expression();
        System.out.println("Expression value = " + result);
    }
}
PARSER_END(calc)

SKIP : 
{
        " "
}

TOKEN : 
{
        < INTEGER_LITERAL: (["0"-"9"])+ >
|       < PLUS:  "+"    >
|       < MINUS:  "-"   >
|       < MULTIPLY:  "*">
|       < DIVIDE:  "/"  >
|       < LPAREN: "("   >
|       < RPAREN: ")"   >
|       < EOL: "\n" >
}

int complete_expression():
{ int result; }
{
  result = expression() <EOL> { return result; }
}

int expression():
{Token t; int result; int rhs;}
{
   result = term() ((t = <PLUS> |t =  <MINUS>) rhs = term()
                {  if (t.kind == PLUS)
                       result = result + rhs;
                    else
                       result = result - rhs;
                }
      )* { return result; }
}

int term():
{Token t; int result; int rhs;}
{
  result = factor() ( (t = <MULTIPLY> | t = <DIVIDE>) rhs = factor()
                {  if (t.kind == MULTIPLY)
                       result = result * rhs;
                    else
                       result = result / rhs;
                }
                  )*
        { return result; }
}

int factor():
{int value; Token t;}
{
    <MINUS> value = factor() { return 0 - value; }
|    t = <INTEGER_LITERAL> { return Integer.parseInt(t.image); }
|   <LPAREN> value = expression() <RPAREN> { return value; }
}