Antlr 有人知道在AntlWorks中调试树语法的方法吗

Antlr 有人知道在AntlWorks中调试树语法的方法吗,antlr,antlrworks,Antlr,Antlrworks,ANTLR使用的推荐模式是让解析器构造一个抽象语法树,然后构建树遍历器(也称为树语法)来处理它们 我正试图弄清为什么我的树语法不起作用,并希望使用ANTLRWorks的调试器,就像我在解析器中使用它一样。解析器的输入是“源代码”,但树解析器的输入是解析器的AST结果。我不知道如何将其作为测试树语法的输入 目前还不清楚是否有办法在AntlWorks中测试树语法。如果能够做到这一点,我们将非常感谢指向正确方向的指针。如果您确信您正在构建的AST很好(使用AntlWorks调试器),那么树漫游测试与测

ANTLR使用的推荐模式是让解析器构造一个抽象语法树,然后构建树遍历器(也称为树语法)来处理它们

我正试图弄清为什么我的树语法不起作用,并希望使用ANTLRWorks的调试器,就像我在解析器中使用它一样。解析器的输入是“源代码”,但树解析器的输入是解析器的AST结果。我不知道如何将其作为测试树语法的输入


目前还不清楚是否有办法在AntlWorks中测试树语法。如果能够做到这一点,我们将非常感谢指向正确方向的指针。

如果您确信您正在构建的AST很好(使用AntlWorks调试器),那么树漫游测试与测试任何其他应用程序没有什么不同。例如,如果您正在发出Java代码,请使用Eclipse的调试器对其进行测试,或者使用简单的日志消息…

AntlWorks调试器应该可以很好地处理您的树语法。如果我没记错,您需要使用带有“-debug”标志的ANTLR代码生成工具(我使用的是Java目标),然后,在创建树解析器实例的地方,使用以端口为参数的调试构造函数。在我的例子中,默认端口不工作,所以我任意选择了35505

启动ANTLRWorks,打开树语法,单击“运行”->“调试远程…”,将端口设置为树解析器的构造函数中使用的相同值,您应该能够将调试器连接到正在运行的应用程序。有关详细信息,请参阅

[Update]假设您正在使用Java目标(如果不是这样,请告诉我们),下面是关于入门的更详细信息:

在AntlWorks中测试非树解析器时,有一个幕后过程,从语法文件生成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>
在这里,我们编译应用程序源代码(在
src.dir
中)以及生成的ANTLR代码(在
ANTLR.src.dir
中,在本例中是
build/ANTLR/src

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

<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>
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,我强烈建议您获取一份。所有这些内容都被非常全面地介绍过,并提供了大量示例帮助您入门。

有一种使用AntlWorks的方法:

  • 把你的语法写下来
  • 生成其代码(这与从命令行运行Antlr相同,不带调试)
  • 给自己写一个类似于上面建议的存根
  • 写你的树语法
  • 选择debug Antlrworks(这与使用debug标志从命令行运行Antlr相同)
  • 运行存根程序。在连接antlrworks之前,该程序将一直阻塞,因此您可以调试树语法
  • 返回到树语法打开的AntlWorks,并调试Remote
  • 解决问题……)

  • 我以为我已经彻底地搜索了FAQ,但错过了这一页。我现在已经读过了,我想我已经很接近了。但仍然不起作用。当您说“您需要使用带有“-debug”标志的ANTLR代码生成工具(我使用的是Java目标)时,那么,在哪里创建树解析器实例”,我想这就是我迷路的地方。您是否使用命令行ANTLR生成代码?我不确定我在哪里创建了这个代码,以及非树解析器的代码是如何运行的。是的,我已经开始使用这个方法了。ANTLRWorks非常方便,所以我希望找到一种不用离开ANTLRWorks就可以测试我的树语法的方法。这不是一个表演的停止,但它会很好地解决如何使它工作。