正如我们所知,给定一个常规语法,我们有算法来获得它的正则表达式。
但是如果给定的语法是无上下文语法(但它只生成常规语言),比如
S->aAb
A->bB
B->cB|d
是否存在可以获得正则表达式的现有算法?
谢谢!
答案 0 :(得分:2)
从最普遍的意义上说,没有解决方案。确定CFG是否规则的问题是不可判定的(Greibach定理,http://www.cis.upenn.edu/~jean/gbooks/PCPh04.pdf的最后3页)如果我们可以将CFG转换为正则表达式,我们可以在任何语法上使用该算法并使用其成功/失败来确定该语言是否规则。
因此,当已知CFG生成常规语言时,其语言已知(因此可直接转换为RegEx),或者可以利用语法的某些属性。每个属性都有自己的转换为RegEx的算法。
例如,如果语法是right linear,则每个产品的形式为A-> bC或A-> a。这可以转换为NFA,其中:
1)每个非终端都有一个状态,加上一个接受状态。
2)起始符号S是开始状态。
3)A-> bC是输入b上从A到B的转变
4)A-> a是输入a上从A到接受状态的转换。
然后可以通过状态消除将此NFA转换为正则表达式(http://www.math.uaa.alaska.edu/~afkjm/cs351/handouts/regular-expressions.pdf的第5-8页)。 左线性语法的类似过程将启动并接受交换的状态。
除此之外,人们可以利用常规语言的闭包属性。例如,问题中的语言不是线性的,但可以写成S-> S'b,S' - > aA。现在S'是右线性的,S是两个不相交的线性语法的串联。连接最终表达式的两个表达式。联盟的类似逻辑。