将CFG转换为CNF时,如何消除D→bD|D的单元产生式?
消除单元产生式并转换为乔姆斯基范式的步骤
针对给定的上下文无关文法,我们按以下步骤处理,重点解决D→bD|D中的单元产生式问题:
1. 先处理ε产生式(消除空产生式)
原文法中B→ε是空产生式,会影响其他规则的推导,先处理它:
- 对包含
B的规则,补充B推导出ε后的等价规则:S→DBC | Ba补充为S→DBC | Ba | DC | Da(当B→ε时,DBC变为DC,Ba变为Da)C→aCb | aC | Bb补充为C→aCb | aC | Bb | ab(当B→ε时,Bb变为ab)
- 删除
B→ε,此时B的规则为B→0B1 | 01
2. 消除单元产生式
单元产生式指形如A→B(A、B为非终结符,包括自循环A→A)的规则:
- 针对
D→bD|D:其中D→D是自循环的单元产生式,它不会产生任何新的推导结果,直接删除这条规则即可。处理后D的规则简化为D→bD - 检查其他非终结符(S、B、C)的规则,当前无其他单元产生式,无需额外处理
3. 转换为乔姆斯基范式(CNF)
CNF要求所有规则只能是非终结符→两个非终结符或非终结符→单个终结符,因此需要拆分规则并引入辅助非终结符:
步骤3.1 引入对应单个终结符的辅助非终结符
定义:
T_0→0T_1→1T_a→aT_b→b
步骤3.2 改写所有规则以符合CNF要求
- S的规则:
S→DBC拆分为S→D X1和X1→B C(X1为新辅助非终结符)S→Ba改写为S→B T_aS→DC保留(已符合二元非终结符规则)S→Da改写为S→D T_a
- D的规则:
D→bD改写为D→T_b D
- B的规则:
B→0B1拆分为B→T_0 X2和X2→B T_1(X2为新辅助非终结符)B→01改写为B→T_0 T_1
- C的规则:
C→aCb拆分为C→T_a X3和X3→C T_b(X3为新辅助非终结符)C→aC改写为C→T_a CC→Bb改写为C→B T_bC→ab改写为C→T_a T_b
最终的乔姆斯基范式文法
S → D X1 | B T_a | D C | D T_a X1 → B C X2 → B T_1 X3 → C T_b D → T_b D B → T_0 X2 | T_0 T_1 C → T_a X3 | T_a C | B T_b | T_a T_b T_0 → 0 T_1 → 1 T_a → a T_b → b
内容的提问来源于stack exchange,提问作者Deepu
相关产品推荐
相关产品推荐

