Drop-in,便携式解析

Jer*_*man 11 regex api dsl parsing context-free-grammar

我每天都会看到关于"如何用regexen做X"的帖子.而对他们中的大多数人的最佳反应似乎就是老实说,"你为什么要用锤子开螺丝?" 但regexen无处不在,语法大多是可移植的,特别是如果你远离花哨的位.

有没有相当于regexen但在功能和可配置性方面更上一层楼的东西?一个"你可以在任何地方使用它"解析各种各样的库,最好用一个光彩照人的简洁DSL作为它的界面?

我有点使用Ragel,但由于预处理步骤,我会毫不犹豫地推荐给某人"使用这个而不是一些毛茸茸的正则表达式".从Obj-C中使用它很尴尬,我认为从一个没有编译链接运行的语言来看它将是非常尴尬的,因为它是标准操作过程的一部分.

我正在寻找的东西将通过"内联在线通用"测试.

  1. (内联)您可以使用其他代码内联编写符号,就像使用正则表达式一样.

  2. (在线)您可以像运行其他代码一样运行生成的解析器,这意味着在Python之类的情况下输入到REPL之后.

  3. (通用)您可以移动到不同的语言/平台,并为解析器使用几乎相同的代码,模数方差.实际上,我对使用Python,Ruby,C,Java和Haskell的东西感到满意.

我所知道的大多数工具都是"在线".他们离线预处理语法并用目标语言(C,Python,Java,C++ ......)吐出代码.它们是独立的工具,它们本身并没有集成到语言环境中.

我有PEG解析器和lex/yacc组合的建议.解析器组合库也可能是一个很好的选择.无论你提出什么建议,我都希望看到它能够满足这些测试要求.您的答案应该通过在Python,C和Haskell中提供可用的演示解析器来证明所提出的解决方案符合内联在线通用要求.演示示例由作者决定,但使用正则表达式应该是痛苦的,但使用适当的解析器则是微不足道的.

Leb*_*ses 1

https://github.com/leblancmeneses/NPEG

实施 PEG。

满足所有 3 个...让我解释一下。

它仅与 C# 内联,与所有其他语言离线。C# 也有离线版本。

我目前支持离线版本:C/C++/Javascript(现在本地)/Java 通过所有单元测试 - 使其通用。添加另一种语言需要 25.84 小时(创建离线 Javascript 版本需要多长时间)

让每种语言都在线会需要大量维护(可能),但我花了很多工作和时间来支持当前的离线版本。我现在可以集中精力构建语法优化器和工具来对语法规则进行单元测试,所有离线版本都会受益。