第6章 自顶向上优先分析法
信息学院06版《编译原理》课程教学大纲
《编译原理》课程教学大纲
课程编号:(先不填)
英文名称:Compiler Construction Principles
课程类型:专业基础课
学时/学分:40+16/3.5
授课对象:本科生
先修课程:高等数学,数据结构,C程序设计
课程简介:
本课程是计算机专业学生的一门重要专业基础课,本课程属于计算机科学与技术专业的一门重要的专业必修课。通过本课程学习,使学生掌握编译程序的一般构造原理,包括语言基础知识、词法分析程序设计原理和构造方法。各种语法分析技术和中间代码生成符号表的构造、代码优化、并行编译技术常识及运行时存储空间的组织等基本方法和主要实现技术。它有一定的理论性,又有一定的实践性, 尤其是本课程的知识与计算机应用中很多领域有紧密联系与广泛应用。了解与掌握本课程的基本内容将有利于学生提高专业素质和适应社会多方面需要的能力。
教学目的和要求:
教学目的:培养学生掌握构造编译程序的基本原理与设计方法,为培养计算机语言与大型应用程序的开发人才打下良好的基础。本课程坚持理论与实践教学并重的原则,理论上主要叙述语言和文法的形式定义、自动机理论、词法分析、语法和语义分析、优化和代码生成等环节的基本理论和方法,与此同时,通过上机实习构造简单语言的编译程序等编辑器使学生掌握开发应用程序的基本方法。
教学要求:通过本课程的学习, 学生应掌握形式语言理论与编译实现相关的基础概念, 了解与掌握编译程序构造的基本原理与技术, 从形式语言理论的角度, 进一步认识与理解程序设计语言及其与编译程序的联系。做习题是理解课程中基本概念、培养思考能力和解题能力的重要方面, 要求学生认真做好习题, 并注意解题规范化。学生也应重视配合教学, 做好上机实习。
教学内容:
第1章 编译程序概述(2学时)
1、教学内容:
1) 什么是编译程序
2) 编译过程概述
3) 编译程序的结构
4) 编译阶段的组合
5) 编译技术和软件工具
编译原理:第6章 自下而上语法分析
1第6章自下而上语法分析仅用于教学
Bottom-up Parsing第6章自下而上语法分析
学习思路
●基本思想
●存在的问题●
●解决方法
●主要分析方法
学习目标
掌握
自下而上语法分析的基本思想
短语、简单短语/直接短语、句柄
、最左素短语
移进-归约技术
算符优先分析方法
了解
简单优先分析方法的基本思想自下而上语法分析简介
基本思想
实现技术——移进-归约
存在的问题
解决方法分析
6.1 自下而上语法分析
1.自下而上语法分析的基本思想
◆推导——从输入的符号串开始逐步向上归约,试图归
约到文法的开始/识别符号。
————如何表示分析过程?
◆语法树以输入符号串作为末端结点符号串,向根
结点方向构造语法树,使识别符号正好是语法树的根
结点。
◆程序的编译——从该高级语言文法的源程序或与其等
价的单词串出发,试图归约到该文法的开始符号——
。6.1 自下而上语法分析
.基本实现技术
引进一个后进先出的栈来存放符号,按照扫描顺序把
当前输入符号下推入栈中(移进),然后查看栈顶的符号串是
否可以被归约。——移进-归约法
约。
#X
1X
2X
3…X
iX
i+1…X
j栈a
ka
k+1……a
m#输入串
x
当前句型
2#X
1X
2X
3…X
iX
i+1…X
j栈a
ka
k+1……a
m#输入串
x6.1 自下而上语法分析
当前句型
移进——读入下一个输入符号并把它下推进栈。
归约——把栈顶符号串替换为相应的非终结符号。
接受——当栈顶除#外仅有识别符号,输入为#时,结束工作。
报错——当识别出错误时,调用出错处理子程序处理或停止。6.1 自下而上语法分析
在分析的每一步中,
①当前句型中什么样的子串可以进行直接归约?3.自下而上语法分析遇到的基本问题
②将可归约串归约到哪一个非终结符号?
6.1 自下而上语法分析
设有文法G[Z],w=xuy是它的一个句型,如果有
Z*
⇒xUy+ ⇒且Uu4.解决方法——什么样的子串可以直接归约
称句型xuy中子串u为句型xuy(相对于非终结符号U)的短语。
第六章自下而上分析和优先分析法
第六章 自下而上分析和优先分析法
1 第六章 自下而上分析和优先分析法
1、教学目的及要求:
要求理解算符优先文法、最左素短语、有效项目的基本概念;掌握算符优先分析方法。
◇ 对给定的文法能够判断该文法是否是算符文法
◇ 对给定的算符文法能够判断该文法是否是算符优先文法
◇ 对给定的算符文法能构造算符优先关系表,并能利用算符优先关系表判断该文法是否是算符优先文法。
◇ 能应用算符优先分析算法对给定的输入串进行移进-归约分析,在分析的每一步能确定当前应移进还是归约,并能判断所给的输入串是否是该文法的句子。
◇ 了解算符优先分析法的优缺点和实际应用中的局限性。
2、教学内容:
自下而上语法分析(算符优先分析法),算符优先分析。
3、教学重点:
归约,算符优先表构造。
4、教学难点:
◇ 通过本章学习后,学员应该能知道算符文法的形式。
◇ 对一个给定的算符文法能构造算符优先关系分析表,并能判别所给文法是否为
算符优先文法。
◇ 分清规范句型的句柄和最左素短语的区别,进而分清算符优先归约和规范归约的区别。
◇ 算符优先分析的可归约串是句型的最左素短语,在分析过程中如何寻找可归约串是算符优先分析的关键问题。对一个给定的输入串能应用算符优先关系分析表给出分析(归约)步骤,并最终判断所给输入串是否为该文法的句子。
5、课前思考
◇ 什么是自下而上语法分析的策略?
◇ 什么是移进-归约分析?
◇ 移进-归约过程和自顶向下最右推导有何关系?
◇ 自下而上语法分析成功的标志是什么?
◇ 什么是可归约串? 第六章 自下而上分析和优先分析法
2 ◇ 移进-归约过程的关键问题是什么?
◇ 如何确定可归约串?
◇ 如何决定什么时候移进,什么时候归约?
◇ 什么是算符文法?什么是算符优先文法?
◇ 算符优先分析是如何识别可归约串的?
◇ 算符优先分析法的优缺点和局限性有哪些?
6、章节内容
第一节 自下而上语法分析
第二节 算符优先分析法
第06章 自底向上优先分析
《编译原理》课后习题答案第六章
盛威网()专业的计算机学习网站 1
第 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→a
S→∧
S→(T)
T→T,S
T→S
(1) FIRSTVT - LASTVT 表:
(2) 算符优先关系表: 《编译原理》课后习题答案第六章
盛威网()专业的计算机学习网站 2
表中无多重人口所以是算符优先(OPG)文法。
友情提示:记得增加拓广文法 S`→#S#,所以# FIRSTVT(S),LASTVT(S) #。
(3)对应的算符优先函数为:
a ( ) , ^ #
f 2 1 2 2 2 1
g 3 3 1 1 3 1
(4)对输入串(a,a)#的算符优先分析过程为
栈(STACK) 当前输入字符(CHAR) 剩余输入串(INPUT_STRING) 动作(ACTION)
#
#(
#(a
#(N
#(N,
#(N,a
#(N,N
#(N
#(N)
#N (
a
,
,
a
)
)
)
#
# a,a)#
,a)#
a)#
a)#
)#
#
#
# Move in
Move in
Reduce: S→a
Move in
Move in
Reduce: S→a
Reduce: T→T,S
Move in
Reduce: S→(T)
Success! 《编译原理》课后习题答案第六章
盛威网()专业的计算机学习网站 3
对输入串(a,(a,a))# 的算符优先分析过程为:
栈(STACK)
当前字符(CHAR 剩余输入串
第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 ⾃底向上优先分析法概述优先分析法⼜可分简单优先法和算符优先分析法。l 简单优先分析法的基本思想是对⼀个⽂法按⼀定原则求出该⽂法所有符号(即终结符和⾮终结符)之间的优先关系,按照这种关系确定归约过程中的句柄,它的归约过程实际上是⼀种规范规约。l 算符优先分析法的基本思想则是只规定算符之间的优先关系,即只考虑终结符之间的优先关系,由于算符优先分析不考虑⾮终结符之间的优先关系,在归约过程中只要找到句柄就归约,并不考虑归约到那个⾮终结符名,因⽽算符优先归约不是规范归约。
编译原理第二版第六章课后答案
.
精品 第六章
第6章自底向上优先分析
P122 练习
1、已知文法G[S]为: Sa|^|(T) TT,S|S
(1)计算G[S]的FIRSTVT和LASTVT。
(2)构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法。
(4)给出输入串(a,a)#和(a,(a,a))#的算符优先分析过程。
【解】
(1)
FIRSTVT LASTVT
S a、^、( a、^、)
T ,、a、^、( ,、a、^、)
(2)
算符优先关系
a ( ) , ^ #
a ≯ ≯ ≯
( ≮ ≮ =
≮ ≮
) ≯ ≯ ≯
, ≮ ≮ ≯ ≯ ≮
^ ≯ ≯ ≯
# ≮ ≮ ≮
(4) 句子(a,a)#分析过程如下:
步骤 栈 优先关系 当前符号 剩余输入串 移进或归约
1 # #≮( ( a,a)# 移进 .
精品 2 #( (≮a a ,a)# 移进
3 #(a a≯, , a)# 归约
4 #(F (≮, , a)# 移进
5 #(F, ,≮a A )# 移进
6 #(F,a A≯) ) # 归约
7 #(F,F ,≯) ) # 归约
8 #(F (≡) ) # 移进
9 #(F) )≯# # 归约
10 #F #≡# # 接受
句子(a, (a, a))分析过程如下:
步骤 栈 优先关系 当前符号 剩余输入串 移进或归约
1 # #≮( ( a,(a,a))# 移进
2 #( (≮a a , (a,a))# 移进
3 #(a a≯, , (a,a))# 归约
