11

我每天看到无数关于“如何用正则表达式做 X”的帖子。对他们中的大多数人来说,最好的回应似乎是老实说,“你为什么要用锤子敲螺丝?” 但是正则表达式无处不在,而且语法大多是可移植的,特别是如果你远离花哨的部分。

是否有任何与 regexen 等效但在功能和可配置性方面更上一层楼的东西?一个“你可以在任何地方使用它”的各种解析库,最好是使用极其简洁的 DSL 作为其接口?

我已经使用了一些 Ragel,但是由于预处理步骤,我会犹豫将它推荐给某人,因为“使用它而不是一些毛茸茸的正则表达式”。从 Obj-C 中使用它很尴尬,而且我希望它对于没有 compile-link-run 作为其标准操作过程的一部分的语言来说会非常尴尬。

我正在寻找的是能够通过“inline-online-universal”测试的东西。

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

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

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

我所知道的大多数工具都属于“在线”。他们离线预处理语法并以目标语言(C、Python、Java、C++……)输出代码。它们是独立的工具,本身并没有集成到语言环境中。

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

4

2 回答 2

1

https://github.com/leblancmeneses/NPEG

实现 PEG。

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

它仅与 C# 内联,与所有其他程序脱机。C# 也有离线版本。

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

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

于 2012-10-19T00:50:09.627 回答
0

看看 Lex/Yacc 或它们的对应物 Flex/Bison(或 Coco,或所有其他“编译器”生成器)。该组合可用于解析复杂的文本数据,其语法(可以说)比正则表达式更具可读性。

不过,对于简单的问题,只要正则表达式绰绰有余,无论如何都要使用它们。

于 2012-10-12T09:14:09.257 回答