为CFL编写GNF语法

时间:2013-09-20 14:20:05

标签: grammar context-free-grammar finite-automata automata automata-theory

您好我想问你这个问题。

我应该用Greibach Normal Form计算(手动)语法,生成语言

L = {ai bj ck | i + j = 2k and k >= 1}

我真的不知道。有人可以帮帮我吗?

提前致谢
CHRISS

2 个答案:

答案 0 :(得分:1)

针对您的语言La = {ai bj ck | i + j = 2k and k >= 1}的上下文免费语法CFG。

以下是语言L = {ai bj ck | i + j = k and k >= 1}的答案。

<强> CFG:

S --> aAc | bBc |
A --> aAc | B   |  ^
B --> bBc | ^ 

什么是GNF?

CFG的一个重要形式是Greibach Normal Form GNF:

   A --> aα   
   Where α ∈ V* (any number of variables including zero)

注意: nul ^不能是任何生产接受起始符号S的RHS上的符号,并且如果S --> ^是生产的话,则会限制语法然后S不能出现在任何其他语法生成的RHS上。

任何CFG都可以用GNF格式编写。

如何在GNF中转换CFG?

CFG中的注释我上面写的是nul作品A --> ^B --> ^以及单位作品A --> B。 GNF形式不允许单位制作和零制作。尽管其他作品可以通过在语法中引入GNF制作而容易地以GNF形式书写,例如S --> aAc可以重写为S --> aAC and C --> c

下面我将重写相当于语言的CFG并删除名为简化CFG的零和单元制作。

简化CFG:

S --> aAc | bBc | ac | bc
A --> aAc | bBc 
B --> bBc | bc

现在,通过引入新的GNF生成C --> c并在其他生产规则中将c替换为C,可以轻松地将此语法转换为GNF形式。

语言L的GFN

S --> aAC | bBC | aC | bC
A --> aAC | bBC 
B --> bBC | bC
C --> c

我错误地写了一个错误的语法,我将更新语言La的答案

修改

La = {ai bj ck | i + j = 2k and k >= 1}

关于L a 的CFG:

S --> aaAc | bbBc | abBc
A --> aaAc | B    | abBc |  ^
B --> bbBc | ^ 

简化CFG:

S --> aaAc | bbBc | abBc | aac | bbc | abc 
A --> aaAc | bbBc | abBc | aac | abc
B --> bbBc | bbc 

GFN代表语言L a

添加三个新的制作规则:X --> aY --> bZ --> c

更改程序员并按变量替换终端:

S --> aXAZ | bYBZ | aYBZ | aAZ | bYZ | aYZ  
A --> aXAZ | bYBZ | aYBZ | aXZ | aYZ
B --> bYBZ | bYZ
X --> a
Y --> b
Z --> c

答案 1 :(得分:1)

关于以下答案La = {ai bj ck | i + j = k and k >= 1}的CFG错误

您的简化CFG:

S --> aAc | bBc | ac | bc . A --> aAc | bBc . B --> bBc | bc .

由于上述语言L = {ai bj ck | i + j = k and k >= 1}生成语言aabccc,但您的简化CFG不会生成语言。

正确的CFG

简化CFG

S --> aAc | bBc | ac | bc A --> aAc | bBc | bc | ac B --> bBc | bc

纠正它,第二语言有同样的问题。

谢谢!