何时将美元符号$放在ANTLR中对符号的引用?

时间:2012-08-09 11:59:05

标签: antlr dollar-sign

我有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的标准。

1 个答案:

答案 0 :(得分:3)

  

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

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

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

  1. name=IDENT,标签name引用CommonToken;
  2. val+=IDENT,标签val引用包含List个实例的CommonToken,在这种情况下;
  3. ex=not_expr标签ex引用了ParserRuleReturnScope
  4. 我建议始终使用$。我不知道NOT ex=not_expr -> { new UnaryExpression($NOT,$ex) };是否设计不起作用,但为了获得匹配的任何not_expr,我只是这样做:

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

    我不明白为什么你想要掌握整个ParserRuleReturnScopetree包含你需要的所有信息。

    HTH