如何为Java中的某些语法编写LALR解析器?

如何为Java中的某些语法编写LALR解析器?,java,parsing,lalr,Java,Parsing,Lalr,我想编写Java代码,为我的语法构建一个LALR解析器。有人能给我推荐一些书或链接,让我学习如何为LALR解析器编写Java代码吗?手工编写LALR解析器很难,但他可以做到。如果你想学习手工构建解析器的理论,请考虑Grune和雅可布的“解析技巧:实用指南”。这是一本关于一般解析技术的好书,关于LR解析的一章特别好 如果你对只使用java编写的LALR解析器感兴趣,考虑一下java java,它是Java的通用解析器生成器。 希望这有帮助 您可以将LALR功能分为两部分:准备表和解析输入 第一部分

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

手工编写LALR解析器很难,但他可以做到。如果你想学习手工构建解析器的理论,请考虑Grune和雅可布的“解析技巧:实用指南”。这是一本关于一般解析技术的好书,关于LR解析的一章特别好

如果你对只使用java编写的LALR解析器感兴趣,考虑一下java java,它是Java的通用解析器生成器。


希望这有帮助

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

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

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


在执行解析任务时,我个人使用free,它有一个很好的UI用于创建和调试语法,它也生成表文件,然后可以由现有引擎或您自己的实现加载和处理(这些CGT文件的文件格式有很好的文档记录)。

如前所述,您将始终使用解析器生成器生成LALAR解析器。Java的一些此类工具包括:

  • (我个人最喜欢的)

我只想提一下,我的项目CookCC()是一个LALR(1)解析器+词法分析器(非常类似于flex)


CookCC的独特特性是,您可以使用Java注释用Java编写词法分析器和解析器。请参见此处的计算器示例:

不要这样做。自上而下,递归下降(回溯)解析器易于编写和维护。LR解析器不是,即使它们由解析器生成器支持。事实上,一个LALR解析器引擎(用于集成表、进行缩减等)非常容易编写。生成解析表的LALR解析器生成器很难编写,您当然不想手动模拟它。如果OP的任务是简单地解析他拥有的语法,那么使用现有的生成器系统是最简单的。同意,Grune的书非常好。我完全同意使用解析器生成器是一种方法。根据我的记忆,尽管构建LALR表非常困难,因为任何有趣的语法中都必然包含大量的状态,即使这些状态不是很复杂。我曾经尝试过用这种方法为简单的正则表达式构建一个解析器,它花费了数小时的努力。