ssheet.cup.listing

package edu.odu.cs.espreadsheet.expressions;

/* Terminals (tokens returned by the scanner). */
terminal String    PLUS, MINUS, TIMES, DIVIDES;
terminal String    EQUALS, NOTEQUALS, LESS, GREATER, LESS_EQ, GREATER_EQ;
terminal String    ASSIGNMENT, LPAREN, RPAREN;
terminal String    NUMERIC_LITERAL;        
terminal String    STRING_LITERAL;        
terminal String    CELLNAME_LITERAL;  

/* Non terminals */
non terminal Expression    assignment;
non terminal Expression    expr, base, term, factor, item, simple;      
non terminal Expression    baseExpression;      

/* Precedences */
precedence nonassoc ASSIGNMENT;




/* The grammar rules */
baseExpression ::= expr:e      {: RESULT = e; :} 
                | assignment:e   {: RESULT = e; :} ;
expr ::= expr:left EQUALS base:right                 {: RESULT = new EqualOp (left, right); :}
       | expr:left NOTEQUALS base:right              {: RESULT = new NotEqualOp (left, right); :}
       | expr:left LESS base:right                   {: RESULT = new LessOp (left, right); :}
       | expr:left LESS_EQ base:right                {: RESULT = new LessEqOp (left, right); :}
       | expr:left GREATER base:right                {: RESULT = new GreaterOp (left, right); :}
       | expr:left GREATER_EQ base:right              {: RESULT = new GreaterEqOp (left, right); :}
       | base:b                                            {: RESULT = b; :} ;
base ::= base:left PLUS term:right                          {: RESULT = new PlusOp(left, right); :}
      | base:left MINUS term:right                         {: RESULT = new MinusOp(left, right); :}
      | term:t                                             {: RESULT = t; :} ;
term ::= term:left TIMES factor:right                         {: RESULT = new TimesOp(left, right); :}
      | term:left DIVIDES factor:right                       {: RESULT = new DividesOp(left, right); :}
      | factor:f                                             {: RESULT = f; :} ;
factor ::= MINUS item:i                                     {: RESULT = new NegateOp(i); :}
       |  item:i                                           {: RESULT = i; :} ;
item ::= LPAREN expr:e RPAREN                             {: RESULT = e; :}
       |  simple:s                                        {: RESULT = s; :} ;
simple ::=  NUMERIC_LITERAL:literal                     {: RESULT = new NumericLiteral (literal); :} 
       |  STRING_LITERAL:literal                   {: RESULT = new StringLiteral (literal); :}
;
assignment ::= CELLNAME_LITERAL:left ASSIGNMENT expr:right {: RESULT = new AssignmentOp (
                                                                  new CellNameLiteral((String)left), 
                                                                  right); :} ;

unformatted source