题目
已知文法G(S)S→BAA→BS| dB→aA| bS | c的预测分析表如下给出句子 adccd 的分析过程。
已知文法G(S)S→BAA→BS| dB→aA| bS | c的预测分析表如下给出句子 adccd 的分析过程。
题目解答
答案
句子 adccd 的分析过程:
步骤 | 符号栈 | 输入串 | 产生式 |
#S | adccd# | ||
1 | #AB | adccd# | S→BA |
2 | #AAa | adccd# | B→aA |
3 | #AA | dccd# | |
4 | #Ad | dccd# | A→d |
5 | #A | ccd# | |
6 | #SB | ccd# | A→BS |
7 | #Sc | ccd# | B→c |
8 | #S | cd# | |
9 | #AB | cd# | B→c |
10 | #Ac | d# | |
11 | #A | d# | |
12 | #d | d# | A→d |
13 | # | # |
解析
预测分析法的核心是根据当前符号栈顶的非终结符和输入符号,选择合适的产生式进行推导。本题的关键在于:
- 文法结构:文法为非二义文法,存在多个可能的推导路径,需严格按照预测分析表的规则选择产生式。
- 符号栈与输入匹配:每一步需确保栈顶符号与输入符号匹配预测分析表中的规则,逐步消耗输入符号直至结束符
#。 - 推导顺序:特别注意非终结符
A和B的多条产生式(如A→BS或A→d),需根据输入符号动态选择。
步骤解析
- 初始状态:符号栈为
#S,输入为adccd#,应用S→BA,将BA压入栈。 - 处理
B:栈顶为B,输入首字符为a,选择B→aA,生成aA,输入消耗a。 - 处理
A:栈顶为A,输入首字符为d,选择A→d,生成d,输入消耗d。 - 回溯匹配:输入剩余
ccd#,继续处理栈顶符号,应用A→BS展开,最终通过B→c匹配输入c,逐步消耗剩余字符。
关键点
- 输入符号驱动选择:如输入
a时选择B→aA,输入d时选择A→d。 - 非终结符展开顺序:
BA压栈后先处理B,再处理A,体现栈的先进后出特性。