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