18

对于语法解析器,我曾经与Bison “玩”,它有其优点/缺点。

上周,我在SqlLite网站上注意到该引擎是由另一个语法解析器完成的: Lemon

阅读精简文档后听起来很棒。
你对这个解析器有什么反馈吗?

在 Google 和 Wikipedia 上无法真正看到相关信息(只是几个示例,相同的教程) 它似乎不太受欢迎。(堆栈溢出中没有标签[编辑:现在有:P])

4

2 回答 2

18

我们在固件项目中使用 Lemon 的原因是:

  • 生成的代码和内存占用量小。它产生了我发现的最小的解析器(我比较了由 flex、bison、ANTLR 和 Lemon 生成的具有相似复杂性的解析器);
  • 对嵌入式系统的出色支持:Lemon 不依赖于标准库,可以指定外部内存管理函数,调试日志是可移除的。
  • 公共领域许可证。根据 GPLv2 许可的 Lemon 有一个单独的分支,由于病毒许可,它不适合我们的需求。所以我们获取最新的 sqlite 源并从中编译 Lemon(它只包含两个文件);
  • 拉解析。它使代码比 Flex/Bison 解析代码更易于理解和维护。线程安全是我钦佩的额外奖励。
  • 与标记器的简单集成。我们的项目性质需要对具有可变标记大小的二进制流进行标记。这是一个非常容易实现的分词器,并与只有 3 个函数和一个反馈上下文变量的解析器 API 集成。我们研究了将 Lemon 与 re2c 和 Ragel 集成的方法,发现它们也很容易实现。
  • 非常简单的语法快速学习。
  • Lemon 明确地将分词器和词法分析器(解析器)的开发分开。我的开发流程从解析器语法的设计开始。在第一阶段,我可以通过几个 Parser(...) 调用来检查具有隐式令牌序列的复杂规则。Tokenizer 是在之后实现的。

柠檬当然不是灵丹妙药,它的应用范围有限。缺点:

  • 与 Bison 相比,Lemon 需要编写更多的规则,因为它简化了语法:没有重复和可选项,每个规则一个动作等。
  • 完整的 LALR(1) 解析器限制。
  • 只有C语言。

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

于 2011-02-19T11:06:43.680 回答
6

有趣的发现!我实际上并没有使用它,所以评论是基于阅读文档。

重新设计以便立即将词法分析与解析分开进行似乎具有优点。特别是,它有可能简化操作,例如处理多个或嵌套的源文件。基于 Lex 的yywrap()机制并不理想。它避免了所有全局变量并具有仔细的内存分配和释放控制,这应该对其有利(它允许选择分配器和释放器也有很大帮助 - 至少对于我工作的环境来说,内存分配总是一个问题) .

重新思考如何组织规则以及如何识别终端是一个好主意。

总而言之,它看起来像是对 Bison 的深思熟虑的重新设计。

根据引用的网页,它属于公共领域。

于 2010-12-26T08:06:52.200 回答