2012-08-09 32 views
3

我有T.Parr关于ANTLR的两本书,我看到所有的符号都是美元符号。它的工作(ED)对我来说太:

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的一个标准。

回答

3

QUESTION: so what is this story with dollar sign? Should I not use it? Or should I use it until I get an error?

这取决于你想要参考的东西。

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

  1. name=IDENT,标签name引用一个CommonToken;
  2. val+=IDENT,标签val参考包含CommonToken实例的List,在这种情况下;
  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) } 
     ; 

我不明白你为什么会想要获得整个ParserRuleReturnScopetree包含您需要的所有信息。

HTH

+0

那么,我不想做任何事情:-),我想要传递一棵树到另一个树的构造函数。谢谢你的解释。 – greenoldman 2012-08-10 10:55:21

+0

不客气@macias。 – 2012-08-10 13:28:38

+0

我假设'ex = not_expr'中的标签'ex'是对'ParserRuleReturnScope'的引用,因为它是一个解析规则(而'IDENT'是一个标记)? – Alexander 2013-10-31 18:26:52