|
Calculator.grm
|
// FILE. . . . . /home/hak/ilt/doc/ilog/jacc/Calculator.grm // EDIT BY . . . Hassan Ait-Kaci // ON MACHINE. . Latitude407.Ilog.Biz // STARTED ON. . Tue Dec 14 18:19:32 2004 // Last modified on Mon Dec 20 18:36:18 2004 by hak
| This is a grammar for a simple arithmetic calculator. |
%import java.util.HashMap;
%access public
%start Session
%root Expression
%root Definition
%token NUMBER IDENTIFIER
%left '+' '-'
%left '*' '/'
%right UMINUS
%{
HashMap defs = new HashMap();
%}
%nodeprefix "Calculator"
%nodesuffix ""
%nodeclass public Definition implements Cloneable
{
private String message;
public String getMessage()
{
return message;
}
public void setMessage(String msg)
{
message = msg;
}
}
%%
Session
: Actions Exit
;
Actions
: /* empty */
| Actions Action
;
| An action is either an expression, a definition, or an error, followed by a semicolon. |
Action
: Expression
{
currentNode().show(); // show the current parse tree
if (!Double.isNaN($1.nvalue())) System.out.println($1.nvalue());
CalculatorTokenizer.prompt();
}
';'
| Definition
{
currentNode().show(); // show the current parse tree
System.out.println($1.getMessage());
CalculatorTokenizer.prompt();
}
';'
| error
{
errorManager().reportErrors(true);
CalculatorTokenizer.prompt();
} ';'
;
| An expression is one of the following forms: |
Expression
:
| An identifier is an expression. |
IDENTIFIER
{
Double value = (Double)defs.get($1.svalue());
if (value == null)
System.out.println("*** Undefined identifier: "+$1.svalue());
else
$$.setNvalue(value.doubleValue());
}
|
| A number is an expression. |
NUMBER
|
| An addition is an expression. |
Expression '+' Expression
{
$$.setNvalue($1.nvalue() + $3.nvalue());
}
|
| A subtraction is an expression. |
Expression '-' Expression
{
$$.setNvalue($1.nvalue() - $3.nvalue());
}
|
| A multiplication is an expression. |
Expression '*' Expression
{
$$.setNvalue($1.nvalue() * $3.nvalue());
}
|
| A division is an expression. |
Expression '/' Expression
{
$$.setNvalue($1.nvalue() / $3.nvalue());
}
|
| A negative expression is an expression. |
'-' Expression %prec UMINUS
{
$$.setNvalue(- $2.nvalue());
}
|
| A parenthesized expression is an expression. |
'(' Expression ')'
{
$$.setNvalue($2.nvalue());
}
;
| A definition stores the value of an expression as an identifier. |
Definition
: IDENTIFIER '=' Expression
{
defs.put($1.svalue(),new Double($3.nvalue()));
$$.setNvalue($3.nvalue());
$$.setSvalue($1.svalue());
$$.setMessage("*** Defined "+$$.svalue()+" ("+$$.nvalue()+")");
}
;
| Action for exiting the calculator. |
Exit
: 'exit'
{
System.out.println("*** Bye bye!...");
System.exit(0);
} ';'
;
This file was generated on Mon Dec 20 19:03:12 PST 2004 from file Calculator.grm
by the ilog.language.tools.Hilite Java tool written by Hassan Aït-Kaci