AnTLR4奇怪的行为优先

  • 本文关键字:AnTLR4 antlr grammar antlr4
  • 更新时间 :
  • 英文 :


我有一个非常简单的测试语法如下:

grammar Test;
statement: expression EOF;
expression
    :   Identifier
        |   expression binary_op expression
        |   expression assignment_operator expression
        |   expression '.' Identifier 
    ;
binary_op: '+';
assignment_operator : '='  ;
Identifier : [a-zA-Z]+ ;
WS : [ nrt]+ -> channel(HIDDEN) ;
使用这个版本的语法,如果我编写以下代码,我就得到了预期的行为:
b.x + b.y 
我得到的树是(+ (. b x) (. b y))

然而,如果我用expression '+' expression代替expression binary_op expression,我得到一个非常不同的树:(. (+ (. b x) b) y)

对此有什么解释吗?

谢谢

你必须像这样设置优先级:

expr  : expr2 (assignment_operator expr3)?  # Equals
expr2 : expr1 (binary_op expr2)?            # Add
expr1 : Identifier | 
        expr1 . Identifier
      ;

解析器中的字面量可能会混淆问题。检查并修复生成解析器时报告的错误/警告。可能需要将文本从解析器规则移动到词法分析器规则。

您可以通过转储令牌流来验证词法分析器是否按预期操作。这将为理解解析器所采用的路径提供一个清晰的基础。

您列出的两种解析树表示看起来都不适合Antlr4解析树。尽管如此,我尝试了你的语法的两种变体,我总是得到:

标记转储:

Identifier: [@0,0:0='b',<4>,1:0]
Dot: [@1,1:1='.',<3>,1:1]
Identifier: [@2,2:2='x',<4>,1:2]
null: [@4,4:4='+',<1>,1:4]
Identifier: [@6,6:6='b',<4>,1:6]
Dot: [@7,7:7='.',<3>,1:7]
Identifier: [@8,8:8='y',<4>,1:8]

树倾倒:

(statement (expression (expression (expression (expression b) . x) + (expression b)) . y) <EOF>)
使用

ParseTree tree = parser.statement();
System.out.print(tree.toStringTree(parser));

这个特殊标记转储中的null s是因为符号首先在解析器中定义。

相关内容

  • 没有找到相关文章

最新更新