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