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,并进一步转换为正则表达式。但我不知道有一个直接的/较短的方法来达到这个目的。也许这个问题在国内更为普遍