我一直在为此做大约5个小时的家庭作业,我希望你们中的一些人能够提供帮助,因为CFG是CS的重要组成部分。
我真正的麻烦在于C部分。
为以下每种语言设计CFG:
一个。 {(a ^ i)(b ^ j)(c ^ k)} WHERE(i!= j)AND i,j,k> = 0)
我想出了:
Start-> aAB | AbB
A-> epsilon | aA
B-> epsilon | C | bB
C-> epsilon | cC
这似乎适用于bccc,abbcc,aabbb,cc所以我觉得我在这里很好。
B中。 {(a ^ i)(b ^ j)(c ^ k)} WHERE(i!= k)AND i,j,k> = 0)
Start-> aABC | ABcC
A-> epsilon | aA
B-> epsilon | bB
C-> epsilon | cC
这适用于bc,bbcc,ab,abb,aac所以当i!= k
时所有人都很好看℃。 {(a ^ i)(b ^ j)(c ^ k)} WHERE(i!= j OR i!= k)AND i,j,k> = 0)
Start-> aABC | AbB | ABcC
A-> epsilon | aA
B-> epsilon | bB | C
C-> epsilon | cC
我不认为C部分是正确的,但我相信A和B是正确的。任何人都能告诉我,无论我是对还是错?我相信,因为在最后一种情况下我只是做一个OR,因为我的A,B,C变量几乎相同,我可以通过组合来逃避。它看起来像bc作品,acc作品和许多其他作品,但我觉得我不应该只是简单地结合起始状态。
任何人都知道我是对还是关闭或有任何提示?
答案 0 :(得分:1)
你的第一个语法匹配abc
(通过开始 - > AbB - > abB - > abC - > abc),所以它不是正确的语法。
因此,您需要确保以相同的数量创建a
和b
(然后为其中一个创建更多)。
同样的abc
也会与您的第二条规则相匹配,也不应该被允许。
答案 1 :(得分:1)
请记住,当您测试语法时,请务必使用应该被拒绝的字符串进行测试(请参阅@ Paulo的答案,了解一些当前失败的答案)。要解决前两个问题,请编写一个代表A^i B^j
的语法i != j
;为任意数量的c
添加一个语法到第1部分的末尾,并将该语法添加到第2部分的中间。对于第3部分,请记住可以很容易地写出两个语法的并集作为一种语法。