【问题标题】:Coco/R vs. ANTLRCoco/R 与 ANTLR
【发布时间】:2010-04-27 15:03:59
【问题描述】:

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

我专注于 Coco/R 和 ANTLR,因为它们看起来都相当成熟且维护良好,并且能够生成不错的 C# 解析器。

然而,两者似乎都不是微不足道的,而且 simplicity 是我很欣赏的 - 特别是其他人的 可维护性

有人有什么建议吗?解析小语言的优点/缺点是什么 - 还是我完全在寻找错误的东西?这些集成到典型的持续集成设置中的效果如何?有什么陷阱?

相关:嗯,很多问题,比如12345

【问题讨论】:

    标签: c# parsing antlr cocor


    【解决方案1】:

    我们已经使用 Coco 2 年了,更换了我们以前使用的 Antler。对于典型的大数据查询(我们的应用程序),我们的经验是这样的。警告:我们依赖于完整的 Utf-8 处理,解析器是用 C++ 实现的。这些数字适用于具有大约 200 个 EBNF 产品的语言。

    • Antler:260 usecs/query 和 108 MEGABYTE 内存占用,用于生成的解析器/词法分析器
    • Coco:220 微秒/查询和 70 KBYTE 内存占用用于解析器/扫描器

    最初,Coco 的启动时间为 1.2 毫秒,并生成了几个 60 KBYTE 表用于映射 Utf-8。我们对 Coco 进行了许多本地增强,例如消除了大表、消除了 1.2 毫秒的启动时间、极大地增强了内部文档(以及生成代码中的文档)。

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

    【讨论】:

    • 公平地说,你必须让 OP 考虑用你在 CoCo 中的相同投资水平来增强 ANTLR。鉴于您手动调整的“加速”约为 10-20%,这似乎触手可及,而且我听说 ANTLR4 无论如何都比 ANTLR3 快。 3 个数量级的内存占用要有趣得多;您是否深入了解了所有空间的去向?
    【解决方案2】:

    ANTLR 是 LL(*),它与 ​​PEG 一样强大,但通常更高效和灵活。 LL(*) 退化为 LL(k),因为 k>1 一个任意的前瞻是不必要的。

    【讨论】:

    • 是否可以避免在 ANTLR 中使用扫描仪?我有点担心它的可维护性,因为可行的标记集可能取决于活动的语法规则(即有点像条件关键字,例如 C# 中的“from”)。
    • 当然。传入任何实现 TokenStream 的对象。
    【解决方案3】:

    如果您只是将数据合并到一个复杂的模板中,请考虑 Terence Parr 的StringTemplate engine。他是ANTLR背后的人。 StringTemplate 可能比完整的解析器生成器更适合且更易于使用。这是一个功能非常丰富的模板引擎。

    downloads 中有一个可用的 C# 端口。

    【讨论】:

    • 我看到了——你不会碰巧尝试过吗?我对使用可能测试不佳的端口有点怀疑。
    • @Earnon Nerbonne - 我已经在一个概念验证项目中使用它,没有任何问题,但无法评论它的测试效果。祝你好运。
    • 这个答案可能并没有真正满足我的需求 - 但它肯定是一个起点 - 这使它成为我的最佳答案:-)。
    【解决方案4】:

    基本上,coco/r 生成递归下降解析器并且只支持 LL(1) 语法,而 ANTLR 使用回溯(以及其他技术),这使其能够处理更复杂的语法。 coco/r 解析器更轻量级,更容易理解和部署,但有时很难将语法转换成 coco/r 理解的形式,因为它有一个前瞻性约束——对于许多常见的编程语言语法(例如 C++, SQL),这根本不可能。

    【讨论】:

    • CoCo 中的 LL(1) 限制并不那么严格。您可以为需要消除歧义的情况添加代码处理程序。
    • ANTLR 不生成移位归约解析器。那将是一个 LR 解析器,而 ANTLR 生成 LL 解析器。
    • @Fernando Gonzalez Sanchez:谢谢,是的,我已经发现了,但忘记了这个答案 - 我会编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多