Antlr评估顺序



我使用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            
;

您使用了以下规则:

expression ('.' expression)+

此规则不符合二进制表达式的语法模式,因此它实际上被视为后缀表达。特别地,.字符后面的expression不再被限制在优先级层次结构中。您可能会受到#679问题的额外影响,但实际解决方案是相同的。您需要将此替代方案替换为以下选项:

expression '.' expression

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

expression '[' expression ']' #ArrayAccessExpression

相关内容

  • 没有找到相关文章

最新更新