regex - 插入式、可移植的解析

标签 regex api parsing dsl context-free-grammar

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

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

我已经使用了一些 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 中提供工作演示解析器来证明所提议的解决方案满足内联在线通用要求。演示示例由作者决定,但仅使用正则表达式应该会很痛苦,但使用适当的解析器则微不足道。

    最佳答案

    https://github.com/leblancmeneses/NPEG

    实现 PEG。

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

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

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

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

    关于regex - 插入式、可移植的解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12484082/

    相关文章:

    ruby - 从电子邮件中删除签名和回复

    java - 基本 String.match 不匹配

    api - 如何获取页面布局中的字段

    php - 在我对 API 中的用户进行身份验证后,我应该如何确保他们没有访问权限太久

    .net - XAML 解析器如何识别 NameScopes?

    javascript - 将 JSON 转换为字符串时如何解决此 Javascript 错误?

    正则表达式仅捕获 1 个空格,除非被特定模式包围

    regex - Lua中如何从字符串中提取数字?

    regex - 匹配字符串的最后一个字符失败

    api - 高级搜索 REST API