3

私は T.Parr による ANTLR に関する本を 2 冊持っていますが、ドル記号がいたるところにシンボルへの言及が見られます。それは私にとってもうまくいきました:

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参照します。ListCommonToken
  3. ex=not_exprラベルexParserRuleReturnScope

を常に使用することをお勧めし$ます。動作しないのが設計によるものかどうかはわかりませんが、一致しNOT ex=not_expr -> { new UnaryExpression($NOT,$ex) };たものを把握するには、次のようnot_exprにします。

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

全体を把握したい理由がわかりません。必要なすべての情報が保持されていますParserRuleReturnScopetree

HTH

于 2012-08-10T09:24:32.320 に答える