正常表达的“不可翻译”语法

时间:2013-02-05 17:13:39

标签: regex grammar context-free-grammar automata

有这样的事吗?

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

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

但是正则表达式可以产生诸如aab,abb等字样......其中a和b不相等。

有解决方案吗?类似于:a * b *如果#a = #b

编辑:我认为没有解决方案。

对此有何正确解释?这实际上是我作业的一小部分,我真的不知道该怎么回答,因为没有解决方法将语法翻译成正则表达式。

2 个答案:

答案 0 :(得分:3)

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

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

例如,在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)

答案 1 :(得分:0)

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

对于无上下文的语言存在类似的理论。有些语言无法通过无上下文语法来描述。