options{
STATIC = false;
}
PARSER_BEGIN(Calculator)
package javacc;
import java.io.PrintStream;
public class Calculator{
double previousValue = 0.0;
public static void main(String[]args)throws ParseException, TokenMgrError, NumberFormatException{
Calculator parser = new Calculator(System.in);
parser.start(System.out);
}
}
PARSER_END(Calculator)
SKIP:{
" "
}
TOKEN:{
<EOL:"\n"
| "\r"
| "\r\n">
}
TOKEN:{
<PLUS:"+">
}
TOKEN:{
<MINUS:"-">
}
TOKEN:{
<TIMES:"*">
}
TOKEN:{
<DIVIDE:"/">
}
TOKEN:{
<OPEN_PAR:"(">
}
TOKEN:{
<CLOSE_PAR:")">
}
TOKEN:{
<PREVIOUS:"$">
}
TOKEN:{
<NUMBER:<DIGITS>
| <DIGITS>"."<DIGITS>
| <DIGITS>"."
| "."<DIGITS>>
}
TOKEN:{
<DIGITS:(["0"-"9"])+>
}
TOKEN:{
<END:"#">
}
void start(PrintStream ps):{}{
(previousValue = expression(){
ps.println(previousValue);
}
)*<END>
}
double expression()throws NumberFormatException:{
double i;
double value;
}
{
value = term()(<PLUS>i = term(){
value+=i;
}
| <MINUS>i = term(){
value-=i;
}
)*{
return value;
}
}
double primary()throws NumberFormatException:{
Token t;
double d;
}
{
t = <NUMBER>{
return Double.parseDouble(t.image);
}
| <PREVIOUS>{
return previousValue;
}
| <OPEN_PAR>d = expression()<CLOSE_PAR>{
return d;
}
<MINUS>d = primary(){
return d;
}
}
double term()throws NumberFormatException:{
double i;
double value;
}
{
value = primary()(<TIMES>i = primary(){
value*=i;
}
| <DIVIDE>i = primary(){
value/=i;
}
)*{
return value;
}
}