我的 Antlr 4 语法有问题,它似乎忽略了优先级。
对于给定的表达式
$(USD)100'2 * -1
,我希望它首先计算$(USD)100'2
,然后乘以-1。 所以我期望这样的事情:
在我的语法中,我在乘法规则之前定义 finAmount 和 numberLiteral 规则。 似乎这个优先级被忽略了。 这是我的语法:
grammar tst;
root
: expression EOF;
expression
: '$' currencyExpression? expression ('\'' expression)? #expressionFinAmount
| numberLiteral #expressionNonOverloaded04
| stringLiteral #expressionNonOverloaded05
| trueLiteral #expressionNonOverloaded08
| falseLiteral #expressionNonOverloaded09
| '(' expression ')' #expresionParen
| expression op=(MUL|DIV) expression #expressionMulDiv
| expression ADD expression #expressionAdd
| expression SUB expression #expressionSub
| expression op=(
BIGGER|
BIGGER_OR_EQUAL|
SMALLER|
SMALLER_OR_EQUAL)
expression #expressionCompare
| expression op=(EQUAL|NOT_EQUAL) expression #expressionEquals
| expression op=(AND | OR) expression #expressionLogical
;
trueLiteral
: TRUE
;
falseLiteral
: FALSE
;
numberLiteral
: floatLiteral
| wholeLiteral
;
floatLiteral
: FLOATNUM
;
wholeLiteral
: WHOLENUM
;
stringLiteral
: STRING
;
currencyExpression
: '('expression')'
| CURRENCY_LIT
;
//---------------------------------------------------------------------------------
//-- Lexical Rules
//---------------------------------------------------------------------------------
STRING: '"' .*? '"';
AND: 'and';
OR: 'or';
NOT: 'not';
TRUE: 'true';
FALSE: 'false';
FLOATNUM: '-'? DIGIT+ '.' DIGIT+;
WHOLENUM: '-'? DIGIT+;
NULL: 'null';
MUL : '*';
DIV : '/';
ADD : '+';
SUB : '-';
BIGGER: '>';
BIGGER_OR_EQUAL: '>=';
SMALLER: '<';
SMALLER_OR_EQUAL: '<=';
EQUAL: '==';
NOT_EQUAL: '!=';
EQUALASSIGN: '=';
CURRENCY_LIT: '(' [A-Z][A-Z][A-Z] ')'|
'(' [0-9][0-9][0-9] ')';
IDENTIFIER: IDENTIFIERSTART IDENTIFIERPART*;
WS : [ \t\r\n]+ -> channel(HIDDEN); // toss out whitespace
fragment DIGIT: [0-9];
fragment IDENTIFIERSTART:
[a-zA-Z];
fragment IDENTIFIERPART:
[a-zA-Z0-9_];
有人有什么想法吗? 为什么我的表达式的计算结果不为
$(USD)100'2
* -1