2013-02-05 152 views
3

有没有这样的事情?“无法翻译”的文法到正则表达式

像例如,S - > ASB | ^(可能的话:^,AB,AABB,AAABBB,aaaabbbb,...)

从我所获悉,密切配合上述语法唯一的正则表达式是:A * B *

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

有没有解决方案?喜欢的东西:A * B *如果#A#B =

编辑:我觉得没有解决这个。

这是什么正确的解释?这实际上是我家庭作业的一部分,我真的不知道该怎么回答,因为在将语法翻译为正则表达式时没有解决方案。

回答

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)

+0

问题实际上涉及到我们班,我不知道我们是否可以使用在PCRE中使用的符号。我们使用的唯一符号是*和+(kleene star和plus)。 – user1846682

+0

我真的认为它不能被翻译成正则表达式。我现在想知道我的作业该怎么回答。 – user1846682

+0

@ user1846682,你的家庭作业似乎是在形式语言理论。在这种情况下,答案的第一句适用。那不是,你不能为非常规语言制定正式的正则表达式。 – Qtax

0

在形式语言理论的东西叫做“抽引理”,可以用来证明某套句子(语言)不能被描述正则表达式。请参阅维基百科http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages。你从你想描述的语言开始,用抽象引理找出矛盾。你的例子的证明实际上在那个维基百科页面上。

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