2011-07-25 15 views
0

antlrを使用してDSLを作成しています。 LexerとParserは1つの文法ファイル(例えばlayout.g)で書かれています。ツリー文法は別の文法ファイル(例えばlayoutTree.g)に書かれています。今、ツリーパーサが正しく解析されていません。パーサからのAST出力とその正しい出力を表示しました。私は生成されたツリーパーサコードを歩き、トークン値宣言がツリーパーサとパーサの異なる値を割り当てることがわかりました。パーサとツリーパーサからのサンプル出力です。antlrの文法ファイルからトークンファイルを作成する方法

パーサ出力

public static final int ARRAY_MEMBER_TOKEN=4; 
public static final int ARRAY_TOKEN=5; 
public static final int DECLARATION_TOKEN=6; 

ツリーパーサの出力

public static final int EOF=-1; 
public static final int DECLARATION_TOKEN=4; 
public static final int IDENTIFIER=5; 

あなたはDECLARATION_TOKENは、パーサ出力と木のパーサの出力に異なる値を持って見ることができるように。このツリーパーサのため、期待どおりに動作していません。どのようにこの問題を修正できますか?

生成されたトークンファイル(layout.tokenなど)に問題はありますか?このファイルはプロジェクトで空です。このファイルはどのように生成できますか?

+0

「.tokens」ファイルは、レクサー/パーサーの生成中に自動的に生成されます。 '.tokens'ファイルが空であるという事実は良くありません。どのようにあなたのレクサー/パーサーを生成していますか? (コマンドライン、IDE、ANTLRWorks、その他?) –

+0

私はsourceforge.netから 'antlrv3ide'を使用します。私は "http://antlrv3ide.sourceforge.net/updates"からインストールしました。コマンドラインを使ってどのように生成できますか? – hnm

+1

コマンドラインで、 'java -cp antlr-3.2.jar org.antlr.Tool layout.g'と' java -cp antlr-3.2.jar org.antlr.Tool layoutTree.g'を実行してください。 –

答えて

0

あなたのツリーの文法には、このようなことがありますか?

options 
{ 
    tokenVocab=layout; //NOT layout.g or layout.tokens 
    ASTLabelType=pANTLR3_BASE_TREE; 
} 
+0

私はASTLabelType = CommonTreeを持っています。私のパーサーの文法で。 – hnm

+0

申し訳ありませんtokenVocab = layout;私はオプションを持っています オプション{ language = Java; tokenVocab = layout; ASTLabelType = CommonTree; }のツリー文法 – hnm

関連する問題