在上述问题的正确语法中,生成字符串a l b m且 l ≠ m 的推导长度(从 S 开始的步数)是多少?
(A) max(l,m) + 2
(B) l + m + 2
(C) l + m + 3
(D) max(l, m) + 3答案:(一)
解释:
最后一道题的正确语法是(D),即:
S -> AC|CB
C -> aCb|epsilon
A -> aA|a
B -> Bb|b
现在,生成 a l b m形式的字符串的最优化和最直观的方法是首先使用“C -> aCb|epsilon”产生式规则来获得尽可能多的 a 和 b,即 min( l,m)。要获得字符串的其余部分,我们可以相应地使用后两个产生式规则。从上述语法中正式推导出一般格式 a l b m的字符串——
1. S -> AC
2. -> A(aCb)
3. -> ....
4. -> ....
5. -> A(am C bm)
6. -> A(am bm)
7. -> aA(am bm)
8. -> ....
9. -> ....
10. -> a(l-m-1)A(am bm)
11. -> al bm
从上面的推导步骤集,我们可以计算总步骤如下:
Production 1 took 1 step : 1 [using S->AC]
Production 2-5 took steps : min(l,m) [using C->aCb]
Production 6 took 1 step : 1 [using C->epsilon]
Production 7-11 took steps : max(l,m)-min(l,m) [using A -> aA|a or B -> Bb|b]
Total steps : max(l,m) + 2
因此,答案应该是(A) : max(l,m) + 2
此解释由Vineet Purswani 提供。
这个问题的测验