gpt4 book ai didi

antlr - 有谁知道在 ANTLRWorks 中调试树语法的方法

转载 作者:行者123 更新时间:2023-12-04 14:36:46 28 4
gpt4 key购买 nike

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

我试图找出为什么我的树语法不起作用的原因,并且很想使用 ANTLRWorks 的调试器,就像我将它用于解析器本身一样。解析器的输入是“源代码”,但树解析器的输入是解析器的 AST 结果。我不知道如何将其用作测试树语法的输入。

目前尚不清楚在ANTLRWorks中是否有一种方法可以测试树语法。如果可以做到,那么将非常感谢正确方向的指针。

最佳答案

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

启动 ANTLRWorks,打开您的树语法,单击“运行”->“调试远程...”,将端口设置为树解析器构造函数中使用的相同值,您应该能够将调试器连接到您的正在运行的应用程序。见 ANTLR 3 Debugging FAQ详情。

[ 更新 ] 假设您使用的是 Java 目标(如果不是这种情况,请告诉我们),以下是有关入门的更多详细信息:

当您在 ANTLRWorks 中测试非树解析器时,有一个幕后过程从您的语法文件生成 Java 代码,然后使用该代码来解析您的输入。当您在自己的应用程序中使用解析器时,您必须使用 ANTLR(特别是类 org.antlr.Tool)来生成 Java 代码,然后您可以将其包含在您的应用程序中。 ANTLRWorks 有一个菜单选项,它应该可以帮助您入门。就我而言,我的 ant 构建文件中有一个目标,它根据我的语法生成 Java 代码,并将这些 Java 源文件放在我的应用程序的其余部分可以找到它们的地方。我的 Ant 目标看起来像这样:

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

属性(property) antlr.tool.classpath需要包含 stringtemplate.jarantlr.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>

在这里,我们编译我们的应用程序源代码(在 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();

我强烈建议您获取 The Definitive ANTLR Reference 的副本如果您打算使用 ANTLR。所有这些都被非常彻底地涵盖,并提供了大量示例来帮助您入门。

关于antlr - 有谁知道在 ANTLRWorks 中调试树语法的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1561478/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com