ANTLRWorks 调试器应该可以很好地配合您的树语法。如果我没记错的话,您需要使用带有“-debug”标志的 ANTLR 代码生成工具(我使用的是 Java 目标),然后,在创建树解析器实例的位置,使用将端口作为一个论点。就我而言,默认端口不起作用,所以我随意选择了 35505。
启动 ANTLRWorks,打开树语法,单击“运行”->“调试远程...”,将端口设置为树解析器构造函数中使用的相同值,然后您应该能够将调试器连接到您的正在运行的应用程序。请参阅ANTLR 3 调试常见问题解答 http://www.antlr.org/wiki/pages/viewpage.action?pageId=4554901了解详情。
[Update] 假设您使用的是 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
and antlr.jar
, and 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>
在这里,我们编译我们的应用程序源(在src.dir
)以及生成的 ANTLR 代码(在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 参考 http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference如果你要使用 ANTLR。所有这些内容都非常全面地涵盖,并提供了大量示例来帮助您入门。