柠檬是否具有功效?

18

对于语法解析器,我过去常用的是Bison,它有其优缺点。

上周,我在SqLite网站上注意到引擎使用了另外一个语法解析器:Lemon

阅读了一些简单的文档后感觉不错。
你对这个解析器有什么反馈吗?

在Google和维基百科上没有找到相关信息(只有一些例子和相同的教程)。它似乎并不很流行。(在Stack Overflow中没有标签 [译者注:现在已经有标签了 :P])

2个回答

18
我们在固件项目中使用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语言。

在做出选择之前,请权衡利弊。我已经完成了我的选择 ;-)


5
用C语言编写的程序可能会被视为真正的优势! - menjaraz
@menjaraz,我认为Adam考虑了Lemons的目标语言。 - Prof. Falken
它充满了优雅。它被分布为一个C文件,你可以不需要编译器参数就可以将其盲目编译,而且解析器生成器exe已经构建好了。 - doug65536
在这个上下文中,“仅限于C语言”是什么意思?(同时@ doug65536),你不能使用非C语言的操作吗? - einpoklum
@einpoklum 我的意思是,Lemon工具本身由两个文件组成,一个是Lemon工具本身的C文件,另一个是生成的解析器的模板。您可以轻松地编译lemon.c以为任何平台生成解析器生成器。是的,操作是用C编写的。您可以解析任何可以使用LALR解析器解析的语言。 - doug65536

6
有趣的发现!我并没有实际使用过它,因此评论是基于阅读文档的。
重新设计使词法分析与解析分开似乎立即具有优点。特别是,它有潜力简化处理多个或嵌套源文件等操作。基于Lex的yywrap()机制并不理想。它避免了所有全局变量,并且具有仔细的内存分配和释放控制,这应该算作它的优点(它允许选择分配器和释放器也很有帮助——至少对于我工作的环境来说,内存分配总是一个问题)。
重新考虑规则组织和终端标识的方式是一个好主意。
总的来说,它看起来是Bison的一个经过深思熟虑的重新设计。
根据参考网页,它在公共领域中。

1
我同意你的观点,听起来是Bison的一个不错的重启。我会在我的应用程序中使用它。当然,我会在Stack上提供反馈;) - Stef
1
@Stef 你承诺给我们的反馈怎么样了? :-) - kravemir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接