2011-04-14 10 views
3

私はしばらくの間立ち往生していて、できるだけ助けていただきたいと思います。 ANTLRテキスト属性のNullPointerException

私はANTLR ツリー内のいくつかのルールがあり文法:私は、私は彼らが私のソースの冒頭で宣言されているように私のすべての変数を挿入するJavaクラスVarTableを書かれている

block 
    : compoundstatement 
    | ^(VAR declarations) compoundstatement 
    ; 

declarations 
    : (^(t=type idlist))+ 
    ; 

idlist 
    : IDENTIFIER+ 
    ; 

type 
    : REAL 
    | i=INTEGER 
    ; 

ファイル。テーブルには、変数タイプ(つまり、実数または整数)も保持されます。この変数テーブルを使って、宣言されていない変数や宣言の重複をチェックすることもできます。

基本的に、変数型を '宣言'ルールから 'idlist'ルールidlistルール内のすべての識別子をループして、それらを変数テーブルに1つずつ追加します。

私が得ている大きな問題は、 '宣言'ルールの$ t変数(これは型を参照するもの)が 'text'属性にアクセスしようとするとNullPointerExceptionが発生することです。

また、 'type'ルールで$ i変数の 'text'属性にアクセスしようとしても、問題はありません。

NullPointerExceptionが生成されているJavaファイル内の場所を調べましたが、それでも私には意味がありません。それはルールが

(^(typeidlist))+ 

があるので、複数の種類があるかもしれないという事実と問題

です??

idlistルールに到達したときに同じ問題が発生します。見つかったすべてのIDENTIFIERトークンをループするアクションをどのように書くことができるかわからないためです。

ヘルプやコメントに感謝します。

乾杯

+0

これは木文法であり、パーサー文法ではありません。正しい? –

+0

そうです。それは木文法です。あいまいさを残して申し訳ありません。 – Joe

+0

問題ありませんジョー、私は思ったほどですが、答える前に確かめたいと思っていました。 –

答えて

4

ツリー文法の内側にしようとしたようにあなたは、(彼らは別のオブジェクトだ!)のみパーサ(または組み合わせ)文法では、プロダクションルールから属性を参照することはできません。 INTEGERは生産ルールではなく、単に「単純な」トークン(端末)であることに注意してください。そのため、.text属性を呼び出すことができます。

あなたは木の文法でtypeルールのテキストを保持し、あなたのdeclarationsルールでそれを印刷取得したいのであれば、あなたはこのような何か行うことができます:

tree grammar T; 

... 

declarations 
    : (^(t=type idlist {System.out.println($t.returnValue);}))+ 
    ; 

... 

type returns [String returnValue] 
    : i=INTEGER {returnValue = "[" + $i.text + "]";} 
    ; 

... 

をしかし、あなたが本当にしたい場合はtypeがという属性を持っているTreeRuleReturnScopeのインスタンスを返すこと

declarations 
    : (^(t=type idlist {System.out.println($t.start.getText());}))+ 
    ; 

注:リターン・オブジェクトを指定せずにそれを行うには、あなたはこのような何かを行うことができますであり、順番にCommonTreeインスタンスです。そのCommonTreeインスタンスでgetText()と呼ぶことができます。

+0

返信いただきありがとうございます。生成されたJavaコードで返されるTreeRuleReturnScopeオブジェクトを見たことがありますが、CommonTreeクラスのAPIをチェックアウトする必要があります。再度、感謝します。 V.有用です。 – Joe

+0

@Joe、よろしくお願いします! –

関連する問題