以下测试语法的不同之处仅在于规则“ 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';
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';
答案 0 :(得分:0)
我对问题的第二部分有一个答案,这仍然不能完全让我满意,因为在真正精心设计的语法中使用这种方法将很丑陋。至于第一部分(为什么),我仍然不知道,所以欢迎提供更多答案。
无论如何,要在存在引用规则的情况下固定优先级,可以对“ notExpression”规则进行如下修改:
notExpression: NOT (identifier|expr);
哪个生成的树不同于原始问题中显示的树,但是至少NOT不会获得更高的优先级。 Parse tree