我有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的标准。
答案 0 :(得分:3)
问题:那么带有美元符号的这个故事是什么?我应该不用吗?或者我应该使用它,直到我收到错误?
这取决于您想要参考的内容。
了解有3种不同类型的“标签”:
name=IDENT
,标签name
引用CommonToken
; val+=IDENT
,标签val
引用包含List
个实例的CommonToken
,在这种情况下; 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
包含你需要的所有信息。
HTH