3

我有两本 T.Parr 写的关于 ANTLR 的书,我看到到处都是美元符号和符号的引用。它也对我有用:

term : IDENT -> { new TokenNode($IDENT) };

或更复杂的东西:

type_enum : 'enum' name=IDENT '=' val+=IDENT (',' val+=IDENT)* ';' 
            -> { new EnumNode($name,$val) };

但是这条线给了我荒谬的错误:

not_expr :  term 
         | NOT ex=not_expr -> { new UnaryExpression($NOT,$ex) };

错误说missing attribute access on rule scope: ex。你知道修复是什么吗?删除“ex”上的美元符号。就是这样。

出于好奇,我检查了上面提到的规则并删除了美元符号——它们像以前一样工作(即我没有收到任何错误)。

问题:那么这个带有美元符号的故事是什么?我不应该使用它吗?或者我应该使用它直到出现错误?

如果我没有看到这个约定几乎被用作 ANTLR 中的标准,我不会问这个问题。

4

1 回答 1

3

问题:那么这个美元符号的故事是什么?我不应该使用它吗?或者我应该使用它直到出现错误?

这取决于您要参考的内容。

了解有 3 种不同类型的“标签”:

  1. name=IDENT, 标签name引用 a CommonToken;
  2. val+=IDENT,标签val引用了一个List包含CommonToken实例,在这种情况下;
  3. ex=not_expr标签ex引用了ParserRuleReturnScope

我建议始终使用$. 我不知道它是否是设计上NOT ex=not_expr -> { new UnaryExpression($NOT,$ex) };不起作用的,但要掌握任何not_expr匹配的东西,我只需这样做:

not_expr : term 
         | NOT ex=not_expr -> { new UnaryExpression($NOT, $ex.tree) }
         ;

我不明白您为什么要掌握整个ParserRuleReturnScope:tree包含您需要的所有信息。

高温高压

于 2012-08-10T09:24:32.320 回答