2009-10-13 13 views
6

ANTLRの使用に推奨されるパターンは、Parserで抽象構文木を構築し、それを処理するTree walker(AKAツリー文法)を構築することです。ANTLRWorksのツリー文法をデバッグする方法を知っている人はいませんか?

なぜ私のツリー文法がうまくいかず、ANTLRWorksのデバッガをパーサー自体と同じように使うのが好きですか?パーサへの入力は「ソースコード」ですが、ツリーパーサへの入力はパーサのAST結果です。ツリー文法をテストするための入力として利用できるようにする方法はわかりません。

ANTLRWorksでツリー文法をテストする方法があることは明らかではありません。それができれば、正しい方向へのポインタは本当に感謝されます。

答えて

6

ANTLRWorksデバッガは、ツリー文法で正常に動作するはずです。正しくリコールするには、ANTLRコード生成ツールで「-debug」フラグ(Javaターゲットを使用しています)を使用し、次にツリーパーサーインスタンスを作成する場所で、ポートを使用するデバッグコンストラクタを使用する必要があります。引数。私の場合、デフォルトのポートは機能しませんでしたので、私は任意に35505を選択しました。

ANTLRWorksを起動し、ツリー文法を開き、[実行] - [デバッグリモート...]をクリックし、ポートをツリーパーサーのコンストラクタで使用されているのと同じ値で、実行中のアプリケーションにデバッガを接続できる必要があります。詳細は、ANTLR 3 Debugging FAQを参照してください。

は[ 更新]は、Javaのターゲットを使用していると仮定すると(つまり、ケースはない場合、私たちに知らせて)、ここに入門に関するより詳細な情報があります:

あなたは非ツリーパーサーをテストしていますANTLRWorksには、文法ファイルからJavaコードを生成し、そのコードを使用して入力を解析する背後にあるプロセスがあります。独自のアプリケーションでパーサーを使用する場合は、ANTLR(具体的にはクラスorg.antlr.Tool)を使用してアプリケーションに組み込むことができるJavaコードを生成する必要があります。 ANTLRWorksにはこのためのメニューオプションが用意されています。私のケースでは、私は文法からJavaコードを生成し、残りのアプリケーションがそれらを見つけることができる場所にそれらのJavaソースファイルを置く、antビルドファイルのターゲットを持っています。

<java classpath="${antlr.tool.classpath}" classname="org.antlr.Tool" failonerror="true"> 
    <arg value="-o" /> 
    <arg value="${antlr.out.dir}" /> 
    <arg value="${grammar.dir}/GrammarName.g" /> 
</java> 

あなたが生成されたソースコードに行きたいディレクトリを指すようにstringtemplate.jarantlr.jar、およびantlr.out.dirニーズが含まれている必要がありantlr.tool.classpathプロパティ(たとえば、build/antlr/src/org/myorg/antlr/parser、場合あなたのパーサ:私のAntターゲットは次のようになります文法はパッケージorg.myorg.antlr.parserを指定します)。

その後、あなたはあなたのアプリケーションの残りの部分をコンパイルするときに、あなたのような何かを使用することができます。

ここ
<javac destdir="${build.classes.dir}" debug="on" optimize="on" deprecation="${javac.deprecation}" source="${javac.source}" target="${javac.target}"> 
    <classpath refid="stdclasspath"/> 
    <src path="${src.dir}" /> 
    <src path="${antlr.src.dir}" /> 
</javac> 

を、私たちは、antlr.src.dirで(生成されたANTLRコードとともに(src.dirに)我々のアプリケーションのソースをコンパイルこの例ではbuild/antlr/srcとなります)。

あなたのアプリケーションで生成されたコードを使用する限り私は強くあなたがANTLRを使用するつもりならThe Definitive ANTLR Referenceのコピーを取得をお勧めします

String sourceText = "a + b = foo"; 
ANTLRStringStream inStream = new ANTLRStringStream(sourceText); 

// your generated lexer class 
MyLexer lexer = new MyLexer(inStream); 
CommonTokenStream tokens = new CommonTokenStream(lexer); 

// your generated parser class 
MyParser parser = new MyParser(tokens); 

// run the toplevel rule (in this case, `program`) 
MyParser.program_return prog = parser.program(); 

// get the resulting AST (a CommonTree instance, in this case) 
CommonTree tree = (CommonTree) prog.getTree(); 

// run a tree parser rule on the AST 
MyTreeParser treeParser = new MyTreeParser(new CommonTreeNodeStream(tree)); 
treeParser.program(); 

:、外ANTLRWorks)、あなたのような何かをする必要があります。このすべてはかなり徹底的にカバーされており、始めるための例がたくさんあります。

+0

私はFAQをかなり徹底的に調べたが、このページを見逃してしまったと思った。私は今それを読んで、私がかなり近いと思う。まだ動作しません。 「ANTLRコード生成ツールを「-debug」フラグ(Javaターゲットを使用している)で使用する必要がある場合は、ツリーパーサーインスタンスを作成する場所を選択する必要があります。 。コード生成にコマンドラインANTLRを使用していますか?私はこのコードをどこに作成しているのか、ツリー以外のパーサのコードがどのように動いているのかは分かりません。 –

0

構築しているASTが(ANTLRWORKSデバッガで)うまくいれば、ツリーウォーキングテストは他のアプリケーションをテストすることと違いはありません。たとえば、Javaコードを発行している場合は、Eclipseのデバッガを使用してテストするか、通常のログメッセージを使用します。

+0

うん、私はこのメソッドの使用に移りました。 ANTLRWorksは非常に便利なので、私はANTLRWorksを離れることなくツリー文法をテストする方法を見つけることを望んでいました。これはショーストッパーではありませんが、それを動作させる方法を考えてみるといいでしょう。 –

2

AntlrWorksを使用する方法があります:

  1. は、そのコード(これは/ OデバッグwのコマンドラインからANTLRを実行することと同じである)
  2. 自分で書くの生成AntlrWorks
  3. であなたの文法を書きますDebugging with AntlrWorks faq
  4. に提案されたものと同様のスタブは、あなたのツリー文法を書く
  5. 選択デバッグAntlrworks(これはデでコマンドラインからANTLRを実行するのと同じですバグフラグ。
  6. スタブプログラムを実行します。プログラムantlrworksが接続されるまで、あなたが
  7. 木文法をデバッグすることができますので、ブロックします戻ってあなたの木の文法を開いているantlrworksに移動し、デバッグリモート
  8. は....問題を解決:)
関連する問題