6

ANTLRの使用に推奨されるパターンは、パーサーに抽象構文ツリーを構築させてから、それらを処理するためのツリーウォーカー(別名ツリー文法)を構築することです。

ツリーの文法が機能しない理由を突き止めようとしています。パーサー自体に使用したのと同じ方法でANTLRWorksのデバッガーを使用したいと考えています。パーサーへの入力は「ソースコード」ですが、ツリーパーサーへの入力はパーサーのAST結果です。ツリーの文法をテストするための入力としてそれを利用できるようにする方法がわかりません。

ANTLRWorksでツリー文法をテストする方法があるかどうかは明らかではありません。それができれば、正しい方向へのポインタをいただければ幸いです。

4

3 に答える 3

6

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

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

[更新]Javaターゲットを使用していると仮定して(そうでない場合はお知らせください)、開始に関する詳細情報は次のとおりです。

ANTLRWorksで非ツリーパーサーをテストする場合、文法ファイルからJavaコードを生成し、そのコードを使用して入力を解析する舞台裏のプロセスがあります。独自のアプリケーションでパーサーを使用する場合は、ANTLR(具体的にはクラスorg.antlr.Tool)を使用してJavaコードを生成し、それをアプリケーションに含める必要があります。ANTLRWorksには、このためのメニューオプションがあります。私の場合、Antビルドファイルにターゲットがあり、文法からJavaコードを生成し、それらのJavaソースファイルをアプリケーションの他の部分が見つけられる場所に配置します。私のアリのターゲットは次のようになります。

<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>

プロパティantlr.tool.classpathにはとが含まれている必要がstringtemplate.jarありantlr.jarantlr.out.dir生成されたソースコードを配置するディレクトリを指す必要があります(たとえば、build/antlr/src/org/myorg/antlr/parserパーサー文法でパッケージが指定されている場合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)とともにアプリケーションソース(in)をコンパイルします。antlr.src.dirbuild/antlr/src

アプリケーションで(つまり、ANTLRWorksの外部で)生成されたコードを使用する限り、次のようなことを行う必要があります。

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();

ANTLRを使用する場合は、 The DefinitiveANTLRReferenceのコピーを入手することを強くお勧めします。これらすべてがかなり徹底的にカバーされており、開始するための例がたくさんあります。

于 2009-10-21T14:36:39.437 に答える
2

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

  1. AntlrWorksで文法を書く
  2. コードを生成します(これは、デバッグなしでコマンドラインからAntlrを実行するのと同じです)
  3. AntlrWorksを使用したデバッグに関するよくある質問で提案されたものと同様のスタブを自分で作成してください
  4. ツリーの文法を書く
  5. debug Antlrworksを選択します(これは、コマンドラインからdebugフラグを指定してAntlrを実行するのと同じです。
  6. スタブプログラムを実行します。プログラムはantlrworksが接続されるまでブロックされるため、ツリーの文法をデバッグできます。
  7. ツリーの文法が開いているantlrworksに戻り、リモートでデバッグします
  8. 問題を解決する....:)
于 2012-08-08T19:13:09.220 に答える
0

構築しているASTが(ANTLRWORKSデバッガーを使用して)正常であることが確実な場合、ツリーウォーキングテストは他のアプリのテストと同じです。たとえば、Javaコードを発行している場合は、Eclipseのデバッガーを使用してテストするか、プレーンログメッセージを使用します...

于 2009-10-18T16:44:04.413 に答える