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
© 2015-2019, Old Dominion Univ.