有没有人知道在ANTLRWorks中调试树语法的方法

时间:2009-10-13 16:45:23

标签: antlr antlrworks

ANTLR用法的推荐模式是让Parser构造一个抽象语法树,然后构建Tree walker(AKA树语法)来处理它们。

我试图找到为什么我的树语法不起作用的底部,并且喜欢使用ANTLRWorks的调试器,就像我将它用于解析器本身一样。解析器的输入是“源代码”,但树解析器的输入是解析器的AST结果。我没有看到如何将其作为输入来测试树语法。

目前尚不清楚是否有办法在ANTLRWorks中测试树语法。如果可以这样做,那么正确的方向指针将非常受欢迎。

3 个答案:

答案 0 :(得分:6)

ANTLRWorks调试器应该可以正常使用树语法。如果我没记错的话,你需要使用带有“-debug”标志的ANTLR代码生成工具(我正在使用Java目标),然后,在创建树解析器实例的地方,使用带端口的调试构造函数一个论点。在我的情况下,默认端口不起作用,所以我随意选择35505。

启动ANTLRWorks,打开树语法,单击“运行” - >“调试远程...”,将端口设置为树解析器的构造函数中使用的相同值,您应该能够连接运行应用程序的调试器。有关详细信息,请参阅ANTLR 3 Debugging 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.jarantlr.jar,而antlr.out.dir需要指向您希望生成的源代码所在的目录(例如{ {1}},如果您的解析器语法指定包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中,在此示例中为antlr.src.dir)。

至于在应用程序中使用生成的代码(例如,在ANTLRWorks之外),您需要执行以下操作:

build/antlr/src

如果您打算使用ANTLR,我强烈建议您获取The Definitive ANTLR Reference的副本。所有这些都包含在内,有很多例子可以帮助您入门。

答案 1 :(得分:2)

有一种方法可以使用AntlrWorks:

  1. 在AntlrWorks中编写语法
  2. 生成代码(这与通过调试从命令行运行Antlr相同)
  3. 为自己写一个类似于Debugging with AntlrWorks faq
  4. 上建议的存根
  5. 编写树语法
  6. 选择debug Antlrworks(这与使用调试标志从命令行运行Antlr相同。
  7. 运行存根程序。程序将阻塞,直到连接了antlrworks,因此您可以调试树语法
  8. 返回打开树形语法的antlrworks和Debug Remote
  9. 解决问题......:)

答案 2 :(得分:0)

如果您确定要构建的AST很好(使用ANTLRWORKS调试器),则树行走测试与测试任何其他应用程序没有什么不同。例如,如果您要发布Java代码,请使用Eclipse的调试器对其进行测试,或使用纯日志消息...