我每天看到无数关于“如何用正则表达式做 X”的帖子。对他们中的大多数人来说,最好的回应似乎是老实说,“你为什么要用锤子敲螺丝?” 但是正则表达式无处不在,而且语法大多是可移植的,特别是如果你远离花哨的部分。
是否有任何与 regexen 等效但在功能和可配置性方面更上一层楼的东西?一个“你可以在任何地方使用它”的各种解析库,最好是使用极其简洁的 DSL 作为其接口?
我已经使用了一些 Ragel,但是由于预处理步骤,我会犹豫将它推荐给某人,因为“使用它而不是一些毛茸茸的正则表达式”。从 Obj-C 中使用它很尴尬,而且我希望它对于没有 compile-link-run 作为其标准操作过程的一部分的语言来说会非常尴尬。
我正在寻找的是能够通过“inline-online-universal”测试的东西。
(内联)您可以将符号与您的其他代码内联,就像使用正则表达式一样。
(在线)您可以像运行其他代码一样运行生成的解析器,这意味着在 Python 之类的情况下,在输入到 REPL 之后立即运行。
(通用)您可以移动到不同的语言/平台,并为您的解析器使用几乎相同的代码,模方言差异。实际上,我会对 Python、Ruby、C、Java 和 Haskell 中的某些东西感到满意。
我所知道的大多数工具都属于“在线”。他们离线预处理语法并以目标语言(C、Python、Java、C++……)输出代码。它们是独立的工具,本身并没有集成到语言环境中。
我有 PEG 解析器和 lex/yacc 组合的建议。解析器组合库也可能是一个不错的选择。无论您提出什么建议,我都希望看到证明它符合这些测试。您的答案应该通过在 Python、C 和 Haskell 中提供工作演示解析器来证明所提议的解决方案满足内联在线通用要求。演示示例由作者决定,但仅使用正则表达式应该会很痛苦,但使用适当的解析器则微不足道。