ANTLR4在两个看似等效的语法中具有不同的优先级

时间:2019-07-02 23:15:18

标签: antlr4 operator-precedence

以下测试语法的不同之处仅在于规则“ expr”的第一个替代项是内联指定的,或引用具有相同定义的另一个规则“ notExpression”。但是这个语法产生了不同的树来解析: a&b'。为什么?

我真的希望语法产生第一个结果(不与标识符相关联,而不与AND表达式相关联),但仍然需要在我的真实语法中使用“ expr”引用“ notExpression”。我必须更改什么?

grammar test;
s: expr ';' <EOF>;
expr:
    NOT expr
    | left=expr AND right=expr
    | identifier
    ;
identifier: LETTER (LETTER)*;
WS  :  ' '+ ->skip;
NOT: '!';
AND: '&';
LETTER: 'A'..'z';

Tree one

grammar test;
s: expr ';' <EOF>;
expr:
    notExpression
    | left=expr AND right=expr
    | identifier
    ;
notExpression:  NOT expr;
identifier: LETTER (LETTER)*;
WS  :  ' '+ ->skip;
NOT: '!';
AND: '&';
LETTER: 'A'..'z';

Tree two

1 个答案:

答案 0 :(得分:0)

我对问题的第二部分有一个答案,这仍然不能完全让我满意,因为在真正精心设计的语法中使用这种方法将很丑陋。至于第一部分(为什么),我仍然不知道,所以欢迎提供更多答案。

无论如何,要在存在引用规则的情况下固定优先级,可以对“ notExpression”规则进行如下修改:

notExpression:  NOT (identifier|expr);

哪个生成的树不同于原始问题中显示的树,但是至少NOT不会获得更高的优先级。 Parse tree