【问题标题】:How to write LALR parser for some grammar in Java?如何为 Java 中的某些语法编写 LALR 解析器?
【发布时间】:2011-03-23 05:14:25
【问题描述】:

我想编写 Java 代码来为我的语法构建一个 LALR 解析器。有人可以推荐一些书籍或一些链接,让我可以学习如何为 LALR 解析器编写 Java 代码吗?

【问题讨论】:

标签: java parsing lalr


【解决方案1】:

手动编写 LALR 解析器很困难,但他可以做到。如果您想了解为它们手动构建解析器背后的理论,请考虑查看 Grune 和 Jacobs 的“Parsing Techniques: A Practical Guide”。这是一本关于通用解析技术的优秀书籍,LR解析的章节特别好。

如果您对获得用 Java 编写的 LALR 解析器更感兴趣,请考虑研究 Java CUP,它是 Java 的通用解析器生成器。

希望这会有所帮助!

【讨论】:

  • 实际上,一个 LALR 解析器 引擎(用于解释表格、进行归约等)非常容易编写。生成解析表的 LALR 解析器 generator 很难编写,而且您当然不想手动模拟它。如果 OP 的任务是简单地解析他拥有的语法,那么使用现有的生成器系统是迄今为止最简单的。同意,Grune 的书很不错。
  • 我完全同意使用解析器生成器是这里的方法。根据我的记忆,虽然构建 LALR 表非常困难,因为任何有趣的语法都必然有大量的状态,即使这些状态不是很复杂。我曾经尝试以这种方式为简单的正则表达式构建解析器,但花了好几个小时。
【解决方案2】:

您可以将 LALR 功能分为两部分:准备表格和解析输入。

第一部分复杂且容易出错,因此即使您想知道它是如何工作的,我建议您使用经过验证的工作表生成器来生成 LALR 状态(以及标记器 DFA)。

第二部分包括使用一些非常简单的算法来使用这些表,以将输入标记化并处理成解析树/具体语法树。如果您愿意,您自己更容易实现,并且您仍然可以完全控制它的工作方式和作用。

在执行解析任务时,我个人使用免费的GOLD Parsing System,它具有用于创建和调试语法的漂亮 UI,它还生成表格文件,然后可以由现有引擎或您自己的实现加载和处理这些文件(这些 CGT 文件的文件格式有据可查)。

【讨论】:

    【解决方案3】:

    如前所述,您将始终使用解析器生成器来生成 LALAR 解析器。一些这样的 Java 工具是:

    【讨论】:

      【解决方案4】:

      只想提一下我的项目 CookCC (http://coconut2015.github.io/cookcc/) 是一个 LALR(1) 解析器 + Lexer(很像 flex)。

      CookCC 的独特之处在于您可以使用 Java 注释在 Java 中编写词法分析器和解析器。在此处查看计算器示例:https://github.com/coconut2015/cookcc/blob/master/tests/javaap/calc/Calculator.java

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        相关资源
        最近更新 更多