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

时间:2012-05-16 02:17:37

标签: regex context-free-grammar regular-language

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

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

  • S->aAb
  • A->bB
  • B->cB|d

    是否存在可以获得正则表达式的现有算法?

    谢谢!

  • 1 个答案:

    答案 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是两个不相交的线性语法的串联。连接最终表达式的两个表达式。联盟的类似逻辑。