我想编写 Java 代码来为我的语法构建一个 LALR 解析器。有人可以推荐一些书籍或一些链接,我可以在其中学习如何为 LALR 解析器编写 Java 代码吗?
4 回答
手动编写 LALR 解析器很困难,但他可以做到。如果您想了解为它们手动构建解析器背后的理论,请考虑查看 Grune 和 Jacobs 的“Parsing Techniques: A Practical Guide”。这是一本关于通用解析技术的优秀书籍,LR解析的章节特别好。
如果您对获得用 Java 编写的 LALR 解析器更感兴趣,请考虑查看 Java CUP,它是 Java 的通用解析器生成器。
希望这可以帮助!
您可以将 LALR 功能分为两部分:准备表和解析输入。
第一部分是复杂且容易出错的,所以即使你想知道它是如何工作的,我建议使用经过验证的工作表生成器来处理 LALR 状态(以及标记器 DFA)。
第二部分包括使用一些非常简单的算法来使用这些表,以将输入标记化并处理成解析树/具体语法树。如果您愿意,这更容易自己实现,并且您仍然可以完全控制它的工作方式和作用。
在执行解析任务时,我个人使用免费的GOLD Parsing System,它有一个很好的 UI 用于创建和调试语法,它还生成表文件,然后可以由现有引擎或您自己的实现加载和处理(文件这些 CGT 文件的格式有据可查)。
只想提一下我的项目 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