【问题标题】:Writing GNF grammar for a CFL为 CFL 编写 GNF 语法
【发布时间】:2013-09-20 14:20:04
【问题描述】:

你好,我想问你这个问题。

我应该(手动)计算格雷巴赫范式的语法,生成语言

L = {a<sup>i</sup> b<sup>j</sup> c<sup>k</sup> | i + j = 2k and k &gt;= 1}

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

提前致谢
克里斯

【问题讨论】:

  • 您的问题到底是什么?
  • 应该是可行的。首先创建一个语法,然后转换为 GNF。或者解释一下为什么这对你不起作用。

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


【解决方案1】:

适用于您的语言的上下文无关语法 CFG L<sub>a</sub> = {a<sup>i</sup> b<sup>j</sup> c<sup>k</sup> | i + j = 2k and k &gt;= 1}

下面是语言L = {a<sup>i</sup> b<sup>j</sup> c<sup>k</sup> | i + j = k and k &gt;= 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 ^ 不能是任何产生式的 RHS 上的符号 接受开始符号 S 并限制如果 S --&gt; ^ 是语法产生式,则 S 可以'不会出现在任何其他语法产生的 RHS 上。

任何 CFG 都可以写成 GNF 形式。

如何在 GNF 中转换 CFG?

我在上面写的 CFG 中的注释有 nul 产生 A --&gt; ^B --&gt; ^ 和一个单位产生 A --&gt; B。 GNF 形式中不允许单位产生式和 nul 产生式。尽管通过在语法中引入 GNF 产生式,其他产生式可以很容易地以 GNF 形式编写,例如S --&gt; aAc 可以重写为S --&gt; aAC and C --&gt; c

所以下面我将重写语言的等效 CFG 并删除称为简化 CFG 的 nul 和单位产品。

简化的 CFG:

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

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

语言 L 的 GFN:

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

我写错了语法,我会更新语言的答案L<sub>a</sub>

编辑

L<sub>a</sub> = {a<sup>i</sup> b<sup>j</sup> c<sup>k</sup> | i + j = 2k and k &gt;= 1}

La 的 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 

语言 La 的 GFN:

添加三个新的生产规则:X --&gt; aY --&gt; bZ --&gt; c

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

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

【讨论】:

  • 非常感谢,但实际上生成的语法不会产生该语言。即 S->bC-> bc 不包含在给定的语言中。还有一些属于我无法产生的语言的词,比如“abc”
  • @user2799534 好的检查更新的答案,如果有任何错误,请告诉我。
【解决方案2】:

关于下面La = {ai bj ck | i + j = k and k &gt;= 1}的答案CFG是错误的

您的简化 CFG:

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

因为上述语言 L = {ai bj ck | i + j = k and k &gt;= 1} 生成语言 aabccc 但您的 Simplified CFG 不生成它。

正确的CFG是

简化的 CFG

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

纠正一下,第二语言也有同样的问题。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多