C# Coco/R vs.ANTLR

C# Coco/R vs.ANTLR,c#,parsing,antlr,cocor,C#,Parsing,Antlr,Cocor,我正在评估在C#项目中使用vs.作为基本上可编写脚本的邮件合并功能的一部分。要解析(简单)脚本,我需要一个解析器 我将重点放在Coco/R和ANTLR上,因为它们看起来都相当成熟,维护良好,并且能够生成像样的C#解析器 然而,这两种方法的使用似乎都不是那么简单,而且简单性是我非常欣赏的,尤其是可维护性 有人有什么建议吗?对一种小型语言进行语法分析的利弊是什么?或者我是在研究完全错误的事情吗?这些集成到典型的持续集成设置中的效果如何?陷阱是什么 相关问题:嗯,很多问题,比如,,./p>< P>如果

我正在评估在C#项目中使用vs.作为基本上可编写脚本的邮件合并功能的一部分。要解析(简单)脚本,我需要一个解析器

我将重点放在Coco/R和ANTLR上,因为它们看起来都相当成熟,维护良好,并且能够生成像样的C#解析器

然而,这两种方法的使用似乎都不是那么简单,而且简单性是我非常欣赏的,尤其是可维护性

有人有什么建议吗?对一种小型语言进行语法分析的利弊是什么?或者我是在研究完全错误的事情吗?这些集成到典型的持续集成设置中的效果如何?陷阱是什么


相关问题:嗯,很多问题,比如,,./p>< P>如果你只是简单地把数据合并成一个复杂的模板,考虑Terence Parr的。他是ANTLR背后的人。StringTemplate可能比完整的解析器生成器更适合使用。这是一个功能非常丰富的模板引擎


在中有一个C#端口可用。

基本上,coco/r生成递归下降解析器,只支持LL(1)语法,而ANTLR使用回溯(以及其他技术),这允许它处理更复杂的语法。COCO/R解析器的重量更轻,更易于理解和部署,但有时它会使语法变成一个COCO/R理解的形式,因为它的一个先行约束——对于许多常用的编程语言文法(例如C++、SQL),根本不可能。

< P> ANTLR是LL(*),它和PEG一样强大。虽然通常更高效和灵活。对于k>1,LL(*)退化为LL(k)。不需要一个任意的前瞻。

我们已经使用椰子2年了,取代了以前使用的鹿角。对于一个典型的大数据查询(我们的应用程序),我们的经验是这样的。Caveat:我们依赖于完全UTF-8处理,而在C++中实现了解析器。这些数字是针对一种拥有大约200个EBNF产品的语言

  • Antler:260 usecs/query和108兆字节的内存占用,用于生成的解析器/词法分析器
  • Coco:220 usecs/query和用于解析器/扫描仪的70 KBYTE内存占用
最初,Coco的启动时间为1.2毫秒,并生成了几个60 KBYTE的表,用于映射Utf-8。我们对Coco进行了许多本地增强,例如消除了大表,消除了1.2毫秒的启动时间,极大地增强了内部文档(以及生成代码中的文档)


我们版本的(开源)Coco与Antlr相比占地面积很小,速度非常快,没有启动延迟,只是。。。作品它没有Antler的漂亮用户界面,但一旦我们开始使用Coco,我们就不会想到这是一个问题。

我看到了-你不会碰巧尝试过吗?我对使用一个可能测试不好的端口有点怀疑。@Earnon Nerbonne-我在一个概念验证项目中使用过它,没有任何问题,但无法评论它测试得有多好。祝你好运。这个答案可能并没有真正满足我的需要——但它确实是一个起点——这使它成为我的最佳答案:-)。有可能避免在ANTLR中使用扫描仪吗?我有点担心它的可维护性,因为可行的标记集可能取决于活动语法规则(即类似于C#中的“from”等条件关键字)。当然。传入任何实现令牌流的对象。CoCo中的LL(1)限制没有那么严格。您可以为需要消除歧义的情况添加代码处理程序。ANTLR不会生成移位减少解析器。这将是一个LR解析器,而ANTLR产生LL解析器。@费尔南多冈萨雷斯桑切斯:谢谢,是的,我已经发现了,但忘记了这个答案-我会编辑。为了公平一些,你必须让OP考虑提高ANTLR与你在COCO中所做的相同的投资水平。考虑到手动调整的“加速比”大约为10-20%,这似乎是可以实现的,而且我听说ANTLR4无论如何都比ANTLR3快。3个数量级的内存占用要有趣得多;你有没有把所有的空间都挖到哪里去了?