我使用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
;
答案 0 :(得分:3)
您使用了以下规则:
expression ('.' expression)+
此规则不适合二进制表达式的语法模式,因此它实际上被视为后缀表达式。特别是,expression
字符后面的.
不再受限于优先级层次结构。您可能受issue #679的影响,但真正的分辨率无论哪种方式都相同。您需要使用以下内容替换此替代方法:
expression '.' expression
ArrayAccessExpression
也是如此,应该写成如下:
expression '[' expression ']' #ArrayAccessExpression