Antlr评估订单问题

时间:2014-08-26 19:49:28

标签: antlr antlr4

我使用Antlr 4为脚本语言

定义了以下表达式规则

基本上我正在尝试评估

x = y.z.aa * 6

正确的评估顺序应该是y.z然后y.z.aa然后它是6; ((y.z).aa)* 6

然而,在解析aa * 6之后首先评估,然后z。(aa * 6)然后y。(z。(aa * 6)),它变成 y。(z。(aa * 6))

方括号评估正确 x = y [z] [aa] * 6

任何人都可以帮助指出我在点访问规则中做错了什么吗?

非常感谢

expression
:   primary                             #PrimaryExpression
|   expression ('.' expression ) +      #DotAccessExpression
|   expression ('[' expression ']')+    #ArrayAccessExpression
|   expression ('*'|'/') expression     #MulExpression
|   expression ('+'|'-') expression     #AddExpression   
;

primary
:   '(' expression ')'
|   literal   
|   ident
;

literal
:   NUMBER        
|   STRING
|   NULL
|   TRUE
|   FALSE            
;

1 个答案:

答案 0 :(得分:3)

您使用了以下规则:

expression ('.' expression)+

此规则不适合二进制表达式的语法模式,因此它实际上被视为后缀表达式。特别是,expression字符后面的.不再受限于优先级层次结构。您可能issue #679的影响,但真正的分辨率无论哪种方式都相同。您需要使用以下内容替换此替代方法:

expression '.' expression

ArrayAccessExpression也是如此,应该写成如下:

expression '[' expression ']' #ArrayAccessExpression