【问题标题】:"Untranslatable" Grammars to Regular Expression“不可翻译”的语法到正则表达式
【发布时间】:2013-01-20 16:58:10
【问题描述】:

有这种事吗?

例如,S -> aSb | ^ (可能的词: ^, ab, aabb, aaabbb, aaaabbbb, ...)

据我所知,唯一与上述语法非常匹配的正则表达式是:a*b*

但正则表达式可以生成 aab、abb、... 等单词,其中 a 和 b 不相等。

有解决办法吗?类似于:a*b* if #a = #b

编辑:我认为没有解决办法。

对此的正确解释是什么?这实际上是我的家庭作业的一个sn-p,我真的不知道该回答什么,因为将语法翻译成正则表达式没有解决方案。

【问题讨论】:

    标签: regex grammar context-free-grammar automata


    【解决方案1】:

    在形式语言理论中,一种称为“泵引理”的东西可以用来证明某些句子(语言)集合不能用正则表达式来描述。参见维基百科http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages。您从要描述的语言开始,并使用抽水引理来寻找矛盾。您的示例的证明实际上在该维基百科页面上。

    上下文无关语言也存在类似的理论。有些语言无法用上下文无关语法来描述。

    【讨论】:

      【解决方案2】:

      如果您在谈论形式语言理论,那么当然所有非常规语法(如您的示例中)都不能用正则表达式(根据定义)来表达。

      但是,如果您想知道不同的正则表达式风格(在编程语言/正则表达式库中)可以做什么,那么您可以匹配各种非常规语法/语言。

      例如,在 Perl/PCRE 中,您可以将示例语言与以下任何一种语言匹配:

      • 使用递归/子模式调用:

        ^(a(?1)b)$

      • 使用反向引用(带有条件):

        ^(?:a(?=a*(b(?(1)\1))))+\1$|^$

      您可能对此问题和答案感兴趣:Match a^n b^n c^n (e.g. "aaabbbccc") using regular expressions (PCRE)

      【讨论】:

      • 这个问题其实和我们的课有关,不知道能不能用PCRE中用到的符号。我们使用的唯一符号是 * 和 +(kleene 星号和加号)。
      • 我真的认为它不能被翻译成正则表达式。我现在想知道在我的作业中要回答什么。
      • @user1846682,你的作业似乎是形式语言理论。在这种情况下,答案的第一句话适用。不,你不能为非常规语言制作正式的正则表达式。
      • ^(?:a(?=a*(b\1?)))*\1$|^$ 也适用于 .NET,但不适用于 JS。似乎反向引用用于匹配重复中的先前捕获(并且并非所有正则表达式引擎都支持这一点)?
      • @nhahtdh,也适用于 Java。不了解 JS(尽管在那里不会有太多期望)。在 JS 中,似乎 backref 在第一次捕获后没有被重新定义。
      猜你喜欢
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多