这是针对练习考试的问题,所以请解释答案,并提供思考类似问题的提示。 所以我有一个问题:
"为接受字母{a,b}字符串的语言创建无上下文语法,其中a的数量可被3整除或x的长度可被3整除,或者两个......其中x =输入字符串。"
我很想解决我应该如何解决这个问题。
我理解接受字母{a,b}中可被3整除的字符串的语法可能如下所示:
0 -> a1 | b1
1 -> a2 | b2
2 -> a | b | a0 | b0
以下是我到目前为止的情况,尝试跟踪x的总长度和x中的a的数量,对于任何'和b&#的任何组合39,S:
0 -> a1 | b1
1 -> a2 | b3
2 -> a | a0 | b1
3 -> a | b | a2 | b4
4 -> a1 | b5
5 -> b | b1 | a2
以上显然是错误的,但我需要一些帮助。 所以应该通过的示例字符串:
ababab
abaa
abbabb
答案 0 :(得分:0)
从我的经验和学历来看,最好是:
构建这种类型的语法(一定数量的终端)时,最好递归进行。首先,您假设您的起始符号是您想要的字符串。然后将其拆分为子字符串,每个子字符串仍符合您的规则,直到仅剩下终端为止。
您通过从头开始构建字符串并尝试计算您有多少个终端,来解决这个问题,可悲的是,上下文无关的语法无法做到(它们可以,但只能用于有限的字符串)。
所以第一个规则是
S -> 3
其中
S...starting symbol
3..."multiple of three"
“ 3的倍数”可以是3个a或3个长度的字符串。
3 -> A | L
其中
A...string with 3 a's
L...string with length of 3
为了能够构建任何长度的字符串,我们可以将符合相同“三个规则”的所有字符串加在一起。
A -> AA
L -> LL
现在-长度为3的字符串很简单。
L -> aM | bM
M -> aN | bN
N -> a | b
3a字符串只是三个a的字符串,任意数量的b分散在三个a之间和周围。
A -> bA | aB
B -> bB | aC
C -> bC | a | aD
D -> bD | b
从左到右构建3a字符串。每个规则可以产生任意数量的b,直到将其用a覆盖。最终规则可以在右侧产生任何数字b。
一切都在一起:
S -> 3
3 -> A | L
L -> LL | aM | bM
M -> aN | bN
N -> a | b
A -> AA | bA | aB
B -> bB | aC
C -> bC | a | aD
D -> bD | b