/******************************************************************************** * * File: calc.gen * Title: The calculator parser * Programmer: Leonidas Fegaras, UTA * Date: 1/10/03 * ********************************************************************************/ import java_cup.runtime.*; /* Terminals (tokens returned by the scanner). */ terminal LP, RP, COMMA, SEMI, ASSIGN, IF, THEN, ELSE, AND, OR, NOT, QUIT, PLUS, TIMES, MINUS, DIV, EQ, LT, GT, LE, NE, GE, FALSE, TRUE, DEFINE; terminal String ID; terminal Integer INT; terminal Float REALN; terminal String STRINGT; non terminal Ast exp, string, name; non terminal Arguments expl, names; non terminal item, prog; precedence nonassoc ELSE; precedence right OR; precedence right AND; precedence nonassoc NOT; precedence left EQ, LT, GT, LE, GE, NE; precedence left PLUS, MINUS; precedence left TIMES, DIV; start with prog; prog ::= item SEMI {: :} | prog item SEMI {: :} ; item ::= exp:e {: System.out.println(Eval.evaluate(e)); System.out.print("> "); :} | QUIT {: System.out.println("Bye bye!"); System.exit(0); :} | ID:v ASSIGN exp:e {: Eval.assign(v,Eval.evaluate(e)); System.out.print("> "); :} | DEFINE ID:v LP names:nl RP EQ exp:e {: Eval.define(v,nl,e); System.out.print("> "); :} ; name ::= ID:v {: RESULT = new Variable(v); :} ; string ::= STRINGT:s {: RESULT = new Astring(s); :} ; exp ::= INT:n {: RESULT = new Number(n.intValue()); :} | REALN:n {: RESULT = new Real(n.floatValue()); :} | TRUE {: RESULT = new Variable("true"); :} | FALSE {: RESULT = new Variable("false"); :} | name:nm {: RESULT = nm; :} | string:s {: RESULT = s; :} | LP exp:e RP {: RESULT = e; :} | IF exp:c THEN exp:t ELSE exp:e {: RESULT = #; :} | exp:e1 EQ exp:e2 {: RESULT = #; :} | exp:e1 LT exp:e2 {: RESULT = #; :} | exp:e1 GT exp:e2 {: RESULT = #; :} | exp:e1 LE exp:e2 {: RESULT = #; :} | exp:e1 NE exp:e2 {: RESULT = #; :} | exp:e1 GE exp:e2 {: RESULT = #; :} | exp:e1 PLUS exp:e2 {: RESULT = #; :} | exp:e1 MINUS exp:e2 {: RESULT = #; :} | exp:e1 TIMES exp:e2 {: RESULT = #; :} | exp:e1 DIV exp:e2 {: RESULT = #; :} | exp:e1 OR exp:e2 {: RESULT = #; :} | exp:e1 AND exp:e2 {: RESULT = #; :} | NOT exp:e {: RESULT = #; :} | name:nm LP expl:el RP {: RESULT = #; :} ; expl ::= expl:el COMMA exp:e {: RESULT = el.append(e); :} | exp:e {: RESULT = new Arguments(e); :} ; names ::= names:nl COMMA name:n {: RESULT = nl.append(n); :} | name:n {: RESULT = new Arguments(n); :} ;