美文网首页
CFG转CNF(附代码)

CFG转CNF(附代码)

作者: WILL_HUNTING | 来源:发表于2019-06-20 18:32 被阅读0次

定理3.6 任一上下下文无关文法都可以用乔姆斯基范式的上下文无关文法产生。

证明思路 能够把任一上下文无关文法G转换成乔姆斯基范式。转换分几个阶段把不符合要求的规则替换成等价的符合要求的规则。首先,添加一个新的起始变元。然后删除所有形如A \rightarrow \epsilon\epsilon规则,再删除所有形如A \rightarrow B的单一规则。在删除时,要对文法做适当的弥补,使得它仍然产生相同的语言。最后,把所有留下来的规则转换成适当的形式。

证明

  1. 首先,添加一个新的起始变元S_0和规则S_0 \rightarrow S,其中S是原来的起始变元。这样可以保证起始变元不出现在规则的右边。

  2. 第二阶段,考虑所有的\epsilon规则。删除一条\epsilon规则A \rightarrow \epsilon,这里A不是起始变元。对在规则右边出现的每一个A,删除这个A后得到一条新的规则。换句话说,如果R \rightarrow uAv是一条规则,其中u和v是变元和终结符的字符串,则添加规则R \rightarrow uv。对A的每一次出现都如此进行,因而对于规则R \rightarrow uAvAw,要添加R \rightarrow uvAwR \rightarrow uAvw,和R \rightarrow uwv。如果有规则R \rightarrow A,则要添加R \rightarrow \epsilon,除非前面已经删除过规则R \rightarrow \epsilon。重复上述步骤,直至删除所有不包括起始变元的\epsilon规则。

  3. 第三阶段,处理所有的单一规则。删除一条单一规则A \rightarrow B。然后,只要有一条规则B \rightarrow u,就要添加规则A \rightarrow u,除非A \rightarrow u是已在前面被删除的单一规则。和前面一样,u是变元和终结符的字符串。重复上述步骤,直至删除所有的单一规则。

  4. 最后,把所有留下的规则转化成适当的形式。把每一条规则A \rightarrow u_1 u_2 \dots u_k替换成规则A \rightarrow u_1 A_1, A_1 \rightarrow u_2 A_2, \dots, A_{k-2} \rightarrow u_{k-1} u_k,其中k \geqslant 3,每一个u_i是一个变元或终结符,A_i是新的变元。至此,所有的规则只能是下述几种形式:
    1 S_0 \rightarrow \epsilon
    2 A \rightarrow a_i
    3 A \rightarrow BC
    4 A \rightarrow a_i B
    5 A \rightarrow Ba_i
    6 A \rightarrow a_i a_j

其中a_i, a_j是终结符,A、B、C是变元,S_0是开始阶段引入的新起始变元。前3中规则已经符合要求。为了把后三种规则转换成符合要求的规则,对每一个终结符a_i引入一个新的变元U_i和规则U_i \rightarrow a_i(如果a_i不出现在规则的右边,则不需要引入),把后3中规则分别替换成A \roghtarrow U_iBA \rightarrow BU_iA \rightarrow U_iU_j

CFG转CNF代码(github)

相关文章

网友评论

      本文标题:CFG转CNF(附代码)

      本文链接:https://www.haomeiwen.com/subject/uqzjqctx.html