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.jar
、antlr.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.dir
build/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のコピーを入手することを強くお勧めします。これらすべてがかなり徹底的にカバーされており、開始するための例がたくさんあります。