Antlr Treewalker找不到令牌?

时间:2014-02-28 16:39:36

标签: antlr antlr3

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

Treewalker应该在:

中找到“=”标记
relationalExpression
: (numericExpression) (     (^(EQUAL relationalExpression))   
                        | (^(NOT_EQUAL relationalExpression)) 
                  )? 
;

虽然顶部令牌应该是“=”或“!=”,但编译器只是查看“numericExpression”并发现它不是“=”令牌。最后,它导致错误“在输入'='”没有可行的替代方案。

所以“=”是解析器的顶级标记,但不适用于树木行者。

这里有什么问题?

非常感谢

1 个答案:

答案 0 :(得分:0)

您可能打算以树形式写relationalExpression,其中numericExpression可能是EQUAL的孩子,而不是其中的兄弟。

// tree parser rule:
relationalExpression
  : ^(EQUAL numericExpression relationalExpression)
  | ^(NOT_EQUAL numericExpression relationalExpression)
  | numericExpression
  ;

这当然是假设您的解析器具有relationalExpression规则,其中包含以下格式(使用AST运算符^):

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

或以下,它使用重写运算符->

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