POSIX BRE可以表达所有常规语言吗?


13

似乎POSIX.1-2008定义的“基本正则表达式” 不支持替换a|b(尽管某些grep实现可以识别转义的版本\|)。

由于按定义,常规语言是根据联合来封闭的,这是否意味着POSIX BRE的表达能力不及有限自动机?还是有某种方法可以使用其他构造来模拟交替?

Answers:


17

的确,POSIX BRE语言不能表达所有正则表达式,因为它缺乏交替性。它甚至无法识别所有有限的语言,更不用说所有常规语言了。

例如,无法识别为BRE。为了证明这一点,请考虑顶级语法形式可能是:{ab,ba}

  • 它不能是单字符形式之一,因为该语言的单词长度>1
  • R
  • R{m,n}m=n=1
  • R1R2ab
    • R1abR2R1{ab,ba}
    • R1aabR2bR1R2ubR1uR1aba
    • R1abaRabR1R2

当“我们回到原始问题”时,这意味着查找BRE的唯一解决方案是识别该语言,即找到具有相同属性的较小BRE。这是无限下降的,因此没有具有所需属性的BRE。

我认为BRE可以识别的语言没有“很好”的特征,例如,“自动”的“很好”类可以识别的语言。

{www{a,b}}\(.*\)\1


1
如果您使用的是grep之类的工具,可以接受多个换行符分隔的表达式进行匹配,则将所有可能的轮换的笛卡尔积(例如{ab,ba} {ab,ba}变成{abba,abba,baab, baba})是否足以等同于任何给定的“ BRE-plus-alternation”以及任何常规语言?
Random832

1
@ Random832:尝试做(abc|bac)*
rici
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.