(编译原理及实践)第五章 自底向上的分析
编译原理-清华大学-第5章-自底向上优先分析法(2+1)
第六章自底向上优先分析方法•教学要求:了解简单优先分折法,掌握算符优先分析法的关系表的构造以及分析过程。
•教学重点:算符优先表构造及算符优先分析法。
1自底向上分析法的基本思想•从输入串开始,朝着文法的开始符号进行最左归约,直到到达文法的开始符号为止。
•工作方式:“移进-归约”方式。
2分析程序模型1)初态时栈内仅有栈底符“#”,读头指针在最左单词符号上。
2)语法分析程序执行的动作:a)移进读入一个单词并压入栈内,读头后移;b)归约检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号;c)识别成功移进-归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符;d)识别失败语法分析程序语法表a+b……#输出带#3例如:有文法如下(1)S→aAcBe(2)A→b(3)A→Ab(4)B→d问:语句abbcde是不是该文法的合法语句?4•例:设文法G(S):(1) S aAcBe(2) A b(3) A Ab(4) B d 试对abbcde进行“移进-归约”分析。
bbcde bbcde b cde de deabbcde eB cA a SB A a 5成功11接受2,3,4,1##S 10归约##aAcBe 9移进2,3,4e ##aAcB 8归约e ##aAc d 7移进de ##aAc 6移进2,3cde ##aA 5归约cde ##a Ab 4移进2bcde ##aA 3归约bcde ##a b 2移进bbcde ##a 1移进abbcde ##0动作输出带输入串栈步骤移进归约的分析过程G[S]:(1)S →aAcBe(2)A →b(3)A →Ab(4)B →d 6遇到的问题:(1)如何找出进行直接归约的简单短语?(2)找出的简单短语应直接归约到哪一个非终结符?关键:确定句柄.常用的分析方法:(1)优先分析法(2)LR分析法7b db ac eSA B A d b a c e S A B A d a c eSA B a c e A B S 没有语法树如何确定句柄?86.1 自底向上优先分析法概述•基本思想:利用文法符号中相邻符号之间的优先关系(谁先规约的优先关系)找出句柄。
编译原理之自底向上的优先分析法(40页)
2021/8/25
int * int +
int
8
A Shift-Reduce Parse in Detail (3)
|int * int + int int | * int + int int * | int + int
2021/8/25
文法G[E]:E→E+E|E-E|E*E|E/E|EE|(E)|i
(1)i的优先级最高 (1) 优先级次于i,右结合 (2)*和/优先级次之,左结合
+ -*/ ( ) i# +>><<<<><> ->><<<<><> *> > > > < < > < >
(3)+和-优先级最低,左结合
/>>>><<><>
|int * int + int int | * int + int int * | int + int int * int | + int int * T | + int
T
2021/8/25
int * int +
int
11
A Shift-Reduce Parse in Detail (6)
|int * int + int int | * int + int int * | int + int int * int | + int int * T | + int T | + int
编译原理第五章 (1)
简单优先分析算法要点
找第一个使Sj⊳Sj+1的Sj 从Sj开始往前(左)找第一个使Si-1⊲Si的Si
用SiSi+1…Sj去查产生式的右部,并用相应 的左部符号代替句柄SiSi+1…Sj (归约) 。
重复上述过程,直至输入符结束。如果归 约出文法的开始符号则成功。否则失败。
简单优先分析实例
优先关系矩阵 一个文法的全部优先关系可以用矩阵来表示,Biblioteka 称作优先关系矩阵。
例: Z bMb Ma M (L L Ma)
Z FIRST b LAST b M a, ( a ,L, ) L M, ( , a )
Z FIRST b 例: Z bMb LAST b
文法优先关系的确定 FIRST(W) ={S | W + S…,S(VNVT)} LAST(W) ={S | W + …S,S(VN VT)}
若有U…SiSj…: 则有Si Sj ; 若有U…SiW…:任SjFIRST(W),有Si ⊲ Sj 若有U…VW…:任SiLAST(V), Sj(FIRST(W) {W})则有Si ⊳ Sj 输入流的开始和结束标志 ‘#’,文法的开始符为Z, SFIRST(Z),有# ⊲ S,; 且# ⊲ Z SLAST(Z),有S ⊳ #,; 且Z ⊳ #
符号栈 # #b #b( 关系 输入流 b(aa)b# (aa)b# aa)b#
#b(a #b(M #b(Ma #b(Ma)
#b(L #bM
⊲ ⊲ ⊲ ⊳
a)b# a)b# )b# b#
b# b#
例: Z bMb Ma M (L L Ma)
编译原理与技术 自底向上分析
∙ 报错(error)-出现语法错误,调错误恢复例程
2020/2/19
《编译原理与技术》讲义
14
移进-归约分析
怎么可能呢?
分析动作冲突
∙ 移进-归约冲突(shift-reduce conflict)
当“句柄”处于栈顶时,分析动作指示既
可以将下一输入符号移入栈顶top,又可以实 施归约操作。如何动作呢?
串abbcde$的对应分析树 的建立过程。
2020/2/19
Hale Waihona Puke 输入串 a b b c d e $
《编译原理与技术》讲义
5
自底向上分析
e.g.17 文法G6 1)SaABe 2)AAbc 3)Ab 4)Bd
串abbcde$的对应分析树 的建立过程。
2020/2/19
输入串 a b b c d e $
2020/2/19
《编译原理与技术》讲义
2
自底向上分析
分析技术的关键-句柄的识别
句柄(handle)是什么? 一般地,如果有以下最右推导序列,
S r*m A rm ,AP
则产生式A及其在右句型中的位置称为右 句型的句柄。
2020/2/19
《编译原理与技术》讲义
《编译原理与技术》讲义
9
自底向上分析
e.g.17 文法G6 1)SaABe 2)AAbc 3)Ab 4)Bd
串abbcde$的对应分析树 的建立过程。
AB A
2020/2/19
输入串 a b b c d e $
《编译原理与技术》讲义
10
自底向上分析
e.g.17 文法G6 1)SaABe 2)AAbc 3)Ab 4)Bd
编译原理-第五章习题答案
上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤 (1) (2) (3) (4) (5) (6)
栈
# #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
输入 abbcde# bbcde# bcde# bcde# cde# cde#
上一页
下一页
20
5)构造算符优先文法G的优先表的算法
思路:对文法中的每一个产生式的候选式检查,判断句型中相邻符号之间 的关系 来构造优先表; 具体算法: FOR 每条产生式P→X1X2…Xn FOR i=1 TO n-1 IF Xi,Xi+1∈VT,THEN Xi=Xi+1; IF i ≤n-2且Xi,Xi+2∈VT,Xi+1∈VN THEN Xi=Xi+2; IF Xi∈VT,Xi+1∈VN THEN FOR FIRSTVT(Xi+1)中的每个a Xi <. a; NEXT IF Xi∈VN,Xi+1∈VT THEN FOR LASTVT(Xi)中的每个a DO a .> Xi+1; NEXT NEXT NEXT
上一页
下一页
8
例:5.1 P85 文法: E→T|E+T T→F|T*F F→i|(E) 句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上 E 句型:E+T*F+i 短语:E+T*F+i,E+T*F,T*F,i 直接短语:T*F和i E + 句柄:T*F
编译原理讲义(第五章语法分析--自底向上分析技术)
优先关系
• 和书上的写法不一样,凑合用。 SiSj Si Sj Si Sj • 注意: , , 之间不同于=,>和<。 由Si Sj不能导出Sj Si。
优先关系的例子
• 文法:Z::=bMb M::=(L|a L::=Ma) • 语言:{bab, b(aa)b, b((aa)a)b, …} • 可以从语法树里面导出部分优先关系。
关系闭包和Warshall算法
• Warshall算法是利用矩阵计算关系传递闭包的方法。计 算B的传递闭包的算法伪代码如下: 对于外层循环,当 A = B; i=K的循环结束的时 for (i = 1; i<=n; i++) 候,满足:如果Si和 for (j=1; j<=n; j++) Sj满足Si R Si1, Si1 R { Si2, … Sin R Sj, 并 if (A[j,i]==1) 且im<K, 那么现在 for(k=1; k<=n; k++) A[i,j] = 1; A[j,k] = A[j,k]+A[i,k] }
基本方法(续)
• 归约中的动作有4类
– 移入:读入一个符号并把它归约入栈。 – 归约:当栈中的部分形成一个句柄(栈顶的 符号序列)时,对句柄进行归约。 – 接受:当栈中的符号仅有#和识别符号的时 候,输入符号也到达结尾的时候,执行接受 动作。 – 当识别程序觉察出错误的时候,表明输入符 号串不是句子。进行错误处理。
计算优先关系的例子P136
• 文法:S::=Wa W::=Wb W::=a • 将文法中的符号按照S,W,a,b排列。
0100 BHEAD= 0110 0000 0000
0010 0011 0000 0000
编译原理自底向上优先分析课件
CHAPTER 02
自底向上优先分析基础
文法和语言
定义
文法是描述语言的语法结构的形式化工具,由一组产生式构成。语言是文法产生的所有句 子的集合。
上下文无关文法
在编译原理中,常用上下文无关文法来描述程序设计语言的语法结构。这种文法的产生式 形式为A→β,其中A是非终结符,β是终结符和非终结符组成的字符串。
随着量子计算的快速发展, 如何设计适用于量子计算环 境的编译器成为一项迫切需 求。自底向上的优先分析方 法有望在量子计算环境下的 编译器设计中发挥重要作用。
跨平台和跨语言 支持
为了满足不同平台和语言的 需求,未来研究可以关注如 何使自底向上优先分析方法 更好地支持跨平台和跨语言 编译。
THANKS
CHAPTER 04
LALR分析算法
LALR分析表的构建
01
02
03
步骤一
步骤二
步骤三
构造文法的LR(1)分析表。LALR分析 算法首先会为给定的上下文无关文法 构造LR(1)分析表。该分析表包含了所 有可能的状态和对应的动作(移进、 规约或接受)。
合并同心集。在LR(1)分析表的基础上, LALR分析算法会识别并合并所谓的“ 同心集”(即具有相同闭包和goto函 数的项集)。这一步骤有效地减少了 状态的数量,从而使得分析表更小、 更简洁。
结构。该表根据当前分析状态和输入符号,指导归约操作的进行,提高
了分析效率。
本课件的内容和结构
主要内容
本课件将详细介绍自底向上优先分析方法的基本原理、归约过程、分析表的使用 以及相关的优化技术。通过实例和案例,展示这种方法在编译器设计中的应用。
结构安排
首先介绍编译原理概述和自底向上优先分析方法的基本原理,然后深入讲解归约 过程和分析表的使用,最后探讨相关的优化技术和应用案例。课件将结合理论和 实践,使读者更好地理解和掌握自底向上优先分析方法。
编译原理 第5章
例:有文法G(S):
S→bAb A→( B | a B→Aa ) 解:文法符号优先关系推导如下: (1) 求=· 关系: 由S→bAb , A→( B, B→Aa ) b =· A, A =· b, (=· B , A =· a, a =· )
自底向上的语法分析
• 核心问题
– 寻找可归约串。对“可归约串”概念的不同定义, 就形成了不同的自底向上的分析方法。在算符优 先分析法中我们用“最左素短语”来刻画“可归 约串”,在“规范归约”中,则用“句柄”来刻 画“可归约串”
分析方法
• 输入串:
abbcde
S → a A c B e A → A b|b B → d
S
b
>·
=· <·
>·
A
(
=·
<· <· =·
=·
<·
B
a
>·
>·
>·
>· =· =·
)
#
寻找句柄
>·
<· <·
>·
简单优先文法的定义: (1)在文法符号集中,任意两个符号之间最多只有 一种优先关系; (2)在文法中任意两个产生式没有相同的右部。
语法树结构如下:
S S S b S b
b
A b
B
b
U S0…Sj-1SjSj+1Sj+2… …Si-1SiSi+1…Sn
算符优先分析
• 我们要通过两个相邻符号SiSi+1之间的关系来找到句 柄: – SiSi+1在句柄内:必然有规则U …SiSi+1… – Si在句柄内部,但是Si+1在句柄之后:必然有规则 U …Si,且存在规范句型…USi+1…。 – 如果Si+1在句柄内,而Si在句柄外,那么必然存在 规范句型…SiU…,且U Si+1…。
编译原理自底向上的语法分析
规范前缀
或者终极符串
规范句型
一些相关概念
规范活前缀:满足如下条件之一的规范前缀称为规范 活前缀:
该规范前缀不包含简单短语;
该规范前缀只包含一个简单短语,而且是在该规范前缀的最 后(这个简单短语就是句柄);
Z ABb 规范活前缀:
规范前缀为 AB, ABb AB(不包含简单短语) , ABb(包含一个简单短语且在最后)
自顶向下语法分析回顾 自底向上语法分析的例子 自底向上语法分析的主要思想 自底向上语法分析的关键问题 一些相关概念
自顶向下分析例
自顶向下分析过程是从文法开始符出发,为所给输入串构造
最左推导的过程。
输入
句型
动作
P: (1) Z aBeA (2) A Bc (3) B d (4) B bB (5) B
移入型规范活前缀
归约:规范活前缀只包含一个简单短语,而且是在该规范
活前缀的最后;
可归约规范活前缀 :归约规范活前缀
Z ABb
规范前缀为 AB, ABb
规范活前缀: AB(不包含简单短语) --- 移入型规范活前缀
ABb(包含一个简单短语) --- 归约规范活前缀
自底向上分析知识关系图
推导(*)
句型(S *)
( E) E +T
每棵简单子树(只有一层的子树)的叶子节 点构成简单短语:T、E+T、i
最左简单子树的叶子节点构成句柄: T
一些相关概念
自顶向下的语法分析方法中曾介绍过: 推导:对句型中的非终极符用产生式右部替换
推导的逆过程称为归约
规范推导:一个句型的最右推导称为该句型的 规范推导; 规范推导的逆过程称为规范归约(最左归约)
分析动作:移入(shift),归约(reduce) 包含以下方法:
第5章+自底向上的语法分析
OPG优先关系的构造
1. 由算法构造算符优先关系 2. 由关系图构造算符优先关系(自学)
36
由算法构造算符优先关系 定义: FIRSTVT(B)={b|B=>+ b…,或B=>+ Cb…} LASTVT(B)={a|B=>+… a,或B=>+… aC} 构造优先关系: 1. ±关系:若有形如A→…ab… A→…aBb…的 产生式,则a ± b。 2. ≮关系:若有形如A→…aB…的产生式,b ∈ FIRSTVT(B),则a ≮b。 3. ≯关系:若有形如A→…Bb…的产生式,a 37 ∈ LASTVT(B),则a ≯ b。
7
自底向上分析方法的分类
寻找句柄的方法不同,就形成了不 同的自底向上分析方法。 优先分析法
简单优先分析法(句柄)
算符优先分析法(最左素短语)
LR分析法(句柄)
8
§5.2 短语、直接 短语及句柄
9
刻画“可归约串”
句型的短语 S =>* αAδ且 A =>+ β,则称β是句型αβδ 相对于非终结符A的短语。 句型的直接短语 若有A β,则称β是句型αβδ相对于非终 结符A 的直接短语。 句型的句柄 一个句型的最左直接短语称为该句型的句 柄。
直观算符优先分析法
为了易于理解算符优先分析法,先介绍 一种简单的算符优先分析法—直观算符优 先分析法。 四则运算的例子说明了运算的次序只与 运算符有关,而与运算对象无关。 因而直观算符优先分析法的关键是对一 个给定文法G,人为地规定其算符(终结符) 的优先关系,再根据任何两个可能相继出 现的终结符的优先关系对输入串进行归约。31
e
B A a S5
a
第五章 自底向上的语法分析概述
前缀? 前缀
构造一个判定归约规范活前缀的自动机 -- LR自动机 自动机 自动机构造LR分析表指导 由LR自动机构造 分析表指导 分析 自动机构造 分析表指导LR分析
LR 分析机制
规范活 前缀 LR分析表 分析表
a
… …
…
#
输入
LR驱动程序 驱动程序: 驱动程序 - shift(移入 :移入型规范活前缀 移入) 移入 移入型规范活前缀 - reduce(归约 可归约规范活前缀 归约):可归约规范活前缀 归约
一些相关概念
自顶向下的语法分析方法中曾介绍过: 自顶向下的语法分析方法中曾介绍过: 推导: 推导:对句型中的非终极符用产生式右部替换 推导的逆过程称为归约 规范推导: 规范推导:一个句型的最右推导称为该句型的 规范推导; 规范推导 规范推导的逆过程称为规范归约(最左归约) 规范句型(右句型 : 规范句型 右句型):从开始符通过规范推导得 右句型 到的句型; 到的句型 规范归约过程中产生的句型仍是规范句型 规范归约的过程也是对规范句型的最左简 单短语(句柄)进行归约的过程
Z ⇒ ABb 规范活前缀: 规范活前缀
规范前缀为 AB, ABb AB(不包含简单短语 , 不包含简单短语) 不包含简单短语 ABb(包含一个简单短语且在最后 包含一个简单短语且在最后) 包含一个简单短语且在最后
Z ⇒+ abcb 规范前缀为 a, ab, abc, abcb 规范活前缀: 包含一个简单短语且在最后) 规范活前缀 a (包含一个简单短语且在最后 包含一个简单短语且在最后 abc是不是规范活前缀? 是不是规范活前缀? 是不是规范活前缀 (不是,包含两个简单短语 和c) 不是, 不是 包含两个简单短语a和
a
b
e
编译原理 语法分析—自底向上分析技术
是算符优先文法。 + * ( + > < < * > > < ( < < < ) > > i > >
) i > < > < ═ < > >
5.2.4 算符优先文法句型的识别
1.质短语 质短语:句型中至少包含一个终结符号,且除它自 身外不再包含其他质短语的短语。 如文法 G[E]:E::=E+T|T T::=T*F|F F::=(E)|i 的句型E+T*F*i+i中的T*F和 i 是质短语。如何人工寻找 句型中的质短语?先找出一切短语,再从最短的找起。
1 2 3 4 5 6 7 8
i+(i+i)*i F+(i+i)*i F+(F+i)*i F+(F+F)*i F+(E)*i F+F*i F+F*F F+T
#< i >+ #< + < ( < i > + #< + < ( <+< i >) #< + < ( <+> ) #< + < ( = ) > * #< + <* < i > # #< + <* ># #< + >#
E+T*F*i+i中的短语和质短语? 句型分析中自动寻找质短语的思路: 先从左向右寻找质短语的尾终结符号, 再从右向左寻找质短语的头终结符号,
即,先找优先关系
(?) 再找优先关系
(?)
2.句型的识别 关于文法G[E],对输入符号串i+(i+i)*i句型分析
步骤 句 型 关 系 最左质短语 归约到符号
按自底向上分析技术,句型分析的过程是一个不断 从语法分析树中剪去分支的过程。
编译原理系列之五自底向上优先分析(1)-简单优先分析法
编译原理系列之五⾃底向上优先分析(1)-简单优先分析法简单优先分析法1.基本概念通过语法树来理解这三个概念更加简单:⽂法G1[S]:S→ABA→bBA→AaB→aB→Sb语法树1. 短语:若S=*=>αAδ且A=+=>β,则称β是相对于⾮终结符A的句型αβδ的短语。
即:语法树中以⾮终结符的作为根的⼦树的叶⼦所组成的字符串。
如:ba是相对于⾮终结符A的句型AB的短语。
句型baSb的短语有ba,a,Sb,baSb。
2. 直接短语:若S=*=>αAδ且A=>β,则称β是相对于⾮终结符A的句型αβδ的直接短语。
即:语法树中以⾮终结符的作为根的⼦树,它的孩⼦都是叶⼦,没有其他⼦树。
如:Sb是相对于⾮终结符B的句型AB的短语。
句型baSb的短语有a,Sb。
3. 句柄:位于句型最左边的直接短语称为该句型的句柄。
即:位于语法树中最左边的直接短语。
如:句型baSb的句柄是a。
2.优先关系定义1. X和Y优先级相等,表⽰为X=·Y,当且仅当G中存在产⽣式规则A=>···XY···。
解读:X、Y的优先级相同,当XY存在⼀个句柄之中,它们将同时被归约。
表现在语法树中S=·b。
优先级相等在语法树中1. X优先级⼩于Y,表⽰为X<·Y,当且仅当G中存在产⽣式规则A=>···XB···,B=+=>Y···。
解读:X优先级⼩于Y,当XY存在⼀个句型中时,它们将不可能出现在同⼀个句柄中,Y⼀定⽐X先被规约。
表现在语法树中b<·a。
优先级⼩于语法树中1. X优先级⼤于Y,表⽰为X>·Y,当且仅当G中存在产⽣式规则A=>··BD···,B=+=>···X,D=*=>Y···。
编译原理第五章语法分析——自下而上分析
第五章语法分析——自下而上分析要紧内容:[1]自下而上分析的大体问题[2]算符优先分析法[3]算符优先分析表和优先函数的构造[4]LR分析器的大体原理大体要求:[1]明白得自下而上分析法的大体思想[2]明白得有关归约、短语、句柄、标准归约等概念[3]把握算符优先分析法[4]了解算符优先表和优先函数的构造技术[5]了解LR 分析器大体原理和工作方式教学要点:本章介绍自下而上语法分析方式。
所谓自下而上分析法确实是从输入串开始,慢慢进行“归约”,直至归约到文法的开始符号;或说,从语法树的结尾开始,步步向上“归约”,直到根结。
讲义摘要:5.1 自下而上分析大体问题自下而上分析法的大体思想:从输入串开始,慢慢进行“归约”,直到文法的开始符号。
即从树结尾开始,构造语法树。
所谓归约,是指依照文法的产生式规那么,把产生式的右部替换成左部符号。
自上而下分析的核心问题是:如何判定符号串的可归约性,和如何归约。
即,识别可归约串的问题。
归约自下而上分析法事实上确实是一种“移进-归约”法,即,采纳“移进-归约”思想进行。
实现思想是:对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,(该句型对应某产生式的右部,即栈顶生成了某产生式的右部的文法符号串),就将栈顶的这一部份替换成 (归约为) 该产生式的左部符号,这称为归约。
重复这一进程直到归约到栈中只剩文法的开始符号时那么为分析成功,也就确认输入串是文法的句子。
现举例说明。
例1:设文法G[S]为:(1) S→aAcBe(2) A→b(3) A→Ab(4) B→d试对abbcde进行“移进-归约”分析。
步骤: 1 2 3 4 5 6 7 8 9 10解:动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)表1符合栈的转变进程自下而上语法分析的进程也可看成自底向上构造语法树的进程,每步归约都是构造一棵子树,最后当输入串终止时恰好构造出整个语法树,如图1所示。
编译原理作业集-第五章-修订
第五章语法分析—自下而上分析本章要点1. 自下而上语法分析法的基本概念:2. 算符优先分析法;3. LR分析法分析过程;4. 语法分析器自动产生工具Y ACC;5. LR分析过程中的出错处理。
本章目标掌握和理解自下而上分析的基本问题、算符优先分析、LR分析法及语法分析器的自动产生工具YACC等内容。
本章重点1.自下而上语法分析的基本概念:归约、句柄、最左素短语;2.算符优先分析方法:FirstVT, LastVT集的计算,算符优先表的构造,工作原理;3.LR分析器:(1)LR(0)项目集族,LR(1)项目集簇;(2)LR(0)、SLR、LR(1)和LALR(1)分析表的构造;(3)LR分析的基本原理,分析过程;4.LR方法如何用于二义文法;本章难点1. 句柄的概念;2. 算符优先分析法;3. LR分析器基本;作业题一、单项选择题:1. LR语法分析栈中存放的状态是识别________的DFA状态。
a. 前缀;b. 可归前缀;c. 项目;d. 句柄;2. 算符优先分析法每次都是对________进行归约:(a)句柄(b)最左素短语(c)素短语(d)简单短语3. 有文法G=({S},{a},{S→SaS,S→ε},S),该文法是________。
a. LL(1)文法;b.二义性文法;c.算符优先文法;d.SLR(1)文法;4. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LL(1)分析法属于自顶向下分析;a. 深度分析法b. 宽度优先分析法c. 算符优先分析法d. 递归下降子程序分析法5. 自底向上语法分析采用分析法,常用的是自底向上语法分析有算符优先分析法和LR分析法。
a. 递归b. 回溯c. 枚举d. 移进-归约6. 一个LR(k)文法,无论k取多大,。
a. 都是无二义性的;b. 都是二义性的;c. 一部分是二义性的;d. 无法判定二义性;7. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LR分析法属于自底向上分析。
第5章自底向上优先分析技术
自顶向下分析法是从文法的识别符开始,试图推导出输入符号串;自底向上分析方法与自顶向下的分析方法完全相反,它从输入符号串出发,试图归约到文法的识别符。本章要点: 自底向上分析法的基本原理 简单优先分析技术 算符优先分析法 优先函数
自底向上分析方法
从语法分析的角度考虑,自底向上的语法分析过程就是以输入符号串为语法树的末端结点符号串,试图向着根结点方向向上构造语法树,使识别符号正是语法树的根结点。 基本思想:从输入串开始,朝着文法的开始符号进行最左归约,直到到达文法的开始符号为止。主要是进行移进或归约操作,采用最左归约。 注意:输入串在这里是指从词法分析器送来的单词符号组成的二元式的有限序列。
‘#’用来表示句子括号‘#’的优先性<所有的符号,所有的符号 >’#’
例:设文法 S(R)|a|∧ RT TS,T|S 根据定义写出各个文法符号之间的优先关系?
S
(
R
)
a
∧
T
,
#
S
>
=
>
(
<
<
=
<
<
<
R
=
)
>
>
>
a
>
>
>
∧
>
>
>
T
>
=
,
<
<
<
<
=
#
<
=
简单优先文法定义
例 设文法 S(R)|a|∧ RT TS,T|S 运用简单优先分析算法对终结符号串=((a),a)进行检查是否是文法定义的句子?
编译原理_05自底向上的语法分析方法
例1:文法:
SaAcBe
A b A Ab
B d 输入串abbcde#分析 最右推导:
SaAcBe aAcde aAbcde abbcde
规约分析过程如下:
5
步骤 1 2 3 4 5 6 7 8 9 10 11
符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
11
步骤 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11)
符号栈 输入符号串 # i+i*i# #i +i*i# #E +i*i# #E+ i*i# #E+i *i# #E+E *i# #E+E* i# #E+E*i # #E+E*E # #E+E # #E #
12
优先关系 #<i #<i>+ #<+ +<i +<i>* +<* *<i *<i># +<*># #<+>#
教学总结
算符优先关系表是指用表格形式来表示各终结 符号的优先关系的表。 为分析算符之间的优先关系,引入两个概念: firstVT集合和lastVT集合:对于非终结符B,有 firstVT (B)={b|Bb… 或 BCb…} lastVT(B)={a|B…a 或 B…aC} 为解决在算符优先分析过程中如何寻找句柄,引 进最左素短语的概念。 算符优先分析法只适用于对表达式的分析,其特 点是分析速度快。
对输入符号串自左向右进行扫描并将输入符自底向上分析方法的基本思想4逐个移入一个后进先出栈中边移入边分析一旦栈顶符号串形成某个句型的句柄时就用该产生式的左部非终结符代替相应右部的文法符号串称为归约
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“d”是句型 “aAcde”的句柄
“aAcBe”是句型 “aAcBe”的句柄
➢句柄是与某个产生式的右部匹配的串, 归约到这个产生式左边的非终结符,表 示的是最右推导的逆过程的一步。
例如
S->aAcBe A->b A->Ab B->d
S=>aAcBe=>aAcde=>aAbcde=>abbcde d 是句型 “aAcde”的句柄
6
$aA
cde$
移进
➢右句型和移进-归约分析
移进-归约分析程序将终结符从输入移进 到栈直到它能执行一个归约以得到下一 个右句型
2) 可行前缀
➢ 分析栈的符号序列都被称作为右句型的可行 前缀
Stack Input
6
$aA
cde$
7
$aAc de$
8
$aAcd e$
Action shift shift reduce B→d
“aAcde” 是右句型,它在第6,7和8被分析栈和输 入分隔
aA, aAc, aAcd 都是右句型 aAcde的可行前缀
➢可行前缀和移进-归约分析
只要分析栈的内容是右句型的可行前缀, 则移进-归约分析就是正确的
3) 句柄
➢ 匹配用于下一个归约的产生式右边的符号串
➢ 它在右句型中发生的位置以及用来归约它的 产生式被称作右句型的句柄
例 G: S → cAd A → ab A→a
串 “cabd”的自底向上分析
归约过程 : cabd |-cAd |-S
S
用 “|-” 表示一次归约
A
c abd
自底向上分析的关键问题
串 “cabd”的两个归约过程:
S→cAd
A→ab A→a
(1)cabd|-cAd|-S 可以归约到 S
(2)cabd|-cAbd 不能归约到 S
第五章 自底向上的分析
学习目标:
– 掌握 LR(0) 分析, SLR(1) 分析
– 理解: 右句型, 可行前缀, 句柄
– 了解 LALR(1) 分析, LR(1) 分析
5.1 自底向上分析概览 5.2 LR 分析方法概览 5.3 LR(0)项的有穷自动机和 LR(0) 分析 5.4 SLR(1) 分析 5.5 一般的 LR(1) 和 LALR(1) 分析
2.归约: 若有BNF选择A->α, 将栈顶部 的串α归约为非终结符A
因此自底向上的分析程序也称作移进-归约 分析程序
例 G: S->aAcBe A->b A->Ab 串 “abbcde$” 的自底向上分析是:
分析栈 输入
1
$
abbcde$
2
$a
bbcde$
3
$ab
bcde$
4
$aA
bcde$
5
$aAb cde$
➢ 即, 若 S=>*(最右)αAw=>(最右)αβw, 则 β句型αβw 的句柄, 句柄的右边w 仅包含终结符
句柄必须满足三个条件: 1) Αβw是右句型
2) S=>*(最右)αAw 3) A-> β是产生式 ➢ 经常简称为子串 β 是 “αβw” 的句柄
例如 G[E]:
E→E+T | T T→T*F | F F→(E) | id
6
$aA
cde$
7
$aAc de$
8
$aAcd e$
9
$aAcB e$
10
$aAcBe $
11
$S
$
B->d
动作 移进 移进 用 A→b归约 移进 用 A→Ab归约 移进 移进 用 B→d归约 移进 用 S→aAcBe归约 接受
➢解释
❖为了判断要完成的动作,自底向上的分 析程序会需要在栈内看得更深而不仅仅 是顶部。
移进
3
$ab
bcde$
用 A→b归约
4
$aA
bcde$
Hale Waihona Puke 移进5$aAb cde$
用 A→Ab归约
6
$aA
cde$
移进
7
$aAc de$
移进
8
$aAcd e$
用B→d归约
9
$aAcB e$
移进
10
$aAcBe $
用S→aAcBe归约
11
$S
$
接受
“b” 是句型 “abbcde”的句柄
“Ab” 是句型 “aAbcde”的句柄
❖因此我们将使用状态来表示栈中的内容
实现的关键
➢确定何时移进、何时归约?
➢不同的移进-归约分析方法将导致具有不 同能力和复杂性的分析程序
3 自底向上分析程序的特性
1) 右句型 2) 可行前缀 3) 句柄
1) 右句型
➢ 移进-归约分析程序描绘出输入出最右推导的 逆过程
例如 S->aAcBe A->b A->Ab B->d “abbcde” 的最右推导是: S=>aAcBe=>aAcde=>aAbcde=>abbcde 移进-归约分析过程是 abbcde |- aAbcde |- aAcde |- aAcBe |- S
➢在最右推导中每一个中间串都成为右句型 abbcde |- aAbcde |- aAcde |- aAcBe |- S ➢每个右句型被分析栈和输入分隔开
分析栈 输入
动作
1
$
abbcde$ 移进
2
$a
bbcde$
移进
3
$ab
bcde$
用A→b归约
4
$aA
bcde$
移进
5
$aAb cde$
用 A→Ab归约
例如
右句型 “abbcde”, 它的句柄是最左边的串 “b”,和产生式 A->b
➢句柄和移进-归约分析
❖判定分析中的下一个句柄是移进-归约分 析的主要任务
❖当栈顶形成句柄时,采取的动作是 “归 约”
❖当栈顶没有形成句柄时候,采取的动作 是 “移进”
分析栈 输入
动作
1
$
abbcde$ 移进
2
$a
bbcde$
➢在每次归约时, 与产生式右边匹配的子串 由产生式左边的结构名替代。
➢自底向上分析的关键问题是如何决定归 约的子串
2 自底向上分析的实现
分析栈 ➢ 自底向上的分析程序使用了显式栈来完成分析 ➢ 将自底向上分析示意为:
分析栈
输入
动作
$
InputString$
…
…
$StartSymbol $
接受
➢自顶向下分析和自底向上分析中的栈
“T*F+id” 的最右推导为
E=>E+T=>E+F=>E+id=>T+id=>T*F+id
因此 T*F 是 T*F+id 的句柄
右句型αβw 的分析树中的 β
S
α A
句柄是最左子树的叶子,
最左子树包含着一个结点 和它的孩子
❖自顶向下分析栈包含 记号和非终结符,而自 底向上分析栈包含 记号,非终结符和状态
❖自顶向下分析栈存储分析中等待匹配的符号, 而自底向上的分析栈存储的是已经匹配的符 号。
自底向上分析的实现 ➢基于 栈的内容 和输入的下一个作为先行
符号来确定下面要执行的动作 ➢自底向上的分析程序有两种可能的动作:
1.移进: 将终结符从输入的开头移进到栈 的顶部