Regex 如果我们知道CFG只生成正则语言,我们能得到相应的正则表达式吗?

Regex 如果我们知道CFG只生成正则语言,我们能得到相应的正则表达式吗?,regex,context-free-grammar,regular-language,Regex,Context Free Grammar,Regular Language,正如我们所知,给定一个正则语法,我们有算法来得到它的正则表达式 但是如果给定的语法是上下文无关语法(但它只生成常规语言),比如 S->aAb A->bB B->cB|d 是否有任何现有的算法可以得到一般的正则表达式 谢谢!在最普遍的意义上,没有解决方案。确定CFG是否是正则的问题是不可判定的(格雷巴赫定理,的最后3页)。如果我们可以将CFG转换为正则表达式,我们可以在任何语法上使用该算法,并使用其成功/失败来确定语言是否是正则的 所以,当一个CFG生成一个正则语言时,要么它的语言已经被知道(

正如我们所知,给定一个正则语法,我们有算法来得到它的正则表达式

但是如果给定的语法是上下文无关语法(但它只生成常规语言),比如


  • S->aAb
  • A->bB
  • B->cB|d
  • 是否有任何现有的算法可以得到一般的正则表达式


    谢谢!

    在最普遍的意义上,没有解决方案。确定CFG是否是正则的问题是不可判定的(格雷巴赫定理,的最后3页)。如果我们可以将CFG转换为正则表达式,我们可以在任何语法上使用该算法,并使用其成功/失败来确定语言是否是正则的

    所以,当一个CFG生成一个正则语言时,要么它的语言已经被知道(因此可以直接转换为正则表达式),要么它的语法属性可以被利用。每个属性都有自己的转换为正则表达式的算法

    例如,如果语法为,则每个产品的形式为A->bC或A->A。可将其转换为NFA,其中:

    1) 每个非终端都有一个状态,加上一个接受状态

    2) 开始符号S是开始状态

    3) A->bC是输入B上从A到B的转换

    4) A->A是从A到输入A的接受状态的转换

    然后可以通过状态消除将该NFA转换为正则表达式(共页第5-8页)。 左线性文法的类似过程将交换开始和接受状态


    除此之外,还可以利用正则语言的闭包特性。例如,问题中的语言不是线性的,但可以写成S->S'b,S'->aA。现在S'是右线性的,S是两个不相交的线性文法的串联。将两个表达式连接为最终表达式。类似的联合逻辑。

    我了解到有一些算法可以将这种CFG转换为有限自动机(实际上是NFA)。然后这个NFA可以转换为DFA,并进一步转换为正则表达式。但我不知道有一个直接的/较短的方法来达到这个目的。也许这个问题在国内更为普遍