options {
STATIC=false;
}
PARSER_BEGIN(calculator)
import java.io.PrintStream ;
public class calculator {
double previousValue = 0.0 ;
public static void main(String args[]) throws ParseException {
calculator parser = new calculator(System.in);
while (true) {
System.out.println("This is an advanced calculator based on the prior .jj embeded in eclipse");
System.out.print("Enter an expression like \"2.0+3.4 \" we support +,-,*,\\,(),sin(),cos(),and number with fraction:");
try {
parser.Start(System.out);
} catch (Exception e) {
System.out.println("NOK.");
System.out.println(e.getMessage());
parser.ReInit(System.in);
} catch (Error e) {
System.out.println("Oops.");
System.out.println(e.getMessage());
break;
}
}
}
}
PARSER_END(calculator)
SKIP :
{
" "
}
TOKEN : { /* OPERATORS */
< PLUS: "+"
>
| < MINUS: "-"
>
| < MULTIPLY: "*"
>
| < DIVIDE: "/"
>
| < LPAREN : "("
>
| < RPAREN : ")"
>
| < NUMBER :
| "." | "." | "." >
| < #DIGITS : (["0"-"9"])+ >
| < SIN: "sin"
>
| < COS: "cos"
>
|
| "\r" | "\r\n" >
}
void Start(PrintStream printStream) :
{}
{
(
previousValue = sum()
{ printStream.println( previousValue ) ; }
)*
}
double sum() : {
double i;
double value=0.0;
}
{
value=term()(i=term() {
value+=i;
}| i=term() {
value-=i;
})*
{return value;}
}
double term() : {
double i;
double value=0.0;
}
{
value = Primary()(i = Primary() {
value *= i ;
}|i = Primary() {
value /= i ;
})*
{ return value ;}
} double Primary() : { Token t ; double value=0.0; } { t= { return Double.parseDouble( t.image ) ; } | value=sum() { return value ; } | value=Primary() { return -value ; } | value=sum() { return java.lang.Math.sin(value); } | value=sum() { return java.lang.Math.cos(value); } }