1

TreeWalkerでNullPoiterExceptionが発生し続けますが、理由がわからないようです。

文法全体を投稿できません。長すぎるためです。

これは、antlrWorksが問題を次のように言うtreeWalkerのルールです。

collection_name returns [MyType value]
    : ID { $value = (MyType) database.get($collection_name.text); }
    ;

データベースはHashMapであることに注意してください。

ありがとうございました!

4

1 に答える 1

2

文法全体を投稿できません。長すぎるためです。

以下はより「読みやすく」、元のルールとまったく同じように機能します。

collection_name returns [MyType value]
 : ID { $value = (MyType) database.get($ID.text); }
 ;

おそらく、いくつかの健全性チェックを行います。

collection_name returns [MyType value]
 : ID 
   {
     Object v = database.get($ID.text);
     if(v == null) {
       throw new RuntimeException($ID.text + " unknown in database!");
     }
     $value = (MyType) v;
   }
 ;

編集

すでに知っているように、ルールの属性にアクセスする.textことは、ツリー文法では不可能です(パーサー文法でのみ)。ツリー文法では、すべてのルールはタイプであり、代わりにaと属性Treeを知っています。トークンは、パーサー文法とツリー文法の両方で同じようにアクセスできます。だから大丈夫です。.start.end$ID.text

于 2012-08-22T16:12:33.613 に答える