目录
前提
接下来的内容将以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 | # | # | 接受 |
本文详细介绍了如何列出LL(1)文法分析表,画出预测分析表,以及预测分析过程中的栈操作原理。通过实例演示了LL(1)文法在符号串预测分析中的应用。
1210

被折叠的 条评论
为什么被折叠?



