My grammar has these rules
expression : expression EQ conditionalOrExpression #eqExpr | expression NEQ conditionalOrExpression #neqExpr | expression LT conditionalOrExpression #ltExpr | expression GT conditionalOrExpression #gtExpr | expression LTEQ conditionalOrExpression #lteqExpr | expression GTEQ conditionalOrExpression #gteqExpr | conditionalOrExpression #next ; conditionalOrExpression : conditionalOrExpression OR conditionalAndExpression #orExpr | conditionalAndExpression #and ; conditionalAndExpression : conditionalAndExpression AND additiveExpression #andExpr | additiveExpression #add ; additiveExpression : additiveExpression PLUS multiplicativeExpression #plusExpr | additiveExpression MINUS multiplicativeExpression #minusExpr | multiplicativeExpression #multiplicative ; multiplicativeExpression : multiplicativeExpression MULT unaryExpression #multExpr | multiplicativeExpression DIV unaryExpression #divExpr | unaryExpression #unary ; unaryExpression : MINUS unaryExpression #unaryMinusExpr | NOT unaryExpression #notExpr | atom #atomExpr ; function : ID OPAR (parameter (',' parameter)*)? CPAR ; parameter : STRING #stringParameter | expression #exprParameter ; atom : OPAR expression CPAR #parExpr | (INT | FLOAT) #numberAtom | (TRUE | FALSE) #booleanAtom | ID #idAtom | function #functionAtom ;
I have implemented the appropriate visitor.
If I evaluate "40 + 10 - (2 * 40) + (100/40) + 0.2", the result is -32.7. This is because the expression evaluates to
(40+10) - (((2*40) + (100/40)) + 0.2)
which makes sense in accordance with the rules (PLUS to MINUS).
However, if I evaluate the same expression in Excel or, for example, assign it to a double in C #, in both cases the result is -27.3. This is because they rate the rule as
(((40+10)-(2*40)) + (100/40)) + 0.2
So what is "right"? -32.7 is technically correct, as it dictates the rules. But how to change the grammar according to the results in Excel / C #?
Xbond source share