问题是为语言开发一个无上下文语法,其中包含所有字符串,其中包含的字符串数比B字数多。
我无法想到一个合乎逻辑的解决方案。有没有办法解决这些问题,有什么可以帮助我更好地处理这些问题?有人可以提出一种合理的方法来分析这些语法问题吗?
答案 0 :(得分:2)
以下语法生成{a,b}
以上a
比b
更多的所有字符串。我用eps
表示空字符串。
S -> Aa | RS | SRA
A -> Aa | eps
R -> RR | aRb | bRa | eps
很明显,它总是比a
生成更多b
。它不太明显,它会生成{a,b}
以上a
以上b
以上的所有可能字符串
制作R -> RR | aRb | bRa | eps
生成所有平衡字符串(这很容易看到),制作A -> Aa
生成语言a*
(即字符串为零或更多a
的)。
这是语法背后的逻辑。请注意,如果w=c1,c2,c3,...,cn
是超过{a,b}
的字符串,a
比b
更多,那么我们总是可以将其分解为平衡字符串的串联(即相等数字) a
和b
的,包括空字符串)和a+
形式的字符串。
例如,ababaaaba
= abab
(可由R
生成),aaa
(可由A
生成),{{1} }(可以由ba
生成)。
现在请注意,制作R
会精确生成此形式的字符串。
验证S -> Aa | RS | SRA
是否涵盖以下情况就足够了(因为可以通过打破这些子句来涵盖所有其他情况,因为您应该验证):
S
:使用[a][balanced]
。S => SRA => AaR
:使用[balanced][a]
。S => RS => RA => RAa
:使用[balanced][a]balanced]
。答案 1 :(得分:0)
另一种可能更简单的解决方案:
S->A|AAB|BAA|e
A->AA | a
B->AB | BA | b
答案 2 :(得分:0)
S→TaT
T→ATb | bTA | TT | ɛ
A→aA |一个
T生成#a> = #b的任何字符串(包括空字符串)。 S确保在任何位置都比b多至少一个'a'。