第三章语法分析-复习+习题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 }
右句型的前缀, 右句型的前缀, 该前缀不超过最 右句柄的右端
活前缀
action
goto
LR分析器的模型 LR分析器的模型
语法分析部分回顾 自上而下分析的知识点 • LL(1)文法的判定 LL(1)文法的判定
– FIRST、FOLLOW集的计算(重点) FIRST、FOLLOW集的计算 重点) 集的计算( – 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’
S→V=E S→E V→*E V → id E→V
24
LR(1)分析练习解答过程 • 答: • Step 1. 对原文法进行拓广
– (添加产生式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
25
识别产生式文法活前缀的DFA
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集和 集和 集
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
S->AaS | bAe | BeS | bBa A->d B->d
d
I2 : A→d· B→d·
e属于FOLLOW(A),同 属于FOLLOW(A),同 时也属于 FOLLOW(B), I2里存 I2里存 在归约在归约-归约冲突
23
LR(1)分析练习题目
基于LR(1)项目来构造识别 活前缀的DFA,并基于DFA构建 基于LR(1)项目来构造识别G′活前缀的DFA,并基于DFA构建 项目来构造识别G 分析表.
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)
V → id •
I3 S → E •
26
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
17
语法分析内容总结 自下而上分析部分知识点 • SLR的DFA的构造及分析表的构成 SLR的DFA的构造及分析表的构成
–初始项目集合的产生(拓广文法) 初始项目集合的产生(拓广文法) –能够识别同一符号的项目都转移到同一集合中 –求闭包过程中每一个“.”后面的非终结符都要重 求闭包过程中每一个“ 新考虑是否已经在状态中列出 –对产生式A-> α 归约,“ri”写在FOLLOW(A)集合 对产生式A 归约, 写在FOLLOW(A) FOLLOW(A)集合 中元素对应的位置。 中元素对应的位置。
18
语法分析内容总结 自下而上分析部分知识点 • LR,LALR的构造方法(在SLR的基础上加上搜 LR,LALR的构造方法 的构造方法( SLR的基础上加上搜 索符) 索符)
–搜索符的求法,根据造成目前项目出现的那个父 搜索符的求法, 项目来求。 项目来求。 –求闭包的过程中可能出现要添加的项目已经存在 但是搜索符不同的情况, ,但是搜索符不同的情况,相当于其父项目已经 改变,此时需要再求一遍搜索符。 改变,此时需要再求一遍搜索符。
接上表
栈 $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)的?
通过提取左因子和 消除左递归的方法, 消除左递归的方法, 并不一定能够把文 法改写为一个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
4
文法G: 文法
文法G: 文法
S->aSb | P P->bPc | bQc Q->Qa | a 哪一型文法? (1)它是 )它是chomsky哪一型文法? 哪一型文法 它是2型文法 即上下文无关文法。 型文法, 答:它是2型文法,即上下文无关文法。 (2)它生成的语言是什么? )它生成的语言是什么? 答:{aibjakcjbi | i>=0; j,k>=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描述的语言的句子 文法 描述的语言的句子
19
语法分析内容总结 自下而上分析部分知识点 • SLR,LR,LALR的区别及判别方法 SLR,LR,LALR的区别及判别方法
– 通过构造DFA,看其中的状态是否有冲突(“移 进—归约” 或 “归约—归约”)若有冲突则不 属于该文法类型。 – 通过构造分析表,看其中某项是否有冲突。
20
文法类的层次图
I0 S'→• S S → • V=E S→•E V → • *E V → • id E→•V id I5 E 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'→ S • * S I1
温故知新
上下文无关文法 最左推导 自上而下 自下而上 归约 递归下降 预测分析 最右推导 句柄

1。句柄与某个产生式的右部 符号串相同 2。句柄是句型的一个子串 3。把句柄归约成非终结符代 表了最右推导逆过程的 一步
移进移进-归约冲突 规约规约-归约冲 突
移进移进-归约分析
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)文法。
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 • 分析表 • 分析算法
21
语法分析部分回顾 例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)的
22
语法分析部分回顾 例2 解答: 解答: I2=goto(I0,d) I0 : S′→·S S→·AaS S → · bAe S→·BeS S→ ·bBa A→ ·d B→ ·d
• LL(1)分析的实现方法 LL(1)分析的实现方法
– 递归函数实现 – 非递归的预测分析实现
先求FIRST FOLLOW集 先求FIRST、FOLLOW集 FIRST、 画预测分析表
2
语法分析部分回顾
应用LL(1)分析方法的步骤 应用LL(1)分析方法的步骤 • 判定文法是否是LL(1)文法 判定文法是否是LL(1) LL(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’)={]}
相关文档
最新文档