我正在评估在 C# 项目中使用Coco/R与ANTLR作为本质上是可编写脚本的邮件合并功能的一部分。要解析(简单)脚本,我需要一个parser。
我专注于 Coco/R 和 ANTLR,因为它们看起来都相当成熟且维护良好,并且能够生成不错的 C# 解析器。
然而,两者似乎都不是微不足道的,而且我很欣赏简单性- 特别是其他人的可维护性。
有人有什么建议吗?解析小语言的优点/缺点是什么 - 还是我完全在寻找错误的东西?这些集成到典型的持续集成设置中的效果如何?有哪些陷阱?
我们已经使用 Coco 2 年了,替换了我们以前使用的 Antler。对于典型的大数据查询(我们的应用程序),我们的经验是这样的。警告:我们依赖于完整的 Utf-8 处理,解析器是用 C++ 实现的。这些数字适用于具有大约 200 个 EBNF 产品的语言。
最初,Coco 的启动时间为 1.2 毫秒,并生成了几个 60 KBYTE 表用于映射 Utf-8。我们对 Coco 进行了许多本地增强,例如消除了大表,消除了 1.2 毫秒的启动时间,极大地增强了内部文档(以及生成代码中的文档)。
与 Antlr 相比,我们的(开源)版本 Coco 占用空间很小,而且速度非常快,没有启动延迟,而且……可以工作。它没有 Antler 的漂亮 UI,但是一旦我们开始使用 Coco,我们就不会想到它是一个问题。
ANTLR 是 LL(*),它与 PEG 一样强大,但通常更高效和灵活。当 k>1 时,LL(*) 退化为 LL(k),不需要任意前瞻。
如果您只是将数据合并到一个复杂的模板中,请考虑 Terence Parr 的StringTemplate 引擎。他是ANTLR背后的人。StringTemplate 可能比完整的解析器生成器更适合且更易于使用。这是一个功能非常丰富的模板引擎。
下载中有一个可用的 C# 端口。
基本上,coco/r 生成递归下降解析器并且只支持 LL(1) 语法,而 ANTLR 使用回溯(以及其他技术),这允许它处理更复杂的语法。coco/r 解析器更轻量级,更容易理解和部署,但有时很难将语法转换成 coco/r 理解的形式,因为它有一个前瞻性约束——对于许多常见的编程语言语法(例如 C++, SQL),这是不可能的。