Antlr树行者找不到令牌?

Antlr树行者找不到令牌?,antlr,antlr3,Antlr,Antlr3,我有一个解析器和一个AST。现在我想要一个树蜡。在AST中有一个标记“=” Treewalker应该在以下位置找到“=”标记: relationalExpression : (numericExpression) ( (^(EQUAL relationalExpression)) | (^(NOT_EQUAL relationalExpression)) )? ; 尽管最上面的标记应该是“=”

我有一个解析器和一个AST。现在我想要一个树蜡。在AST中有一个标记“=”

Treewalker应该在以下位置找到“=”标记:

relationalExpression
: (numericExpression) (     (^(EQUAL relationalExpression))   
                        | (^(NOT_EQUAL relationalExpression)) 
                  )? 
;
尽管最上面的标记应该是“=”或“!=”,但编译器只是查看“numericExpression”并发现它不是“=”标记。最后,它会导致错误“在输入“=”时没有可行的替代方案”

所以“=”是解析器的顶级标记,但不是treewalker的

这里怎么了


非常感谢

您可能想以树状形式编写
关系表达式
,其中
数值表达式
很可能是
相等的子表达式,而不是它的兄弟

// tree parser rule:
relationalExpression
  : ^(EQUAL numericExpression relationalExpression)
  | ^(NOT_EQUAL numericExpression relationalExpression)
  | numericExpression
  ;
当然,这是假设解析器有一个
relationalExpression
规则,其形式如下(使用AST运算符
^
):

或者使用重写运算符
->

// parser rule:
relationalExpression
  : numericExpression
    ( EQUAL relationalExpression
      -> ^(EQUAL numericExpression relationalExpression)
    | NOT_EQUAL relationalExpression
      -> ^(NOT_EQUAL numericExpression relationalExpression)
    )?
  ;
// parser rule:
relationalExpression
  : numericExpression
    ( EQUAL relationalExpression
      -> ^(EQUAL numericExpression relationalExpression)
    | NOT_EQUAL relationalExpression
      -> ^(NOT_EQUAL numericExpression relationalExpression)
    )?
  ;