【问题标题】:ANTLR4 different precedence in two seemingly equivalent grammarsANTLR4 两个看似等效的语法中的不同优先级
【发布时间】:2019-11-13 14:38:15
【问题描述】:

以下测试语法的不同之处仅在于规则“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

【问题讨论】:

    标签: antlr4 operator-precedence


    【解决方案1】:

    我的问题的第二部分得到了答案,这仍然不能让我很满意,因为在真正复杂的语法中使用这种方法会很丑陋。至于第一部分(WHY)我还是不知道,欢迎补充。

    无论如何,要在存在引用规则的情况下修复优先级,可以按如下方式修改“notExpression”规则:

    notExpression:  NOT (identifier|expr);
    

    这会产生与原始问题中显示的树不同的树,但至少 NOT 确实获得了更高的优先级。 Parse tree

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2022-01-06
      • 2022-11-09
      • 2016-12-19
      相关资源
      最近更新 更多