Antlr 4 语法似乎忽略了定义的优先级

问题描述 投票:0回答:1

我的 Antlr 4 语法有问题,它似乎忽略了优先级。

对于给定的表达式

$(USD)100'2 * -1
,我希望它首先计算
$(USD)100'2
,然后乘以-1。 所以我期望这样的事情: enter image description here

但是我得到以下信息: enter image description here

在我的语法中,我在乘法规则之前定义 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

antlr antlr4
1个回答
0
投票

看起来与使用子规则有关

('\'' expression)

'$' currencyExpression? expression ('\'' expression)?

如果我将表达式语法更改为:

expression
    : '$' currencyExpression? expression'\''expression      #finAmountWithNB10
    | '$' currencyExpression? expression                    #finAmount 

现在正在按照我想要的方式解析:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.