对于语法解析器,我过去常用的是Bison,它有其优缺点。 上周,我在SqLite网站上注意到引擎使用了另外一个语法解析器:Lemon 阅读了一些简单的文档后感觉不错。 你对这个解析器有什么反馈吗? 在Google和维基百科上没有找到相关信息(只有一些例子和相同的教程)。它似乎并不很流行。(在Stack Overflow中没有lemon标签 [译者注:现在已经有标签了 :P])
我们在固件项目中使用Lemon的原因是: 生成的代码小巧,内存占用低。它生成了我发现的最小的解析器(我比较了flex、bison、ANTLR和Lemon生成的复杂度相似的解析器); 对嵌入式系统的支持非常出色:Lemon不依赖标准库,您可以指定外部内存管理函数,调试日志可移除。 公共领域许可证。有一个单独的Lemon分支是根据GPLv2许可证授权的,但由于其病毒式许可证,不适合我们的需求。因此,我们获取最新的sqlite源文件并从中编译出Lemon(它只包含两个文件); Pull-parsing。与Flex/Bison解析代码相比,它使代码更加简单易懂且易于维护。线程安全是额外的奖励。 与标记生成器的简单集成。我们的项目性质需要将二进制流进行标记化,并具有变量标记大小。实现标记生成器并将其与仅包含3个函数和一个反馈上下文变量的解析器API集成相当容易。我们调查了将Lemon与re2c和Ragel集成的方法,并发现它们也很容易实现。 非常简单的语法,易于学习。 Lemon显式分离标记生成器和词法分析器(解析器)的开发。我的开发流程从设计解析器语法开始。我能够通过几个Parser(...)调用在此第一阶段使用隐式标记序列检查复杂规则。标记生成器在此之后实现。 当然,Lemon不是万能钥匙,它有着局限性。缺点包括: 与Bison相比,由于语法简化(没有重复、可选项,一个动作对应一个规则等),Lemon需要编写更多规则。 完整的LALR(1)解析器限制。 仅支持C语言。 在做出选择之前,请权衡利弊。我已经完成了我的选择 ;-)
有趣的发现!我并没有实际使用过它,因此评论是基于阅读文档的。重新设计使词法分析与解析分开似乎立即具有优点。特别是,它有潜力简化处理多个或嵌套源文件等操作。基于Lex的yywrap()机制并不理想。它避免了所有全局变量,并且具有仔细的内存分配和释放控制,这应该算作它的优点(它允许选择分配器和释放器也很有帮助——至少对于我工作的环境来说,内存分配总是一个问题)。重新考虑规则组织和终端标识的方式是一个好主意。总的来说,它看起来是Bison的一个经过深思熟虑的重新设计。根据参考网页,它在公共领域中。
lemon.c
以为任何平台生成解析器生成器。是的,操作是用C编写的。您可以解析任何可以使用LALR解析器解析的语言。 - doug65536