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

2024-03-01

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

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

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


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。所有这些内容都非常全面地涵盖,并提供了大量示例来帮助您入门。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有谁知道在 ANTLRWorks 中调试树语法的方法 的相关文章

  • ANTLR 4 和 AST 访客

    我正在尝试将 AST 与 ANTLR4 一起使用 并使用以下文件 生成器 java import org antlr v4 runtime ANTLRInputStream import org antlr v4 runtime CharS
  • antlr4:ATN 版本 2 预计 3

    当尝试使用生成的语法和词法分析器时 我得到 org antlr v4 runtime atn ATN 无法使用版本 2 预期为 3 反序列化 ATN 怎么了 您的解析器是使用 ANTLR 4 0 生成的 但您尝试使用 ANTLR 4 1 执
  • 使用 ANTLR4 解析公式

    我正在尝试使用 ANTLR4 将数学公式解析为 LaTeX 的子集 例如它应该解析 a 4 b 10 to frac a 4 b cdot 10 我的简单语法创建了一棵这样的树 现在我正在尝试实现解析树侦听器 以在遍历树时以某种方式构造 L
  • 编写没有语法文件的自定义 Xtext/ANTLR 词法分析器

    我正在为 CoffeeScript 编写一个 Eclipse Xtext 插件 我意识到我可能需要手动为其编写一个词法分析器 CoffeeScript 解析器还使用手写词法分析器 https github com jashkenas cof
  • ANTLR4:词法分析器规则:任何字符串,只要不包含这两个并排字符?

    有没有办法在 ANTLR4 中表达这一点 任何字符串 只要它不立即包含星号 后面跟着一个正斜杠 这不起作用 因为 ANTRL 抛出此错误 multi character literals are not allowed in lexer s
  • ANTLR 隐式乘法

    我是 ANTLR 的新手 我正在尝试扩展所提供的简单计算器的示例here https stackoverflow com a 1932664 具体来说 我尝试添加一些简单的函数 负数等 以熟悉 ANTLR 然而 我在尝试实现 隐式 乘法时遇
  • 用于计算类数的部分语法

    我需要计算正确的 C 源文件中的类数量 我写了以下语法 grammar CSharpClassGrammar options language CSharp2 parser namespace CSharpClassGrammar Gene
  • 如何使用Antlr实现函数调用,以便在定义之前就可以调用它?

    一旦构建了 AST 实现树遍历器以便可以按任意顺序定义和调用函数的最佳方法是什么 例如 这在 PHP 中是有效的 我猜想一定有第二遍 或者树转换 但我在这个主题上找不到任何有趣的东西 这个问题可能不是 Antlr 特有的问题 但如果你能给我
  • 将简单的 Antlr 语法转换为 Xtext

    我想将一个非常简单的Antlr语法转换为Xtext 所以没有句法谓词 https stackoverflow com questions 5728659 translate antlr grammar into xtext grammar
  • ANTLR 解析器挂在 proxy.handshake 调用上

    我正在尝试让基本的 ECMAScript 解析器工作 并找到了完整的 ANTLR 语法ECMAScript 3 http research xebic com es3 它似乎编译正常并生成适当的 Lexer Parser Walker Ja
  • 将 xtext 编辑器支持与外部 ANTLR 解析器链接起来

    我当前的项目 将其命名为 IoTSuite 采用高级规范 解析它们 并生成 Java 和 Android 代码 在这个项目中 我编写了 ANTLR 语法来解析高级规范 并使用 StringTemplate 作为代码生成器 然而 由于良好的编
  • 在 ANTLR 3 中,如何在运行时而不是提前生成词法分析器(和解析器)?

    我想在运行时生成 antlr 词法分析器 也就是说 生成语法并从语法生成词法分析器类及其在运行时的支持位 我很高兴将它输入到 java 编译器中 它可以在运行时访问 这是一种快速但肮脏的方法 生成一个combined ANTLR 语法 g给
  • Antlr 语法生成无效的 C# 代码

    我正在尝试使用 ANTLR 和 StringTemplate 库开发一个 C 代码生成器 AntlrWorks 可以生成 C 解析器和词法分析器文件 而不会报告任何错误 但是 c 解析器代码无效 无法在 Visual Studio 中编译
  • 将 ANTLR 语法翻译为 XText 语法:如何删除句法谓词

    我对 Xtext 和 ANTLR 都很陌生 我需要将 ANTLR g 语法转换为 XTEXT xtext 语法 在 ANTLR 语法中 存在 Xtext 不支持的语法谓词 有没有办法删除 翻译这些谓词 Thanks EDIT 我尝试翻译的
  • python 2.7中没有名为antlr4的模块

    我想将 ANTLR4 与 Python 2 7 一起使用 为此我执行了以下操作 我安装了这个包antlr4 4 6 1在 Arch Linux 上sudo pacman S antlr4 我写了一个MyGrammar g4文件并成功生成了词
  • 使用 ANTLR3 解析换行符、EOF 作为语句结束标记

    我的问题是关于在 ANTLRWorks 中运行以下语法 INT 0 9 SEMICOLON NEWLINE r n n r STMTEND SEMICOLON NEWLINE NEWLINE statement STMTEND INT ST
  • 使用 ANTLR 解析时忽略输入的某些部分

    我正在尝试通过 ANTLR ANTLRWorks 3 5 2 解析语言 目标是输入完整的输入 但 Antlr 给出语法中定义部分的解析树并忽略其余输入 例如这是我的语法 grammar asap project begin PROJECT
  • ANTLR语法的迁移工具

    假设我有以下简单语法 查询 DSL grammar TestGrammar term textTerm textTerm Text T VALUE STRING T VALUE value STRING WS t r n gt skip 然
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 有没有使用 ANTLR 或类似语言实现的简单语言?

    我正在尝试构建一种简单的解释语言以用于学习目的 我读过无数关于 ANTLR 和 JavaCC 的理论和教程 但我不知道如何真正让它做一些有用的事情 我通过 把东西拆开然后重新组合起来 来学得最好 那么 是否有任何在 ANTLR 或类似工具的

随机推荐