编译原理简明教程(第2版)第5章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分析xay是否句子 S S x A y A y a a b (3) (2)
分析过程: (1)(2)(1)(3) 出现回溯.
例:
G[E]: ET|EAT TF|TMF F(E)|i 分析符号串i+i*i A+|M*|/
推导: E T F (E) F I T TMF FMF iMF i*F i*i EAT EAF TAF FAF i+i + + TAT i+T i+TMF i+i*i
3. Select集(可选集)
定义:文法G[S],有规则Aβ ,则该规则的可选集为: First(β ), 当β ≠ε Select(Aβ )= Follow(A), 当β =ε 例: 对于G[E] select(EE+T)=First(E+T)={(,i} select(ET)=First(T)={(,i} select(TT*F)=First(T*F)={(,i} select(TF)=First(F)={(,i} select(F(E))=First((E))={(} select(Fi)=First(i)={i}
(4)对所有没出现在规则右部的首部的终结符a,
令M[a,a]=RE(ε )/C=ε /C (5)对于#,令M[#,#]=succ,表示分析成功,结束. (6)其他情况属于出错,在分析表中用空白表示.
例:G’[A]:
AaBc BbB|eB|d 先求各规则的select集 Select(AaBc)={a} Select(BbB)={b} Select(BeB)={e} Select(Bd)={d} 且c不出现在任何规则右部的首部.
First(dB)={d}
First(Bq)={b,d}
例: G[E]:
EE+T|T TT*F|F F(E)|I First(F)={(,i} First((E))={(} First(i)={i}
则: First(E+T)={(,i} First(T)={(,i} First(T*F)={(,i}
A的候选式: x1,x2,…xn 在自顶向下分析过程中,对候选式的选择可根 据当前输入符号来决定.
首先:对每条规则Aβ , First(β ) β ≠ε 求 Select(Aβ )= Follow(A) β =ε 当β ≠ε 时,对于当前输入符号a,若 a∈First(β) 则可选Aβ 进行推导,但A有n个候选式, ∴分两种情况.
(1)首符号不同
First(xi)∩First(xj)=Φ (i≠j) 若a∈First(xk),则选用Axk来推导 例: G[S]: AaB|bA BbaA|c {First(aB)={a}} ∩ {First(bA)={b}} = Φ {First(baA)={b}} ∩ {First(c)={c}} = Φ 分析符号串bbabaac A bA bbA bbaB bbabaA bbabaB bbabaac
2
LL(1)分析表
x1
(1) LL(1)分析过程 x2 当前句型的右端部分x1x2…xm# (xi∈V) 待分析串的右端部分y1y2…yn# (yi∈VT) … 分几种情况: xm 1)当x1∈VN,由y1选择相应规则替换x1 2)当x1∈VT,若x1=y1≠#,则说明x1与y1匹配,分 别删去x1,y1, 继续分析. 若x1 ≠ y1,则说明不匹配,进行出错处理 3)若x1=y1=#,说明全部匹配,分析成功. LL(1)分析程序见P77--78
(2) 首符号相同
First(xi)∩First(xj)≠Φ
即对于 Aα x1|α x2 ...|α xn 改为 Aα (x1|x2 ...|xn) 进一步Aα B Bx1|x2 ...|xn
(i≠j)
解决方法:”左提左因子”修改文法
例: Uα x1|α x2 |x3|…|xn
且First(xi)∩First(xj)=Φ , (i,j≥3,i≠j)
例:文法G[S]:SAB Aab Bcd|cBd 判断abccdd是否是句子。 (1)自顶向下构造语法树 S A B a b c B d c d
(2)推导 S AB AcBd Accdd abccdd
5.2
不确定的自顶向下分析思想
例: G[S]: SxAy Aab|a S x A y x (1)
(1) 回溯
(2) 死循环, 在没有对当前输入符号匹配就进入处 理S的过程,无法确定什么时候才用Sb替换, 造成死循环. 解决方法:
文法的实用限制(算法6)
消除左递归
扩充的BNF表示法
2.
回溯问题 在分析中,假定被代换的最左非终结符A存在n 条规则,Ax1|x2|…|xn,难以确定采用哪个规则,若 从x1到xn逐个来试,则效率太低。
2.
Follow集(向前看集)
定义:文法G[S],非终结符号U的向前看集 Follow(U)={a|S * …Ua…,a∈VTU{#}} 特别,当a=ε时,视U后面的符号为”#” ∵E * E, E * E+T, E * (E) ∴Follow(E)={#,+,)} Follow(T)={#,+,*,)} Follow(F)={#,+,*,)}
例: G[S]: SaBc|bB BbB|d|ε Select(Bε)=Follow(B)={#,c}
5.2.2
自顶向下分析过程中存在的问题 及解决办法
1. 左递归问题 例:G[S]: SSa|b S
b S
分析baa
S
a S
S
a
S
S a
S
S a
S
S a
b
S a
S a
b
S
a
…
分析时可能出现:
推导过程是一个不断试探的过程,出现回溯现象, 所以又称带回溯的自顶向下分析方法(效率低,代价高) 原因:推导过程中有多个侯选式可供选择.
5.2.1
三种终结源自文库集
1.First集 (首符号集) 定义: 文法G[S]:字汇表V,则符号串β 的首符号集 First(β )={a|β * ay,a∈VT,y∈V*} 特别,若β =ε ,则First(β )=Φ 例:G[S]: SAp SBq Aa|cA Bb|dB First(Ap)={a,c}
构造LL(1)分析表:
a A b B/C ε/C succ c d ε/C e B/C #
cB/C
B
c #
分析abbedc的过程 分析栈 余留输入串 动作
#A
#cB #cB #cB #cB #c #
abbedc#
bbedc# bedc# edc# dc# c# #
cB/C
B/C B/C B/C ε/C ε/C succ
满足条件
无回溯性
5.4
LL(k)分析方法(预测分析法)
LL(k)是一种确定的自顶向下分析法:
扫描输入串,同时从文法的识别符号开始产生 句子的最左推导,每一步推导时向前看k个符号,以确 定当前应选规则.
k=1,即LL(1),简单易懂,应用较多.
5.4.1
LL(1)分析思想
例: G[S]: SaBc|bB BbB|d 对句子abbdc进行分析. 从左到右扫描abbdc,对照规则,对第一个字符a,只能用 S aBc, 第二个符号b,只能用B bB S aBc abBc S a B c abbBc abbdc b B b B d 由此,LL(1)的基本思想就是根据输入串的当前符号唯 一确定所选规则进行推导.
自顶向下
语法分析
如 LL(k), 递归下降分法等 如LR(K), 算符优先分析法等
自底向上
目
录
5.1 自顶向下分析技术 5.2 不确定的自顶向下分析技术 5.3 确定的自顶向下分析技术 5.4 LL(K)分析方法 5.5 递归下降分析方法
5.1
分析思想:
自顶向下分析技术
从文法的开始符号出发,向下推导, 看能否推出 待分析的符号串,如果能推出,说明该符号串是符合 语言语法的句子,否则不是句子。
AaBc
a
BbB b BbB b Bd
d c
(2)
LL(1)分析表构造
LL(1)分析表反映分析栈中元素与输入串中元 素的匹配关系.记M[A,a]
几个约定: C:继续读入下一字符 R:重读当前字符
RE(β):用β 的逆串替换栈顶符号.
构造LL(1)分析表的算法如下:
(1)对于ADβ (D∈VN)且 select(ADβ )={b1,b2…bn} 则M[A,bi]=RE(Dβ )/R 表示:用Dβ 的逆替换A,重读当前字符. (2)对于Aaβ (a∈VT) 则M[A,a]= RE(β )/C 表示:用β 的逆替换A,继续读入下一字符. (3)对于Aε 且select(Aε )={b1,b2…bn} 则M[A,bi]=RE(ε )/R=ε /R
第5章 语法分析 ----自顶向下分析方法
学习目标
自上而下语法分析的基本思想 自上而下语法分析面临的问题及解决方 消除左递归的方法 FIRST(x)的求法、FOLLOW(U)的求法 递归子程序的构造方法 LL(1)文法 LL(1)分析表的构造方法
语法分析是编译过程的核心部分。 -----在词法分析识别出单词符号串的基础上, 分析并判定程序的语法结构是否符合语法规则。
例 5-6 ① 消除左递归 ② 求select 集 ③ 构造分析表 ④ 分析符号串 例 文法G [S] S abB A SC|BAA|ε B AbA C B|c
VN={S,A,B,C} VT={a,b,c}
判断此文法是不是LL(1)文法: Select (SabB)={a} Select (ASC)={a} ∩≠Φ Select (ABAA)={a,b} Select (Aε)={a,b,#} Select (CB)={a,b} ∩=Φ Select (Cc)={c} Selcet (BAbA)={a,b} ∴不是LL(1)文法。构造出的分析表含有多重定义。
注:有些不是LL(1)文法的文法,经过修改 (如左提左因子,消除递归等)可化为 LL(1)文法,但并不是所有的非LL(1)文法 都能改造为LL(1)文法。
例 对于文法G [Z]:
ZAU |BR AaAU|b BaBR|b Uc Rd
First(AU) ∩First(BR)={a,b} ≠Φ 所以,不是一个LL(1)文法
First(xi) ≠α , (i=3,4,…n) 采用 U α V|x3|…|xn Vx1|x2
例: G[S]: Sif B then S1 else S2|if B then S1 改为: Sif B then S1 T T else S2 | ε
5.3
确定的自顶向下分析思想
文法是非左递归的
例:G[A]: AaBc BbB|eB|d 分析abbdc# 设计文法的分析表: a AaBc b c d e
A
B
BbB
Bd
BeB
分析过程:
分析栈 输入符号
产生式
匹配删除
#A #cBa #cB #cBb #cB #cBb #cB #cd #c #
abbdc# abbdc# bbdc# bbdc# bdc# bdc# dc# dc# c# #
《编译原理简明教程》
普通高等教育“十二五”规划计算机教材
---太原理工大学 ---计算机科学与技术学院 ---冯秀芳、崔冬华、段富等
目 录
•第一章 引言 •第二章 形式语言理论基础 •第三章 自动机理论基础 •第四章 词法分析 •第五章 语法分析—自顶向下分析方法 •第六章 语法分析—自底向上分析方法 •第七章 语义分析及中间代码的生成 •第八章 代码优化 •第九章 目标代码的生成 •第十章 符号表 •第十一章 目标程序运行时的存储组织与分配 •第十二章 出错处理 •第十三章 编译程序自动生成工具简介 •第十四章 面向对象语言的编译 •第十五章 并行编译技术
5.4.2
a1 a2
LL(1)分析方法的逻辑结构
a3 … ai … am #
输入串
x1
分析表 控制程序 分析器
x2 …. xn
分析栈
#
输入串a1a2a3…am#,以定界符”#”作为结尾
分析表:M[A,a] (A为栈中元素,a为输入字符)
5.4.3
1. LL(1)文法
LL(1)分析方法
对于文法G[S],其每个非终结符的不同规则具 有不相交的select集. 即对于Ux1|x2|…|xn,有 select(Uxi)∩select(Uxj)=Φ, (i≠j)