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