第三章语法分析-复习+习题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通过提取左因子和 消除左递归的方法, 消除左递归的方法, 并不一定能够把文 法改写为一个LL(1) 法改写为一个LL(1) 文法
G’[E]: E-> [ T T->F] T’ T’->ET’ | ε T’F->aF’ F’->F | ε F’-
不是LL(1)文法 不是LL(1)文法! 文法!
14
语法分析部分回顾 左递归的消除 G[S]: S->Qc|c Q->Sa|a 这是一类间接左递归 S->Sac|ac|c Q->Sa|a
S->aSb | P P->bP’ P’->Pc | Qc Q->aQ’ Q’->aQ’ | ε
First(S)={a,b} First(P)={b} First(P’)={a,b} First(Q)={a} First(Q’)={a, ε } Follow(S)={$,b} Follow(P)={$,b,c} Follow(P’)={$,b,c} Follow(Q)={c} Follow(Q’)={c }
15
语法分析部分回顾 左递归的消除 G[S]: S->Qc|c Q->Sa|a 这是一类间接左递归 S->acS’| cS’ S’->acS’| ε S’Q->Sa|a
S->Sac|ac|c Q->Sa|a
16
语法分析部分回顾 LR分析部分的知识点 LR分析部分的知识点 活前缀 识别活前缀的DFA 识别活前缀的DFA 分析表 分析算法
17
语法分析内容总结 自下而上分析部分知识点 SLR的DFA的构造及分析表的构成 SLR的DFA的构造及分析表的构成
–初始项目集合的产生(拓广文法) 初始项目集合的产生(拓广文法) –能够识别同一符号的项目都转移到同一集合中 –求闭包过程中每一个“.”后面的非终结符都要 求闭包过程中每一个“ 重新考虑是否已经在状态中列出 –对产生式A-> α 规约,“ri”写在FOLLOW(A)集合 对产生式A 规约, 写在FOLLOW(A) FOLLOW(A)集合 中元素对应的位置。 中元素对应的位置。
接上表
栈 $bcQ $bcQ’a $bcQ’ $bc $b $
输入 acb$ acb$ cb$ cb$ b$ $
输出 P’->Qc Q->aQ’ Q’-> ε
11
语法分析部分回顾 例2 文法G[E]: 文法G[E]: E-> [ T T-> TE | F ] F-> a | aF (1) 判断这个文法是不是LL(1)的? 判断这个文法是不是LL(1)的 (2) 消除左递归、提取左因子之后的文法G’是 消除左递归、提取左因子之后的文法G’是 否是LL(1)的 否是LL(1)的?
7
(5)构建 (1)预测分析表 )构建LL( )
输入符号 非终结符
a S->aSb
b S->P P->bP’
c
$
S P P’ Q Q’
P’->Qc Q->aQ’ Q’->aQ’
P’->Pc Q’->ε ε
8
是否是LL( ) (6)文法 是否是 (1)文法 )文法G是否是 构建出的LL( ) 答:构建出的 (1)分析表不含有多重定 义的条目,因此文法G是 ( )文法。 义的条目,因此文法 是LL(1)文法。
22
LR(1)分析练习题目
基于LR(1)项目来构造识别 活前缀的DFA,并基于DFA构建 基于LR(1)项目来构造识别G′活前缀的DFA,并基于DFA构建 项目来构造识别G 分析表.
S→V=E S→E V→*E V → id E→V
23
LR(1)分析练习解答过程 答: Step 1. 对原文法进行拓广
SLR,LR,LALR的区别及判别方法 SLR,LR,LALR的区别及判别方法
– 通过构造DFA,看其中的状态是否有冲突(“ 移进—规约” 或 “规约—规约”)若有冲突 则不属于该文法类型。 – 通过构造分析表,看其中某项是否有冲突。
19
文法类的层次图
20
语法分析部分回顾 例2 文法G[S]: 文法G[S]: S->AaS | bAe | BeS | bBa A->d B->d 判断这个文法是SLR(1)的 还是LR(1)的 判断这个文法是SLR(1)的,还是LR(1)的,抑 或是LALR(1)的 或是LALR(1)的
– 如果改写后的文法是LL(1)的,那么进行 如果改写后的文法是LL(1)的 LL(1)分析 LL(1)分析
构造LL(1) 构造LL(1)分析算法 LL(1)分析算法 – 可以采用递归函数实现,也可以采用非递归的 可以采用递归函数实现, 栈式分析方法实现
3
S->aSb | P P->bPc | bQc Q->Qa | a 哪一型文法? (1)它是 )它是chomsky哪一型文法? 哪一型文法 (2)它生成的语言是什么? )它生成的语言是什么? (3)给出提取左因子、消除左递归之后的文法 )给出提取左因子、 集和Follow集 (4)求出每个非终结符的 )求出每个非终结符的First集和 集和 集 (5)构建LL(1)预测分析表 )构建 ( ) 是否是LL( ) (6)文法 是否是 (1)文法 )文法G是否是 (7)利用非递归预测分析程序,验证 )利用非递归预测分析程序,验证abacb是否是 是否是 文法G描述的语言的句子 文法 描述的语言的句子
右句型的前缀, 右句型的前缀, 该前缀不超过最 右句柄的右端
活前缀
action
goto
LR分析器的模型 LR分析器的模型
语法分析部分回顾 自上而下分析的知识点 LL(1)文法的判定 LL(1)文法的判定
– FIRST、FOLLOW集的计算(重点) FIRST、FOLLOW集的计算 重点) 集的计算( – LL(1)文法判定方法 LL(1)文法判定方法
S
I 1: S’->S, $ >S
26
LR(1)分析练习解答过程 构建分析表
– 首先,为表达式编号
[0] S → S’ [1] S → V = E [2] S → E [3] V → * E [4] V → id [5] E → V
– 然后,计算action表和goto表
– (添加产生式S->S’)
S→V=E S→E V→*E V → id E→V
S → S’ S→V=E S→E V→*E V → id E→V
24
识别产生式文法活前缀的DFA
I1 S'→ S
I0
S'→ S S → V=E S→E V → *E V → id E→V id E
I5
V → id
12
语法分析部分回顾 例1 解答: 解答: 提取左因子, 提取左因子,消除左递归后 文法变为G’[E]: 文法变为G’[E]: E-> [ T T->F] T’ T’->ET’ | ε T’F->aF’ F’->F | ε F’G[S]: E-> [ T T-> TE | F ] F-> a | aF
温故知新
上下文无关文法 最左推导 自上而下 自下而上 归约 递归下降 预测分析 最右推导 句柄
!
1。句柄与某个产生式的右部 符号串相同 2。句柄是句型的一个子串 3。把句柄归约成非终结符代 表了最右推导逆过程的 一步
移进移进-归约冲突 规约规约-归约冲 突
移进移进-归约分析
LL(1)文法 LL(1)文法
9
(7)利用非递归预测分析程序,验证 )利用非递归预测分析程序,验证abacb是 是 否是文法G描述的语言的句子 否是文法 描述的语言的句子 栈 $S $bSa $bS $bP $bP’b $bP’ 输入 abacb$ abacb$ bacb$ bacb$ bacb$ acb$
10
输出 S->aSb S->P P->bP’
18wenku.baidu.com
语法分析内容总结 LR,LALR的构造方法(在SLR的基础上加上 LR,LALR的构造方法( SLR的基础上加上 的构造方法 搜索符) 搜索符)
–搜索符的求法,根据造成目前项目出现的那个 搜索符的求法, 父项目来求。 父项目来求。 –求闭包的过程中可能出现要添加的项目已经存 但是搜索符不同的情况, 在,但是搜索符不同的情况,相当于其父项目 已经改变,此时需要再求一遍搜索符。 已经改变,此时需要再求一遍搜索符。
5
文法G: 文法
S->aSb | P P->bPc | bQc Q->Qa | a (3)给出提取左因子、消除左递归之后的文法 )给出提取左因子、 答: S->aSb | P P->bP’ P’->Pc | Qc Q->aQ’ Q’->aQ’ | ε
6
集和Follow集 (4)求出每个非终结符的 )求出每个非终结符的First集和 集和 集
25
LR(1)分析练习解答过程 Step 2: 构建识别(拓广)文法活前缀的DFA
I 6: E I : 10 I 0: S->V=E, $ >V= S->V=E, $ >V=E = S’->S, $ E->V, $ V S->V=E, $ V->*E, $ 指向I 指向I7 I 2: V S->V=E, $ S->E, $ V->id, $ id >V I11: V->*E, =/$ E->V, $ >V V->id, $ >id * V->id, =/$ I 7: E E->V, $ >V E->V, $ I 3: I12 : E I13: S->E, $ >E V->*E, $ >* S->*E, $ >*E I 8: * id E->V, $ >*E E S->*E, =/$ V V->*E, $ 指向I 指向I7 I 4: V I 9: * V->id, $ I 5: V->*E, =/$ >* >V V->id, =/$ E->V, =/$ >id * E->V, =/$ id 指向I 指向I11 V->*E, =/$ V->id, =/$ id 指向I5 指向I
LL(1)分析的实现方法 LL(1)分析的实现方法
– 递归函数实现 – 非递归的预测分析实现
先求FIRST FOLLOW集 先求FIRST、FOLLOW集 FIRST、 画预测分析表
2
语法分析部分回顾
应用LL(1)分析方法的步骤 应用LL(1)分析方法的步骤 判定文法是否是LL(1)文法 判定文法是否是LL(1) LL(1)文法 – 如果不是,则改写文法 如果不是, 消除左递归 提取左因子
I6 S → V = E E S → V=E E→V I9 id V → *E V I3 S → V =E = V → id I2 E → V V * * V → * E I4 E → V V E → V I8 V → id E id V → * E V → *E I7 *
S
I3 S → E
21
语法分析部分回顾 例3 解答: 解答: I2=goto(I0,d) I0 : S′→S S→AaS S → bAe S→BeS S→ bBa A→ d B→ d
S->AaS | bAe | BeS | bBa A->d B->d
d
I2 : A→d B→d
e属于FOLLOW(A),同 属于FOLLOW(A),同 时也属于 FOLLOW(B), I2里存 I2里存 在归约在归约-归约冲突
4
文法G: 文法
文法G: 文法
S->aSb | P P->bPc | bQc Q->Qa | a 哪一型文法? (1)它是 )它是chomsky哪一型文法? 哪一型文法 它是2型文法 即上下文无关文法。 型文法, 答:它是2型文法,即上下文无关文法。 (2)它生成的语言是什么? )它生成的语言是什么? 答:{aibjakcjbi | i>=0; j,k>=1}
13
语法分析部分回顾 FIRST(E) = {[} FIRST(T) = {a} FIRST(T’)= {[, ε} FIRST(F) = {a} FIRST(F’)= {a, ε} FOLLOW(E)={[,$} FOLLOW(T)={[,$} FOLLOW(T’)={[,$} FOLLOW(F)={]} FOLLOW(F’)={]}
2个函数
非递归的 预测分析
LR文法 LR文法
栈 sm Xm sm-1 Xm-1 … s0
输 入
a1 … ai … an $
LR分析程序 LR分析程序
输 出 简单的LR方法(SLR) 简单的LR方法(SLR) 方法 规范的LR方法 规范的LR方法 向前看的LR方法 方法(LALR) 向前看的LR方法(LALR)
G’[E]: E-> [ T T->F] T’ T’->ET’ | ε T’F->aF’ F’->F | ε F’-
不是LL(1)文法 不是LL(1)文法! 文法!
14
语法分析部分回顾 左递归的消除 G[S]: S->Qc|c Q->Sa|a 这是一类间接左递归 S->Sac|ac|c Q->Sa|a
S->aSb | P P->bP’ P’->Pc | Qc Q->aQ’ Q’->aQ’ | ε
First(S)={a,b} First(P)={b} First(P’)={a,b} First(Q)={a} First(Q’)={a, ε } Follow(S)={$,b} Follow(P)={$,b,c} Follow(P’)={$,b,c} Follow(Q)={c} Follow(Q’)={c }
15
语法分析部分回顾 左递归的消除 G[S]: S->Qc|c Q->Sa|a 这是一类间接左递归 S->acS’| cS’ S’->acS’| ε S’Q->Sa|a
S->Sac|ac|c Q->Sa|a
16
语法分析部分回顾 LR分析部分的知识点 LR分析部分的知识点 活前缀 识别活前缀的DFA 识别活前缀的DFA 分析表 分析算法
17
语法分析内容总结 自下而上分析部分知识点 SLR的DFA的构造及分析表的构成 SLR的DFA的构造及分析表的构成
–初始项目集合的产生(拓广文法) 初始项目集合的产生(拓广文法) –能够识别同一符号的项目都转移到同一集合中 –求闭包过程中每一个“.”后面的非终结符都要 求闭包过程中每一个“ 重新考虑是否已经在状态中列出 –对产生式A-> α 规约,“ri”写在FOLLOW(A)集合 对产生式A 规约, 写在FOLLOW(A) FOLLOW(A)集合 中元素对应的位置。 中元素对应的位置。
接上表
栈 $bcQ $bcQ’a $bcQ’ $bc $b $
输入 acb$ acb$ cb$ cb$ b$ $
输出 P’->Qc Q->aQ’ Q’-> ε
11
语法分析部分回顾 例2 文法G[E]: 文法G[E]: E-> [ T T-> TE | F ] F-> a | aF (1) 判断这个文法是不是LL(1)的? 判断这个文法是不是LL(1)的 (2) 消除左递归、提取左因子之后的文法G’是 消除左递归、提取左因子之后的文法G’是 否是LL(1)的 否是LL(1)的?
7
(5)构建 (1)预测分析表 )构建LL( )
输入符号 非终结符
a S->aSb
b S->P P->bP’
c
$
S P P’ Q Q’
P’->Qc Q->aQ’ Q’->aQ’
P’->Pc Q’->ε ε
8
是否是LL( ) (6)文法 是否是 (1)文法 )文法G是否是 构建出的LL( ) 答:构建出的 (1)分析表不含有多重定 义的条目,因此文法G是 ( )文法。 义的条目,因此文法 是LL(1)文法。
22
LR(1)分析练习题目
基于LR(1)项目来构造识别 活前缀的DFA,并基于DFA构建 基于LR(1)项目来构造识别G′活前缀的DFA,并基于DFA构建 项目来构造识别G 分析表.
S→V=E S→E V→*E V → id E→V
23
LR(1)分析练习解答过程 答: Step 1. 对原文法进行拓广
SLR,LR,LALR的区别及判别方法 SLR,LR,LALR的区别及判别方法
– 通过构造DFA,看其中的状态是否有冲突(“ 移进—规约” 或 “规约—规约”)若有冲突 则不属于该文法类型。 – 通过构造分析表,看其中某项是否有冲突。
19
文法类的层次图
20
语法分析部分回顾 例2 文法G[S]: 文法G[S]: S->AaS | bAe | BeS | bBa A->d B->d 判断这个文法是SLR(1)的 还是LR(1)的 判断这个文法是SLR(1)的,还是LR(1)的,抑 或是LALR(1)的 或是LALR(1)的
– 如果改写后的文法是LL(1)的,那么进行 如果改写后的文法是LL(1)的 LL(1)分析 LL(1)分析
构造LL(1) 构造LL(1)分析算法 LL(1)分析算法 – 可以采用递归函数实现,也可以采用非递归的 可以采用递归函数实现, 栈式分析方法实现
3
S->aSb | P P->bPc | bQc Q->Qa | a 哪一型文法? (1)它是 )它是chomsky哪一型文法? 哪一型文法 (2)它生成的语言是什么? )它生成的语言是什么? (3)给出提取左因子、消除左递归之后的文法 )给出提取左因子、 集和Follow集 (4)求出每个非终结符的 )求出每个非终结符的First集和 集和 集 (5)构建LL(1)预测分析表 )构建 ( ) 是否是LL( ) (6)文法 是否是 (1)文法 )文法G是否是 (7)利用非递归预测分析程序,验证 )利用非递归预测分析程序,验证abacb是否是 是否是 文法G描述的语言的句子 文法 描述的语言的句子
右句型的前缀, 右句型的前缀, 该前缀不超过最 右句柄的右端
活前缀
action
goto
LR分析器的模型 LR分析器的模型
语法分析部分回顾 自上而下分析的知识点 LL(1)文法的判定 LL(1)文法的判定
– FIRST、FOLLOW集的计算(重点) FIRST、FOLLOW集的计算 重点) 集的计算( – LL(1)文法判定方法 LL(1)文法判定方法
S
I 1: S’->S, $ >S
26
LR(1)分析练习解答过程 构建分析表
– 首先,为表达式编号
[0] S → S’ [1] S → V = E [2] S → E [3] V → * E [4] V → id [5] E → V
– 然后,计算action表和goto表
– (添加产生式S->S’)
S→V=E S→E V→*E V → id E→V
S → S’ S→V=E S→E V→*E V → id E→V
24
识别产生式文法活前缀的DFA
I1 S'→ S
I0
S'→ S S → V=E S→E V → *E V → id E→V id E
I5
V → id
12
语法分析部分回顾 例1 解答: 解答: 提取左因子, 提取左因子,消除左递归后 文法变为G’[E]: 文法变为G’[E]: E-> [ T T->F] T’ T’->ET’ | ε T’F->aF’ F’->F | ε F’G[S]: E-> [ T T-> TE | F ] F-> a | aF
温故知新
上下文无关文法 最左推导 自上而下 自下而上 归约 递归下降 预测分析 最右推导 句柄
!
1。句柄与某个产生式的右部 符号串相同 2。句柄是句型的一个子串 3。把句柄归约成非终结符代 表了最右推导逆过程的 一步
移进移进-归约冲突 规约规约-归约冲 突
移进移进-归约分析
LL(1)文法 LL(1)文法
9
(7)利用非递归预测分析程序,验证 )利用非递归预测分析程序,验证abacb是 是 否是文法G描述的语言的句子 否是文法 描述的语言的句子 栈 $S $bSa $bS $bP $bP’b $bP’ 输入 abacb$ abacb$ bacb$ bacb$ bacb$ acb$
10
输出 S->aSb S->P P->bP’
18wenku.baidu.com
语法分析内容总结 LR,LALR的构造方法(在SLR的基础上加上 LR,LALR的构造方法( SLR的基础上加上 的构造方法 搜索符) 搜索符)
–搜索符的求法,根据造成目前项目出现的那个 搜索符的求法, 父项目来求。 父项目来求。 –求闭包的过程中可能出现要添加的项目已经存 但是搜索符不同的情况, 在,但是搜索符不同的情况,相当于其父项目 已经改变,此时需要再求一遍搜索符。 已经改变,此时需要再求一遍搜索符。
5
文法G: 文法
S->aSb | P P->bPc | bQc Q->Qa | a (3)给出提取左因子、消除左递归之后的文法 )给出提取左因子、 答: S->aSb | P P->bP’ P’->Pc | Qc Q->aQ’ Q’->aQ’ | ε
6
集和Follow集 (4)求出每个非终结符的 )求出每个非终结符的First集和 集和 集
25
LR(1)分析练习解答过程 Step 2: 构建识别(拓广)文法活前缀的DFA
I 6: E I : 10 I 0: S->V=E, $ >V= S->V=E, $ >V=E = S’->S, $ E->V, $ V S->V=E, $ V->*E, $ 指向I 指向I7 I 2: V S->V=E, $ S->E, $ V->id, $ id >V I11: V->*E, =/$ E->V, $ >V V->id, $ >id * V->id, =/$ I 7: E E->V, $ >V E->V, $ I 3: I12 : E I13: S->E, $ >E V->*E, $ >* S->*E, $ >*E I 8: * id E->V, $ >*E E S->*E, =/$ V V->*E, $ 指向I 指向I7 I 4: V I 9: * V->id, $ I 5: V->*E, =/$ >* >V V->id, =/$ E->V, =/$ >id * E->V, =/$ id 指向I 指向I11 V->*E, =/$ V->id, =/$ id 指向I5 指向I
LL(1)分析的实现方法 LL(1)分析的实现方法
– 递归函数实现 – 非递归的预测分析实现
先求FIRST FOLLOW集 先求FIRST、FOLLOW集 FIRST、 画预测分析表
2
语法分析部分回顾
应用LL(1)分析方法的步骤 应用LL(1)分析方法的步骤 判定文法是否是LL(1)文法 判定文法是否是LL(1) LL(1)文法 – 如果不是,则改写文法 如果不是, 消除左递归 提取左因子
I6 S → V = E E S → V=E E→V I9 id V → *E V I3 S → V =E = V → id I2 E → V V * * V → * E I4 E → V V E → V I8 V → id E id V → * E V → *E I7 *
S
I3 S → E
21
语法分析部分回顾 例3 解答: 解答: I2=goto(I0,d) I0 : S′→S S→AaS S → bAe S→BeS S→ bBa A→ d B→ d
S->AaS | bAe | BeS | bBa A->d B->d
d
I2 : A→d B→d
e属于FOLLOW(A),同 属于FOLLOW(A),同 时也属于 FOLLOW(B), I2里存 I2里存 在归约在归约-归约冲突
4
文法G: 文法
文法G: 文法
S->aSb | P P->bPc | bQc Q->Qa | a 哪一型文法? (1)它是 )它是chomsky哪一型文法? 哪一型文法 它是2型文法 即上下文无关文法。 型文法, 答:它是2型文法,即上下文无关文法。 (2)它生成的语言是什么? )它生成的语言是什么? 答:{aibjakcjbi | i>=0; j,k>=1}
13
语法分析部分回顾 FIRST(E) = {[} FIRST(T) = {a} FIRST(T’)= {[, ε} FIRST(F) = {a} FIRST(F’)= {a, ε} FOLLOW(E)={[,$} FOLLOW(T)={[,$} FOLLOW(T’)={[,$} FOLLOW(F)={]} FOLLOW(F’)={]}
2个函数
非递归的 预测分析
LR文法 LR文法
栈 sm Xm sm-1 Xm-1 … s0
输 入
a1 … ai … an $
LR分析程序 LR分析程序
输 出 简单的LR方法(SLR) 简单的LR方法(SLR) 方法 规范的LR方法 规范的LR方法 向前看的LR方法 方法(LALR) 向前看的LR方法(LALR)