目录
前提
接下来的内容将以LL(1)文法举例,若需要掌握LL(1)文法判别(包括LL(1)分析表),请阅读下篇:
LL(1)文法判别http://t.csdnimg.cn/aIaE8
一、列出LL(1)文法分析表
注意:这里是LL(1)文法分析表,不是预测分析表
已知LL(1)文法,它的分析表如下
FIRST集 | FOLLOW集 | SELECT集 | |
---|---|---|---|
S→AaS S→BbS S→d | {a} {b,c} {d} | {#} | {a} {b,c} {d} |
A→a | {a} | {a} | {a} |
B→ε B→c | {ε} {c} | {b} | {b} {c} |
二、画出该LL(1)预测分析表
1.方法
(1) 产生式的非终结符为列,终结符(包括#)为行
注意:ε既不是终结符也不是非终结符,因此不需要写
(2) 依据SELECT集查找 非终结符 产生 终结符的产生式
以S与a为例
select中的a对应产生式S→AaS,因此对应框内写S→AaS
简单记忆就是:SELECT集对应的产生式
2. LL(1)预测分析表如下
注意:#就算用不到也要写
a | b | c | d | # | |
---|---|---|---|---|---|
S | S→AaS | S→BbS | S→BbS | S→d | |
A | A→a | ||||
B | B→ε | B→c |
三、预测分析过程表
以符号串aad预测分析过程为例
1. 说明
(1)分析栈为什么要逆序进栈
栈为先进后出,因此余留输入串aad的栈如下
3 | a |
2 | a |
1 | d |
因为是从文法的开始符号开始推导,假定使用产生式S→AaS,为使得产生式与符号串一一对应,需要逆序进栈,即S先进栈,位于最底部
3 | S | A |
2 | a | a |
1 | A | S |
从S能推出d,而A不能,可以看出逆序的作用
(2)分析栈与余留输入串栈为什么要有#
解释:‘#’ 是文法的结束标志,用来判断分析过程是否有误。
例如:分析栈为S→#a ,而余留栈为#,a与#不匹配,那么很明显是推导错误
2.预测分析过程表
以符号串aad预测分析过程为例
以第一行为例:所用产生式的来源:预测分析表中非终结符与终结符对应的产生式
即S使用S→AaS产生a
下一行为:A使用A→a产生a
将上图放在此处作为参照
步骤 | 分析栈 | 余留输入串栈 | 推导所用产生式或匹配 |
---|---|---|---|
1 | #S | aad# | S→AaS |
2 | #SaA | aad# | A→a |
3 | #Saa | aad# | a匹配成功,出栈 |
4 | #Sa | ad# | a匹配成功,出栈 |
5 | #S | d# | S→d |
6 | #d | d# | d匹配成功,出栈 |
7 | # | # | 分析成功 |
四、练习
建议:可以先自己练习一下,之后对答案掌握
已知LL(1)文法分析表如下:
FIRST集↑ | FOLLOW集↓ | SELECT集 | |
---|---|---|---|
E→TE' | {i,(} | {),#} | {i,(} |
E'→+TE' E'→ε | {+} {ε} | {),#} | {+} {),#} |
T→FT' | {i,(} | {),#,+} | {i,(} |
T'→*FT' T'→ε | {*} {ε} | {),#,+} | {*} {),#,+} |
F→i F→(E) | {i} {(} | {*,),+,#} | {i} {(} |
预测分析表如下:
i | ( | ) | * | + | # | |
---|---|---|---|---|---|---|
E | E→TE' | E→TE' | ||||
E' | E'→ε | E'→+TE' | E'→ε | |||
T | T→FT' | T→FT' | ||||
T' | T'→ε | T'→*FT' | T'→ε | T'→ε | ||
F | F→i | F→(E) |
i+i分析过程如下:
步骤 | 分析栈 | 余留输入串栈 | 推导所用产生式或匹配 |
---|---|---|---|
1 | #E | i+i# | E→TE' |
2 | #E'T | i+i# | T→FT' |
3 | #E'T'F | i+i# | F→i |
4 | #E'T'i | i+i# | i匹配成功,出栈 |
5 | #E'T' | +i# | T'→ε |
6 | #E' | +i# | E'→+TE' |
7 | #E'T+ | +i# | +匹配成功,出栈 |
8 | #E'T | i# | T→FT' |
9 | #E'T'F | i# | F→i |
10 | #E'T'i | i# | i匹配成功,出栈 |
11 | #E'T' | # | T'→ε |
12 | #E' | # | E'→ε |
13 | # | # | 接受 |