第六章自底向上优先分析
第6章-自底向上的LR分析法
DFA的状态,将go函数作为状态转换函数, 构造出的DFA即为所求。
初始状态:CLOSURE({S ’ →.S})
40
例题
例6.1 对于文法G[S]: S→vI:T I→I,i I→i T→r 经拓广并对产生式编号后为G’[S]: 1. S’ →S 2. S → vI:T 3. I→I,i 4. I→i 5. T→r
文法G[S]的拓广:G’[S’]=G[S]+{S’ → S}; 文法的每个项目为NFA的一个状态; 确定状态之间的转换关系; 按规则可对文法G’的所有项目对应的状态构
造出识别活前缀的NFA。
34
LR(0)项目集规范族C
提出“LR(0)项目集规范族”的原因 若按以上方法先构造NFA,然后再确定
37
若I={E ’ →.E} CLOSURE(I)为:
E ’ →.E E→.E+T E→.T T→.T*F T→.F F→.i F→.(E)
利用上述算法可以把拓广文法G’的所有 LR(0)项目分成几个等价类,每个等价类就是 识别活前缀的DFA的一个状态。
38
go(I,X)函数
如果LR(0) 项目集规范族中的每个项目 集看做DFA一个状态,则项目集规范族的go 函数把这些项目集连接成一个DFA。
12
LR(k)的含义
L表示从左到右扫描输入串; R表示利用最右分析方法来识别句子,即构造 一个最右推导的逆过程; k表示向右查看输入串符号的个数。
规范推导的逆过程,所以LR 分析过程是规范归约的过程。
LR分析法根据当前分析栈中的符号串和 向右顺序查看输入串的k个符号就可以唯一确 定分析器的动作是移进还是归约、利用那个 产生式进行归约。
第6章 LR分析
(3)查状态转换表,新的状态进状态栈。 ※接受:分析成功,终止分析。 ※出错:报告出错信息。 (2) 具体分析过程:
LR分析算法
• 置ip指向输入串w的第一个符号
▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ 令S为栈顶状态 a是ip指向的符号 重复 begin if ACTION[S,a]=Sj then begin PUSH j,a(进栈) ip 前进(指向下一输入符号) end else if ACTION[S,a]=rj (第j条产生式为A)
Action[sm, ai]= sj 表示移进ai ,并转 j 状态 格局变为: 分析栈 s0s1… sm j 输入串 #X1…Xmai ai+1…an#
4、LR分析器的工作过程(续2)
Action[sm, ai]= rj 表示用第 j 条产生式 A→Xm-(k-1)…Xm (有k个符号) 进行归约, 格局变为: 分析栈 s0s1… sm-k 输入串 #X1…Xm-kA aiai+1…an#
2、LR分析器的逻辑结构
• 一个输入串,结束符#,指针ip指当前符号。 • 一个下推分析栈,状态栈和符号栈合在一起,记录 分析的历史和展望材料。状态栈顶的状态sn, 是能识 别符号栈中的符号串X1X2…Xn 的DFA的状态。 • 一个LR分析表,两个子表合在一起。 • 一个LR分析程序,其大致的工作过程:分析的每一 步都根据分析栈顶的状态和当前输入符号,查分析 表,以决定下一步的动作。 • 不同的LR分析器,其总控程序都一样,不同的是其 LR分析表,构造LR分析表的方法不同就形成各种不 同的LR分析法。
一、相关概念
前缀是指该字的任意首部。
例:字abc 的前缀有ε,a,ab,abc
活前缀:是指规范句型的一个前缀,这种
编译原理-清华大学-第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 自底向上优先分析法概述•基本思想:利用文法符号中相邻符号之间的优先关系(谁先规约的优先关系)找出句柄。
第六章 语法分析-自下而上分析法
一、自下而上语法分析的基本问题 1.归约: 如何判断栈顶符号的可归约性以及如何归约,是 自下而上分析的中心问题。 2.短语和句柄
如果S ⇒ αAβ and A ⇒γ,则称γ是句型 αγβ的相对于变量A的短语 * 如果S ⇒αAβ and A⇒γ,则称γ是句型 αγβ的相对于变量A的直接(简单)短语 最左直接短语叫做句柄
e
abbcde
一、自下而上语法分析的基本问题 (3)自下而上分析的关键问题
似乎移进-归约过程很简单,其实不然,在上面第5步,如果用 规则2(P → b)进行归约而不是用规则3(P → Pb)进行归约,结果 会怎么样呢? 上面的归约过程是从文法的句子abbcde开始,每一步都是把最 左直接短语(句柄)替换为相应产生式的左部符号(在步骤5时 栈顶为#aPb,此时是将b归约为P还是将Pb归约为P?由于此时对 于句型aPbcde(即栈内容+输入缓冲区内容)来说Pb是句柄,故 将Pb归约为P)。也就是说,自底向上分析的关键问题是在分析 中如何确定句柄(准确地说为可归约串),即如果知道何时在 栈顶符号串中已形成了某句型的句柄,那么就可以确定何时进 行归约。对此,不同的分析方法有不同的解决办法。这里主要 介绍算符优先及LR分析方法。
例: 移进—归约分析(Shift-reduce parsing)
要点:建立符号栈,用来纪录分析的历史和现状, 并根据所面临的状态,确定下一步动作是移 进还是归约。
输入串 # 符号栈 #
S.R.P
输入串 # 符号栈 #
S.R.P
分析过程:把输入符号串按自左向右顺序一一地 移进符号栈(一次移一个),检查栈中符号,当在栈 顶的若干符号形成当前句型的句柄时,就根据规则进 行归约,将句柄从符号栈中弹出,并将相应的非终结 符号压入栈内(即规则的左部符号),然后再检查栈 内符号串是否形成新的句柄,若有就再进行归约,否 则移进符号。分析一直进行到读到输入串的右界符为 止。最后,若栈中仅含有左界符号和识别符号,则表 示分析成功,否则失败
算符优先分析法
G[E]: E→E+E|E-E|E*E|E/E|EE|(E)|-E|id
由于该文法是一个二义文法,它的句子往往有不同的规范推导和 归约,实际运算会得到不同结果,但按传统的习惯规定优先级和 结合律进行归约,优先级从高到低为:乘幂运算符,乘、除运算符, 加、减运算符;同级运算符服从左结合原则;有括号时,先括号 内后括号外。 则文法的句子id+id-id*(id+id)的归约过程为:
N1…Ni-1<· Ni …… Nj · >Nj+1…Nn
2.
句型中Ni„„Nj是句柄,语法分析程序可以通过寻找 Ni-1<· Ni和Nj· >Nj+1这两个关系来确定句柄的头尾,从 而确定句柄进行归约。
帮助理解 abce # 控制程序 # ce # b a #
G[S]: S→aBe B→bc bce # 控制程序 e #
知识点
算符优先分析法的算法简单、直观、易于理解,所以通常作为学 习其它自下而上语法分析的基础。 需复习有关语法分析的知识有:什么是语言、文法、句子、句型、 短语、简单短语、句柄、最右推导、规范归约基本概念。 本章重难点 算符文法的形式。 对一个给定的算符文法能构造算符优先关系分析表,并能判别所 给文法是否为 算符优先文法。 分清规范句型的句柄和最左素短语的区别,进而分清算符优先归 约和规范归约的区别。(在分析过程中如何寻找可归约串) 对一个给定的输入串能应用算符优先关系分析表给出分析(归约) 步骤,并最终判断所给输入串是否为该文法的句子。
输出带
2
2,3
2,3,4
2,3,4,1
S
a
A A b b
c
B e d
正规文法和正规式的等价性
A→y
B为新的非终结符,B VN 对形如A→x|y的产生式,重写为: A→x
A→y
不断利用上述规则进行变换即可。
例:将R=a(a|d)*变换成正规文法。令S是文法开 始符号。
例:将R=a(a|d)*变换成正规文法。令S是文法开 始符号。
解:
S→ a(a|d)*
S→aA
A→(a|d) A
A→(a|d)*
S→ aA S→ a
转换为正规式
A→ aA
A→ dA A→ a
A→ d
S→ aA
S→ a A→ aA A→ dA A→ a A→ d S=aA|a A=aA|dA
根据上述规则3
A→x,A→y 推出A=x|y
A=(aA|dA)|(a|d)
A=a|d
将它化为正规文法 变成A→
A=(a|d)A|(a|d)
a,b
0 a 3 b 4 a,b
b
1 b 2 a,b
说明:一个初态,二个终态。
DFA是NFA的特例。
对于每个NFA M,存在一个DFA M’,使得L(M)=L(M’)。 对于任何两个有穷自动机M和M’, 如果L(M)=L(M’),则称M与M’是 等价的。
NFA 转换为等价的DFA
从NFA的矩阵表示中可以看出,表项通常 是一状态的集合,而在DFA的矩阵表示中, 表项是一个状态,NFA到相应的DFA的构 造的基本思路是: DFA的每一个状态对应 NFA的一组状态. DFA使用它的状态去记 录在NFA读入一个输入符号后可能达到的 所有状态.
设r,s,t为正规式,正规式服从代数规律有:
1、r|s=s|r 交换律
2、r|(s|t)=(r|s)|t 结合律
3、(rs)t=r(st) 结合律
编译原理教案
编译原理教案说明:一、参考书:1、陈意云、张昱:《编译原理》,高等教育出版社,2003年。
2、陈意云、张昱:《编译原理习题精选》,中国科技大学出版社,2003年。
3、吕映芝、张素琴、蒋维杜:《编译原理》,清华大学出版社,1998年第二版。
4、王生原、吕映芝、张素琴:《编译原理课程辅导》,清华大学出版社,2007年。
5、伍春香:《编译原理习题与解析》,清华大学出版社,2001年。
6、Andrew W.Appel:《现代编译原理—C语言描述》,人民邮电出版社,2005年。
7、Noam Nison等:《计算机系统要素》,电子工业出版社,2007年。
8、Randall Hyde:《编程卓越之道(第二卷)》,电子工业出版社,2007年。
二、教学目的:通过学习形式语言与自动机理论、词法分析、语法分析、语义分析、代码优化和生成等内容使学生掌握构造编译程序的基本原理和基本方法,并通过上机实习使学生进一步掌握开发应用程序的基本方法,为深入理解计算机系统、程序设计语言与开发大型应用程序打下良好的基础。
三、教学时数:课堂教学51学时,上机实验30学时。
四、授课内容:第一章编译程序概述第二章 PL/0编译程序的实现第三章文法和语言第四章词法分析第五章自顶向下语法分析方法第六章自底向上优先分析方法第七章 LR分析方法第八章语法制导翻译和中间代码生成第九章符号表第一○章目标程序运行时的存储组织第一一章代码优化第一二章代码生成第一章概述一、说明:1、教学目的与要求:了解编译程序的概念、结构以及工作流程。
2、主要内容:什么是编译程序、编译过程概述、编译程序的结构、编译阶段的组合、编译技术和软件工具以及实例分析。
3、教学重点:编译程序的结构以及每一阶段的任务。
4、教学难点:理解编译程序各模块的判错功能、编译方式和解释方式执行速度上的不同。
二、教学内容第一节编译程序1、机器语言:直接用计算机能够识别的二进制代码指令来编写程序的语言。
第6章自底向上优先分析法
第6章⾃底向上优先分析法⾃底向上分析⽅法,也称移进-归约分析法,粗略地说它的实现思想是对输⼊符号串⾃左向右进⾏扫描,并将输⼊符逐个移⼊⼀个后进先出栈中,边移⼊边分析,⼀旦栈顶符号串形成某个句型的句柄时,(该句柄对应某产⽣式的右部),就⽤该产⽣式的左部⾮终结符代替相应右部的⽂法符号串,这称为归约。
重复这⼀过程直到归约到栈顶中只剩⽂法的开始符号时则为分析成功,也就确认输⼊串是⽂法的句⼦。
本章将在介绍⾃底向上分析思想基础上,着重介绍算符优先分析法。
例6.1,设⽂法G[S]为:(1)S→aAcBe(2)A→b(3)A→Ab(4)B→d对输⼊串abbcde#进⾏分析,检查该符号串是否是G[S]的句⼦。
由于⾃底向上分析的移进-归约过程是⾃顶向下最右推导的逆过程,⽽最右推导为规范推导,⾃左向右的归约过程也称为规范归约。
容易看出对输⼊串abbcde的最右推导为:S aAcBe aAcde aAbcde abbcde由此我们可以构造它的逆过程即归约过程。
先设⼀个后进先出的符号栈,并把句⼦左括号”#”号放⼊栈底。
对上述分析过程也可看成⾃底向上构造语法树的过程,每步归约都是构造⼀棵⼦树,最后当输⼊串结束时刚好构造出整个语法树。
在上述移进-归约或⾃底向上构造语法树的过程中,考虑⼏个问题:u 何时移进?u 何时归约?u 将哪个字符串归约?当⼀个⽂法⽆⼆义性时,那么它对⼀个句⼦的规范推导是唯⼀的,规范规约也必然是唯⼀的。
因⽽每次归约时要找当前句型的句柄,也就是说,任何时候栈中的符号串和剩余的输⼊串组成⼀个句型,当句柄出现在栈顶符号串中时,则可⽤句柄归约,这样⼀直归约到输⼊串只剩结束符,⽂法符号栈中只剩开始符号。
由此可见,⾃底向上分析的关键问题是在分析过程中如何确定句柄,即如何知道何时在栈顶符号串中已形成某句型的句柄。
然⽽⾃底向上的分析算法很多,我们仅在本章和第7章介绍⽬前常⽤的算符优先分析和LR类分析法。
6.1 ⾃底向上优先分析法概述优先分析法⼜可分简单优先法和算符优先分析法。
《编译原理》总复习-07级
《编译原理》总复习-07级第一章编译程序的概述(一)内容本章介绍编译程序在计算机科学中的地位和作用,介绍编译技术的发展历史,讲解编译程序、解释程序的基本概念,概述编译过程,介绍编译程序的逻辑结构和编译程序的组织形式等。
(二)本章重点编译(程序),解释(程序),编译程序的逻辑结构。
(三)本章难点编译程序的生成。
(四)本章考点全部基本概念。
编译程序的逻辑结构。
(五)学习指导引论部分主要是解释什么是编译程序以及编译的总体过程。
因此学习时要对以下几个点进行重点学习:翻译、编译、目标语言和源语言这几个概念的理解;编译的总体过程:词法分析,语法分析、语义分析与中间代码的生成、代码优化、目标代码的生成,以及伴随着整个过程的表格管理与出错处理。
第三章文法和语言课外训练(一)内容本章是编译原理课程的理论基础,主要介绍与课程相关的形式语言的基本概念,包括符号串的基本概念和术语、文法和语言的形式定义、推导与归约、句子和句型、语法分析树和二义性文法等定义、文法和语言的Chomsky分类。
(二)本章重点上下文无关文法,推导,句子和句型,文法生成的语言,语法分析树和二义性文法。
(三)本章难点上下文无关文法,语法分析树,文法的分类。
(四)本章考点上下文无关文法的定义。
符号串的推导。
语法分析树的构造。
(五)学习指导要构造编译程序,就要把源语言用某种方式进行定义和描述。
学习高级语言的语法描述是学习编译原理的基础。
上下文无关文法及语法树是本章学习的重点。
语法与语义的概念;程序的在逻辑上的层次结构;文法的定义,文法是一个四元组:终结符号集,非终结符号集,开始符号、产生式集;与文法相关的概念,字符,正则闭包,积(连接),或,空集,产生式,推导,直接推导,句子,句型,语言,最左推导,最右推导(规范推导);学会用文法来描述语言及通过文法能分析该文法所描述的语言;语法树及二义性的概念、能通过画语法树来分析一个文法描述的语言是否具有二义性;上下文无关文法的定义和正规文法的定义,能判断一个语言的文法是哪一类文法。
编译原理第六章答案-编译原理第六章
第6 章自底向上优先分析第1 题已知文法G[S]为:S→a|∧|(T)T→T,S|S(1)计算G[S]的FIRSTVT 和LASTVT.(2)构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法。
(3)计算G[S]的优先函数。
(4)给出输入串(a,a)#和(a,(a,a))#的算符优先分析过程。
答案:文法展开为:S→aS→∧S→(T)T→T,ST→S(1)FIRSTVT — LASTVT 表:表中无多重人口所以是算符优先(OPG)文法。
友情提示:记得增加拓广文法S`→#S#,所以#FIRSTVT(S),LASTVT(S) #。
(3)对应的算符优先函数为:Success!对输入串(a,(a,a))#的算符优先分析过程为:Success!第2 题已知文法G[S]为:S→a|∧|(T)T→T,S|S(1)给出(a,(a,a))和(a,a)的最右推导,和规范归约过程。
(2) 将(1)和题1 中的(4)进行比较给出算符优先归约和规范归约的区别。
答案:(2)算符优先文法在归约过程中只考虑终结符之间的优先关系从而确定可归约串,而与非终结符无关,只需知道把当前可归约串归约为某一个非终结符,不必知道该非终结符的名字是什么,因此去掉了单非终结符的归约。
规范归约的可归约串是句柄,并且必须准确写出可归约串归约为哪个非终结符。
第3题:有文法G[S]:S VV T|ViTT F|T+FF )V*|((1) 给出(+(i(的规范推导。
(2) 指出句型F+Fi(的短语,句柄,素短语。
(3)G[S]是否为OPG?若是,给出(1)中句子的分析过程。
因为该文法是OP,同时任意两个终结符的优先关系唯一,所以该文法为OPG.(+(i(的分析过程第4题文法G[S]为:S→S;G|GG→G(T)|HH→a|(S)T→T+S|S(1)构造G[S]的算符优先关系表,并判断G[S]是否为算符优先文法。
(2)给出句型a(T+S);H;(S)的短语、句柄、素短语和最左素短语。
编译原理自底向上优先分析
(E: 则有(<FIRSTVT(E)
(4)求>关系
E#: 则有LASTVT(E)>#
E+:则有LASTVT(E)>+
T*: 则有LASTVT(T)>*
P^:则有LASTVT(P)>^
E): 则有LASTVT(E)>)
23
(0)E’#E# (1) EE+T (2)ET
(3)TT*F
(4)TF (5)FP^F|P (6)P(E) (7)Pi
➢ 性质1:在算符文法中,任何句型都不包含两个 相邻的非终结符。
➢ 性质2:如果Ab或(bA)出现在算符文法的句型 中。其中,A为非终结符, b为终结符, 则句型中 任何含b的短语必含有A.
17
6.3.2 算符优先文法的定义
定义3 设有一个不含产生式的算符文法G,如果对任意两
个终结符对a、b之间至多只存在<、>、=三种关系中的
( (, ( a, ( A
(3)求 关系
由SbAb, A=>…), A=>…B, A=>a, 可得:
) b, a b, B b
由BAa), A=>…), A=>a, A=>…B,可得:
) a, a a, B a
8
增:S’#S#
例:文法G[S]:SbAb A(B|a BAa)
文法的简单优先关系矩阵
S b A(B a)#
B=+=>Y… (3)X Y:当且仅当存在规则A…BY…,且
B=+=>…X *
7
例:文法G[S]:SbAb A(B|a BAa)
分析优先关系:
(1)求 关系
b A, A b, ( B, A a, a )
《编译原理》第6章 (1)
…a
a >b
24
由定义直接构造:
预备知识:
定义两个集合:
+ + FIRSTVT(B)={b|B b…或B Cb…},
+ + LASTVT(B)={b|B …b或B …bC}
即最后一个终结符 即第一个终结符
25
三种优先关系的计算为: a)≡关系 条件:A…ab... A…aBb… b) <关系 条件:A…aB… bFIRSTVT(B) 结论:a<b c) >关系 条件:A…Bb… aLASTVT(B) 结论:a>b
20
定义:设G是不含产生式的算符文法,若G中任何两个终 结符号之间至多有一种优先关系存在,则G是一个算符 优先文法OPG。 注:不允许有ab、 a≡b、 ab 中的两种同时存在 要完成运算符间优先级的比较,最简单的办法是先定义 各种可能相继出现的运算符的优先级,并将其表示成矩 阵形式,即得到一个算符优先关系表。在分析过程中通 过查询矩阵元素而获得算符间的优先关系。
了解算符优先分析法的优缺点和实际应用中的局限性
2
【学习指南】
算符优先分析法是自下而上语法分析的一种,它的算
法简单、直观、易于理解,故通常作为学习其它自下 而上语法分析的基础。在学习前,应复习有关语法分 析的知识,如:什么是语言、文法、句子、句型、短 语、简单短语、句柄、最右推导、规范归约基本概念
S
A
A→Ab
最右推导 句型
abbcde
句柄 归约用规则 b A→b
S→aAcBe
aAbcde
Ab
d
A→Ab
B→d
A
A→b
B
B→d
aAcde
编译原理复习(有答案)
第一章引论1.编译过程的阶段由词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个阶段2.编译程序的概念3.编译程序的结构例:(B)不是编译程序的组成部分。
A. 词法分析器;B. 设备管理程序C. 语法分析程序;D. 代码生成程序4.遍的概念对源程序(或其中间形式)从头至尾扫描一次并进行有关加工处理,生成新的中间形式或最终目标程序,称为一遍。
5.编译程序与解释程序的区别例:解释程序和编译程序是两类程序语言处理程序,它们的主要区别在于(D)。
A. 单用户与多用户的差别B. 对用户程序的差错能力C. 机器执行效率D. 是否生成目标代码第三章文法和语言文法的概念字母表、符号串和集合的概念及运算例:(ab|b)*c 与下面的那些串匹配?(ACD)A. ababbc;B. abab;C. c;D. babc;E. aaabc例:ab*c*(a|b)c 与后面的那些串匹配?(BC)A.acbbcB.abbcacC.abcD.acc例:(a|b)a+(ba)*与后面的那些串匹配? (ADE)A.baB.bbaC.ababaD.aaE.baa文法的定义(四元组表示)文法G定义为四元组(V N,V T,P,S)V N:非终结符集V T:终结符集P:产生式(规则)集合S:开始符号(或识别符号)例:给定文法,A::= bA | cc,下面哪些符号串可由其推导出(①② ⑤)。
①cc ②b*cc ③b*cbcc ④bccbcc ⑤bbbcc什么是推导例:已知文法G:E->E+T|E-T|TT->T*F|T/F|FF->(E)|i试给出下述表达式的推导:i*i+i 推导过程:E->E+T->T+T->T*F+T->F*F+T->i*F+T->i*i+T->i*i+F->i*i+i●句型、句子的概念例:假设G一个文法,S是文法的开始符号,如果S=>*x,则称x是句型。
自低而上的优先分析法
分析符号串abbcde是否G[S]的句子
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
S
AB
A
步骤 符号栈 输入符号串
动作
1) # 2) #a 3) #ab
4) #aA
abbcde# bbcde# bcde#
– 注意:输入串在这里是指从词法分析器送来的单词 符号组成的二元式的有限序列
–自底而上语法分析比自顶向下语法分析更有效率, 对语法的限制更少
• 工作方式:“移进-归约”方式
• 即:自左到右把输入串的符号一个一个移 进栈,在移动过程中不断查看栈顶符号串, 一旦形成某个句型的句柄时,就将此句柄 用相应的产生式左部替换(归约),若再 形成句柄,就继续替换,直到栈顶不再形 成句柄为止。然后继续移进符号,重复上 面的过程直到栈顶只剩下文法的开始符号, 输入串读完为止,这样就认为识别了一个 句子。
第六章 自底向上的优先分析法
•自底向上语法分析概述 •简单优先分析 •算符优先分析
2020/9/9
1
课前思考
◇ 什么是自下而上语法分析的策略? ◇ 什么是移进-归约分析? ◇ 移进-归约过程和自顶向下最右推导有何关系? ◇ 自下而上语法分析成功的标志是什么? ◇ 什么是可归约串? ◇ 移进-归约过程的关键问题是什么? ◇ 如何确定可归约串? ◇ 如何决定什么时候移进,什么时候归约? ◇ 什么是算符文法?什么是算符优先文法? ◇ 算符优先分析是如何识别可归约串的? ◇ 算符优先分析法的优缺点和局限性有哪些?
5) #aAb
cde#
归约(A→Ab)
6) #aA
cde#
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.3 算符优先分析法
算符优先分析法特别适用于表达式的分析 从表达式得到的启发: 从表达式得到的启发: 表达式的归约顺序与运算顺序是一样的 通常算术表达式的运算次序是先乘除后加减, 通常算术表达式的运算次序是先乘除后加减, 同优先级时服从左结合 E→E+T|T → T→T×F|F → × F→(E)|i → 符号串E+T+T×F的归约过程为: × 的归约过程为 的归约过程为: 符号串 E+T+T×F |- E+T×F |- E+T |- E × ×
算符优先分析法 基本思想:只定义文法中终结符 终结符之间的优先 基本思想:只定义文法中终结符之间的优先 关系(不考虑非终结符),并由这种关系指 关系(不考虑非终结符) 导分析过程 不是规范归约 算符优先分析法分析速度快, 算符优先分析法分析速度快,特别适用于表 达式的分析。缺点是不规范, 达式的分析。缺点是不规范,常常要采用适 当措施克服其缺点。 当措施克服其缺点。
优先关系 算符优先文法的定义 算符优先关系表的构造 算符优先分析算法 优先函数 算符优先分析法的局限性
6.3.1 优先关系
优先关系只存在于句型中相邻出现的符号 相邻: 相邻:算符优先分析法只考虑终结符之间的优先 关系,不考虑非终结符,所以两个终结符相邻 两个终结符相邻指 关系,不考虑非终结符,所以两个终结符相邻指 其中没有其他的终结符(但可以有非终结符) 其中没有其他的终结符(但可以有非终结符) 相邻, 相邻, 如:E+T×i,+和×相邻,×和i相邻, ×, 相邻 但+和i不相邻 不相邻 终结符间优先关系表示: 终结符间优先关系表示: 终结符a和 之间的优先关系表示如下 之间的优先关系表示如下: 终结符 和b之间的优先关系表示如下: a<b 表示 的优先级低于 表示a的优先级低于 的优先级低于b a=b 表示 的优先级等于 表示a的优先级等于 的优先级等于b a>b 表示 的优先级高于 表示a的优先级高于 的优先级高于b
规范归约: 规范归约: 自底向上分析的移进- 自底向上分析的移进-归约过程是自顶向下最右 推导的逆过程,因为最右推导为规范推导,所以 推导的逆过程,因为最右推导为规范推导, 自左向右的归约称为规范归约。 自左向右的归约称为规范归约。
文法: 例 文法: (1) S→aAcBe (2) A→b → → (3) A→Ab (4) B→d → → 的最右推导的过程为: 输入串 abbcde#的最右推导的过程为: 的最右推导的过程为 S=>aAcBe=>aAcde=>aAbcde=>abbcde 自底向上分析的过程为: 自底向上分析的过程为: abbcde|-aAbcde|-aAcde|-aAcBe|-S
第六章 自底向上优先分析法
学习目标: 学习目标: 掌握: 构造算符优先关系表, 掌握 : 构造算符优先关系表 , 进行算符 优先分析, 优先分析,构造优先函数 理解:算符优先文法, 理解:算符优先文法,最左素短语 了解: 了解:简单优先分析法
6.1 自底向上分析方法概述 6.2 自底向上优先分析方法概述 6.3 算符优先分析法
不可能相邻出现在任何句型中的两个符号, 不可能相邻出现在任何句型中的两个符号,无法比 较其归约的先后, 较其归约的先后,故它们之间无优先关系
注意: , , 是三种有序关系 与数学中的<, , 是三种有序关系, 注意:<,=,>是三种有序关系,与数学中的 ,=, >不同,所以 不同, 不意味b=a,a>b不意味 不意味b<a 不同 所以a=b不意味 不意味 , 不意味 E→E+T|T → T→T×F|F → × F→(E)|i → E T F ( E ) ( E E + T E T F E ) + T
所以( 所以 = )
a
δ b
说明: 说明:δ为ε或B,a,b在用一句柄中同时归约所以 , 在用一句柄中同时归约所以 优 先级相同
2) a < b 当且仅当G中有形如 的产生式, 当且仅当 中有形如 A → …aB… 的产生式, 且 B =>+ b… 或 B=>+ Cb… A a B … P δ b …
不成立, 在句型(E)+T中得 ) > +, 如:(=),但是 不成立, 在句型 ,但是)=(不成立 中得 , 因为)和 不可能相邻出现 因为 和(不可能相邻出现 在(E+T)中得 + > ) 中得 在任何句型中, 在任何句型中,它们之间 没有优先关系
按公认的计算顺序规定优先级和结合性,得到优先关系如下: 按公认的计算顺序规定优先级和结合性,得到优先关系如下: 的优先级高, ×,/的优先级高,遵循左结合,得×>×, ×>/, />/, />× 的优先级高 遵循左结合, × × +,-的优先级低,遵循左结合,得+>+, +>-, - >-, - >+ 的优先级低,遵循左结合, 的优先级低 ‘(’, ‘)’规定括号的优先级大于括号外的运算符,小于括号内的 规定括号的优先级大于括号外的运算符, 规定括号的优先级大于括号外的运算符 运算符, 运算符,如…E + ( E + T )…,有 + < (,( < + , , 规定:‘ 任何与它相邻的运算符, 规定 ‘#’<任何与它相邻的运算符, 任何与它相邻的运算符 任何与它相邻的运算符>‘#’ 任何与它相邻的运算符 ‘ ’ 运算对象 i 的优先级最高 优先关系表如右图所示: 优先关系表如右图所示: 说明:表中为空的元素表示: 说明:表中为空的元素表示:在该 文法的任何句型中都不会出现这两 个终结符相邻, 个终结符相邻,所以他们无优先关 如不会有这样的表达式… 系,如不会有这样的表达式 ) i …
6.1 自底向上分析方法概述
1. 基本思想 从输入符号串开始, 从输入符号串开始,利用文法的产生式逐步进行 归约, 归约,试图归约到文法开始符 从语法树角度看, 从语法树角度看,是以输入符号串作为语法树的 末端结点符号串,自底向上的构造语法树, 末端结点符号串,自底向上的构造语法树,使文 法开始符正好是该语法树的根。 法开始符正好是该语法树的根。如果最终根结点 是开始符,则输入符号串是语言的一个句子, 是开始符,则输入符号串是语言的一个句子,否 则不是。 则不是。 自底向上分析过程实际上是一个不断进行直接归 约的过程。 约的过程。
2. 遇到的问题 如何找出进行直接归约的“可归约串 可归约串” 句柄) 如何找出进行直接归约的 可归约串”(句柄) 基本实现方法- 移进-归约” 3. 基本实现方法-“移进-归约”方法 引进一个先进后出的符号栈来存放符号 对输入符号串自左向右进行扫描, 对输入符号串自左向右进行扫描 , 并把当前 输入符号下推入栈中(移进) 输入符号下推入栈中(移进), 边移进边分析, 边移进边分析 , 一旦栈顶符号串形成某个句 型的句柄(为某产生式的右部) 型的句柄 ( 为某产生式的右部 ) 时 , 就用相 应的非终结符( 产生式的左部) 替换它( 应的非终结符 ( 产生式的左部 ) 替换它 ( 归 约) 。 重复这一过程,直到输入符号串的末端, 重复这一过程 , 直到输入符号串的末端 , 此 时如果栈中只剩文法开始符号, 时如果栈中只剩文法开始符号 , 则输入符号 串是文法的句子,否则不是。 串是文法的句子,否则不是。
关键问题: 关键问题:如何在分析的过程中确定句柄 何时移进? 何时移进?栈顶未形成句柄 何时归约? 何时归约?栈顶形成句柄 常用自底向上分析法: 常用自底向上分析法: 算符优先分析法( 算符优先分析法(6.3) ) LR类分析法(第7章) 类分析法( 类分析法 章
6.2 自底向上优先分析法概述
优先分析法两类: 优先分析法两类: 简单优先分析法 基本思想:按一定原则定义文法中所有符号 终结符和非终结符) 之间的优先关系, ( 终结符和非终结符 ) 之间的优先关系 , 按照 这种关系确定归约过程中的句柄并实行归约。 这种关系确定归约过程中的句柄并实行归约。 是一种规范归约。 是一种规范归约。 简单优先分析法准确、 规范, 但效率低, 简单优先分析法准确 、 规范 , 但效率低 , 不实 不介绍。 用,不介绍。
+ + > × > ( < ) > i > # <
× < > < > > <
( < < <
) > > = > >
<
i # < > < > < > > < =
算符优先分析法 1 文法要满足一定的条件,即为算符优先文法 文法要满足一定的条件,即为算符优先文法 2 根据文法按一定规则计算算符之间的优先关系 根据文法按一定规则计算算符之间的优先关系 3 按优先关系进行算符优先分析 按优先关系进行算符优先分析
2. 如果 或bA出现在算符文法的句型 中, 如果Ab或 出现在算符文法的句型r中 出现在算符文法的句型 中任何含b的 其 中A ∈VN,b ∈VT,则r中任何含 的短语 中任何含 必含有A( 的短语不一定含有b) 必含有 (含A的短语不一定含有 ) 的短语不一定含有
E E + T
E + TT × F
文法: 例 文法:
(1) S→aAcBe (2) A→b → → (3) A→Ab (4) B→d → → 判断输入串 abbcde# 是否为该文法的句子 用符号栈对输入符号串自底向上的分析过程为: 用符号栈对输入符号串自底向上的分析过程为: 步骤 1) ) 2) ) 3) ) 4) ) 5) ) 6) ) 7) ) 8) ) 9) ) 10) ) 11) ) 符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S 输入符号串 abbcde# bbcde# bcde# bcde# cde# cde# de# e# e# # # 动作 移进a 移进 移进b 移进 归约(A→b) 归约( ) 移进b 移进 归约( 归约(A→Ab) ) 移进c 移进 移进d 移进 归约( 归约(B→d) ) 移进e 移进 归约( 归约(S→aAcBe) ) 接受