题目
已知文法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
,体现栈的先进后出特性。