自底向上优先分析法
自底向上分析
例: G[E] E→E+E | E*E | (E) | i
Vt={+, *, (, ), i} 这是一个二义文法,要用算符优先法分析有该文法所确定的 语言句子。 如:i+i*i
(1) 先确定终结符之间的优先关系
优先关系的定义:
设 a, b 为可能相邻的终结符
23
例: 文法G[E] E::=E+T|T T::=T*F|F F::=(E)|i
1、求每个非终结符号的FIRSTVT及LASTVT
FIRSTVT
LASTVT
E {+,*,(,i}
{+.*,),i}
T {*,(,i }
{*,),i}
F {(,i}
{),i}
2、求=关系:(=)
3、求<关系:+<FIRSTVT(T),*<FITSTVT(F),(<FIRSTVT(E) 4、求>关系: LASTVT(E)>+,LASTVT(T)>*,LASTVT(E)>)
i*i# *i# *i#
i# # # # #
优先关系 动作
#<i 移进
i>+ 规约
#<+ 移进
+<i 移进
i>* 规约
+<* 移进 *<i 移进 i># 规约 *># 规约
+># 规约 接受 16
6.3.2 算符优先文法的定义
(1)算符优先文法(OPG) (2)构造优先关系矩阵 (3)算符优先分析算法的设计
构造优先关系表:
b(右栈外) +
OPG文法的语法分析优化策略
226 •电子技术与软件工程 Electronic Technology & Software Engineering程序设计• Program Design【关键词】语法单位 自底向上 OPG 终结符优先 优化语法分析方法中自上而下的分析是指从文法的开始符号出发,反复的选择产生式进行推导,最终推导出句型;自下而上分析是指从待分析的句型本身出发,逐步选择产生式进行归约,直至归约到文法的开始符号。
这两类分析都可以利用各种语法分析算法进行。
每种语法分析算法都有其优势和局限性,根据文法的类型,可以选择最优的语法分析算法进行语法分析。
1 OPG文法Chomsky 将文法分为短语文法、上下文有关文法、上下文无关文法和正规文法四类。
OPG 文法是上下文有关文法中的一种,该文法的特殊性在于任意两个终结符之间最多只存在<、=、>三种优先关系中的一种优先关系,文法的产生式中不会出现两个相邻的非终结符。
根据文法的特性可以推论该文法的任何句型也不会含有相邻的非终结符,这就为使用优化的OP 分析法进行句型分析奠定了基础。
2 规范归约归约与推导是一个逆过程,规范归约过程中一直本着最左的归约原则,每次分析过程中首先找到句型中的句柄,句柄是句型中的最左直接短语,之后根据产生式规则向左归约,用产生式的左部去替换产生式右部。
例如对OPG 文法G[E]:E →T|E+T T →F|T*F F →i|(E)的句型T+T*F+i 的分析如表1所示。
上述句型分析中每步都是在句型中寻找OPG 文法的语法分析优化策略文/关玉欣最左直接短语,也就是文法中某条产生式的右部。
进行最左归约实质上就是用某条产生式的左部非终结符去替换产生式的右部符号串。
根据句型的不同,归约的步骤也会有区别,但分析成功的标志就是归约到OPG 文法的开始符号,代表句型分析成功。
在上述的规范归约过程中,句型T+T*F+i 总归约次数为6。
3 优化的OP分析在自底向上的句型分析方法中,OP (Operator Priority )分析法仅考虑句型中终结符的优先关系,从而确定每一步分析过程中的句柄。
信息学院06版《编译原理》课程教学大纲
《编译原理》课程教学大纲课程编号:(先不填)英文名称:Compiler Construction Principles课程类型:专业基础课学时/学分:40+16/3.5授课对象:本科生先修课程:高等数学,数据结构,C程序设计课程简介:本课程是计算机专业学生的一门重要专业基础课,本课程属于计算机科学与技术专业的一门重要的专业必修课。
通过本课程学习,使学生掌握编译程序的一般构造原理,包括语言基础知识、词法分析程序设计原理和构造方法。
各种语法分析技术和中间代码生成符号表的构造、代码优化、并行编译技术常识及运行时存储空间的组织等基本方法和主要实现技术。
它有一定的理论性,又有一定的实践性, 尤其是本课程的知识与计算机应用中很多领域有紧密联系与广泛应用。
了解与掌握本课程的基本内容将有利于学生提高专业素质和适应社会多方面需要的能力。
教学目的和要求:教学目的:培养学生掌握构造编译程序的基本原理与设计方法,为培养计算机语言与大型应用程序的开发人才打下良好的基础。
本课程坚持理论与实践教学并重的原则,理论上主要叙述语言和文法的形式定义、自动机理论、词法分析、语法和语义分析、优化和代码生成等环节的基本理论和方法,与此同时,通过上机实习构造简单语言的编译程序等编辑器使学生掌握开发应用程序的基本方法。
教学要求:通过本课程的学习, 学生应掌握形式语言理论与编译实现相关的基础概念, 了解与掌握编译程序构造的基本原理与技术, 从形式语言理论的角度, 进一步认识与理解程序设计语言及其与编译程序的联系。
做习题是理解课程中基本概念、培养思考能力和解题能力的重要方面, 要求学生认真做好习题, 并注意解题规范化。
学生也应重视配合教学, 做好上机实习。
教学内容:第1章编译程序概述(2学时)1、教学内容:1)什么是编译程序2)编译过程概述3)编译程序的结构4)编译阶段的组合5)编译技术和软件工具2、教学重点:编译程序的结构3、教学难点:编译程序的结构,以及每一阶段任务第3章文法与语言(6学时)1)文法的直观概念2)符号和符号串3)文法与语言的形式定义4)文法的分类5)上下文无关文法及其语法树6)句型的分析7)有关文法实用中的一些说明2、教学重点:与编译技术密切相关的一些术语和概念。
第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个符号就可以唯一确 定分析器的动作是移进还是归约、利用那个 产生式进行归约。
编译原理 语法分析(2)_ LL(1)分析法1
自底向上分析法
LR分析法的概念 LR分析法的概念 LR(0)项目族的构造 LR(0)项目族的构造 SLR分析法 SLR分析法 LALR分析法 LALR分析法
概述
功能:根据文法规则 文法规则, 源程序单词符号串 单词符号串中 功能:根据文法规则,从源程序单词符号串中
识别出语法成分,并进行语法检查。 识别出语法成分,并进行语法检查。
9
【例】文法G[E] 文法G[E] E→ E +T | T 消除左递归 T→ T * F | F F→(E)|i 请用自顶向下的方法分析是否字 分析表 符串i+i*i∈L(G[E])。 符串i+i*i∈L(G[E])。
E→TE’ E’→+TE’|ε T →FT’ T’→*FT’|ε F→(E)|i
编译程序组织结构
表 处 理
前
端 中
源 程 序
词 法 分 析
语 法 分 析
语 义 分 析
间 代 码 生 成
中 后 目 端 间 标 代 代 码 码 优 生 化 成
目 标 程 序
错 误 处 理
第4章 语法分析
自顶向下分析法
递归子程序法(递归下降分析法) 递归子程序法(递归下降分析法) LL(1)分析法 LL(1)分析法
通常把按LL(1)方法完成语法分析任务的程序叫LL(1)分析程序或者LL(1)分析器。 通常把按LL(1)方法完成语法分析任务的程序叫LL(1)分析程序或者LL(1)分析器。 LL(1)方法完成语法分析任务的程序叫LL(1)分析程序或者LL(1)分析器
输入串
一、分析过程
#
此过程有三部分组成: 此过程有三部分组成: 分析表 总控程序) 执行程序 (总控程序) 分析栈) 符号栈 (分析栈)
编译原理-清华大学-第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 自底向上优先分析法概述•基本思想:利用文法符号中相邻符号之间的优先关系(谁先规约的优先关系)找出句柄。
3.4 自下而上分析方法
d aAbB
2014-10-5
分析过程的特点
1. 从输入串的开头依次读入(移进)单词。 2. 一旦发现可归约串(在上例中是句柄)就立即 归约。 3. 根据句柄对分析树进行修剪子树,剪去子树 的叶子。 4. 若最终能归约成文法的开始符号,则分析成 功。 5. 由于总是将句型的最左边的可归约串替换成 非终结符号,该归约方法通常得到是最右推 导的逆过程。
2014-10-5
2
自顶向下分析算法的基本思想为: 若Z S
G[Z] +
则 S L(G[Z])
否则 S L(G[Z])
存在主要问题: 左递归问题 回溯问题
主要方法: • 递归子程序法 • LL(1)分析法
自底向上分析算法的基本思想为: 若Z S
G[Z] +
则 S L(G[Z])
2014-10-5 20
假定G是一个不含ε产生式的算符文法, 对任一对终结符a,b, 定义 (1) a≐b当且仅当文法G中含有形如 P→…ab… 或 P→…aQb…的产生式; (2) a⋖b当且仅当G中含有形如 P→…aR…的产生式, + + 而R b… 或 R Qb…; (3) a⋗b当且仅当G中含有形如 P→…Rb…的产生式, + + 而R …a 或 R aQ。
3)算符优先分析的特点:
仿效四则运算过程,预先规定相邻终结符 之间的优先关系,然后利用这种优先关系 来确定句型的“句柄” ,并进行规约。
输入串 # 符号栈 # 分析程序 (优先关系矩阵)
18
4)分析器结构:
2014-10-5
概 述:
所谓算符优先分析,就是预先规定运算 符(确切地说是终结符)之间的优先关系和 结合性质,借助于这种优先关系来比较 相邻运算符的优先级,以确定句型的可 归约串并进行归约。 注意:算符优先分析不是规范归约。
算符优先分析法
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
自底向上LR分析法
4.接受项目:对于拓广文法G[S’],有项目S’S 它是一个特 殊的归约项目,我们称它为接受项目,它所对应的状态为 接受状态。拓广文法G ´的接受项目是唯一的,即 S’S
三、构造识别活前缀的NFA
根据项目定义,我们可给出文法中所有产生式的项目, 而每个项目都为识别活前缀的NFA的一个状态。即文法有多 少个项目,它所对应识别活前缀的NFA就有多少个状态。 1.NFA的构造原则 (1)NFA的状态集:由每个项目所对应的状态组成; (2)输入字符集合:由文法的文法符号组成包括终结符、 非终结符和; (3)初态:对于文法G[S]的拓广文法G[S’],有项目S’ S ,由 于S’仅在第一个产生式的左部出现,所以规定它为初态; (4)终态:对于拓广文法G[S’],有项目Uu (即圆点在最 后的项目),作为NFA的终态;
上例规范句 型为什么?
该规范句型 的活前缀是 什么?
aAb[3]cd[4]e[1]
aAcd[4]e[1] aAcBe[1] S
B d[4]
规范句型:
abbcde, aAbcde, aAcde , aAcBe, S
规范句型: abbcde, aAbcde, aAcde , aAcBe, S 有下面规范句型的活前缀: ab[2]b[3]cd[4]e[1] ,a,ab aAb[3]cd[4]e[1] aAcd[4]e[1] ,a,aA,aAb ,a,aA,aAc,aAcd
一个规范句型的活前缀不含句柄之后的任何符号
活前缀和句柄的关系? 1. 活前缀不含有句柄的任何符号;
2. 活前缀含有句柄的部分符号;
3. 活前缀已含有句柄的全部符号。
活前缀
例:文法G[S]为: 为产生式加序号变为:
S aAcBe
第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 ⾃底向上优先分析法概述优先分析法⼜可分简单优先法和算符优先分析法。
《编译原理》-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集
《编译原理》-⽤例题理解-⾃底向上的语法分析,FIRSTVT,LASTVT集《编译原理》-⽤例题理解-⾃底向上的语法分析,FIRSTVT,LASTVT集上⼀篇:本笔记是对教材《编译原理》- 张晶⽼师版做学习笔记。
本篇就是第 5 章的笔记。
(⼀)⾃底向上的语法分析概述⾃底向上语法分析⾃底向上语法分析从待输⼊的符号串开始,利⽤⽂法的产⽣式步步向上归约,试图归约到⽂法的开始符号。
从语法树的⾓度看⾃底向上分析的过程是以输⼊符号串作为端末结点符号串,向着根结点的⽅向往上构造语法树,是开始符号正好是该语法树的根结点。
⾃底向上语法分析过程实际上是⼀个不断进⾏直接归约的过程移进-规约⼤意:⽤⼀个寄存符号的先进后出栈,把输⼊符号⼀个⼀个地移进到栈⾥,当栈顶符号串形成可归约串时(某个产⽣式的右部时),即把这个可归约串替换成(归约成)该产⽣式的左部的⾮终结符。
⾃底向上语法分析法基本思想⾃左向右地扫描输⼊符号串,⼀遍把输⼊符号逐个移进分析栈,⼀边检查分析栈的栈顶符号串是否已经形成了句柄(句柄就是每个产⽣式的右部),如果形成句柄就把栈顶符号串替换为相应产⽣式左部的⾮终结符号,这种替换就称规约,再根据规约后的新栈顶,继续扫描,移进,规约。
例题:移进-规约题⽬:给定⽂法 G[S]:(1)S -> aABe(2)A -> b(3)A -> Abc(4)B -> d解析:步骤: 1 2 3 4 5 6 7 8 9 10动作:进进归进进归进归进归a b (2) b c (3) d (4) e (1)执⾏时,⾸先分析栈中会存放 # 到栈底,图上没有体现出来,应该在 a 的下⾯加上 #,将余留输⼊串最左边的字符放在分析栈栈⾸,此时栈中为 a,分析上⾯ 4 句⽂法,⽂法的右部没有完全匹配的,所以没有构成句柄。
此时,继续移进第⼆个输⼊符号 b,此时栈顶的 b 与⽂法的(4)产⽣式的右部匹配,⽤ A -> b 规约,得到栈中为 aA然后移进 b,c,⽤⽂法的(3)产⽣式进⾏规约。
编译原理 第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…。
第06章自底向上优先分析法解读
第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 。
它的逆过程即归约过程。
基本问题•如何找出进行直接归约的简单短语?•将找到的简单短语归约到哪个非终结符号?基本方法•基本都采用移入-归约方法。
•使用一个栈来存放归约得到的符号。
•在分析的过程中,识别程序不断地移入符号。
移入的符号暂时存放在一个栈中。
一旦在已经移入的(和归约得到的)符号串中包含了一个句柄时,将这个句柄归约成为相应的非终结符号。
基本方法(续)•归约中的动作有4类–移入:读入一个符号并把它归约入栈。
–归约:当栈中的部分形成一个句柄(栈顶的符号序列)时,对句柄进行归约。
–接受:当栈中的符号仅有#和识别符号的时候,输入符号也到达结尾的时候,执行接受动作。
–当识别程序觉察出错误的时候,表明输入符号串不是句子。
进行错误处理。
例 子i *i+ii*i+i i E::=i E *i+iE*i+i E* i+iE*i+i E*i +iE*i+i i E::=i E*E +iE*E+i E*E E::=E*E E +iE+i E+iE+i i E::=i E+EE+E E+E E::=E+EE 文法G E [E]: E::=E+E|E*E|(E)输入符号串:i*i+i已处理 未处理 句型 句柄 规则例子的解释•当栈中的符号的栈顶部分还不能形成句柄时,进行移入操作。
•一旦发现栈顶部分形成了句柄的时候,对该句柄进行归约。
编译原理第五章语法分析——自下而上分析
第五章语法分析——自下而上分析要紧内容:[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所示。
《编译原理》第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
5 语法分析(2)_ 算符优先分析法
F i
22
识别句型i+(i+i)*i得到的语法树 识别句型i+(i+i)*i得到的语法树
E Z F i ( F i + F E + ) F i T *
(a) 算符优先 分析技术得到 得到的语法树
Z
E T
+ T F
T * F i
F F i i
(b) 一般分析 技术得到得到 的语法树
( E
T
E +
) T F i
5.2.2 算符优先分析法概述
• 算符优先文法
– 算符优先分析是一种分析过程比较迅速的自底向上 的分析方法,特别有利于表达式的分析, 的分析方法,特别有利于表达式的分析,便于手工 实现。它不是一种严格的最左归约, 实现。它不是一种严格的最左归约,即不是一种规 范归约方法。在算符优先分析方法中, 范归约方法。在算符优先分析方法中,可归约串就 是最左素短语。 是最左素短语。 – 所谓算符优先就是借鉴了程序语言中,表达式运算 所谓算符优先就是借鉴了程序语言中, 的不同优先顺序,在算符, 的不同优先顺序,在算符,即非终结符之间定义某 种优先归约的关系,从而在句型中寻找可归约串。 种优先归约的关系,从而在句型中寻找可归约串。 由于非终结符关系的定义和普通算术表达式的算符 如加减乘除)运算的优先关系一致, (如加减乘除)运算的优先关系一致,所以得名算 符优先分析方法。 符优先分析方法。
自顶向下分析算法的基本思想为: 自顶向下分析算法的基本思想为: 若Z ⇒ S
G[Z] +
则 S ∈ L(G[Z])
否则 S ∉ L(G[Z])
存在主要问题: 存在主要问题: 左递归问题 回溯问题
主要方法: 主要方法: • 递归子程序法 • LL分析法 LL分析法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
S0 Sj-1SjSj+1Sj+2 Si-1SiSi+1 Sn
优先关系
• 和书上的写法不一样。 等同:Si 〓 Sj 先于:Si ►Sj 后于:Si◄Sj
• 注意:〓,►和◄不同于=,>和<。 由Si►Sj不能导出Sj◄Si。
简单优先分析技术(思路续)
• 我们要通过两个相邻符号SiSi+1之间的关系来 找到句柄:
例子
不用此页
文法GE[E]: E::=E+E|E*E|(E) 输入符号串:i*i+i 已处理 未处理 句型 句柄
规则
i
*i+i
E *i+i
E* i+i
E*i +i
E*E +i
E
+i
E+i
E+E
E
i*i+i E*i+i E*i+i E*i+i E*E+i E+i E+i E+E
i E::=i
i E::=i E*E E::=E*E
+
TAIL (V)={Sl | V ==> Sl }
={ Sj1, Sj2, , Sjm }。
+
HEAD(W)={Sk | W ==> Sk}
Si1 Si2 Sin
={ Si1, Si2, , Sin }。
S
S
b Ab a
b◄a a►b
bA
b b◄ (
(
B ( 〓B
B►b
优先矩阵
• 可以将优先 关系填写到 一个矩阵, 得到优先矩 阵。(将矩阵 作为关系的 表示形式)
SABa b ( )
S
A
==
B
►►
a
►► =
b= ◄ ◄
(
◄=◄
◄
)
►►
# b( ( aa)a)b#
◄◄◄◄►
句柄: a 归约为A
# b( ( Aa)a)b#
– SiSi+1在句柄内:必然有规则U→ SiSi+1 – Si在句柄内部,但是Si+1在句柄之后:必然
有 规 则 U→Si , 且 存 在 规 范 句 型 USi+1 。 – 如果Si+1在句柄内,而Si在句柄外,那么必
然存在规范句型SiU,且 U→Si+1。
优先关系的定义
• Sj = Si:当且仅当G中有规则 U → SjSi • Sj ◄ Si:当且仅当 U → SjV,且
◄◄◄◄==►
句柄: A a) 归约为B
# b( (B a)b#
◄◄◄=►
句柄: (B 归约为A
识别过程(例子续)
#b(Aa)b#
◄◄◄==►
句柄: Aa) 归约为B
#b(Bb#
◄◄=►
句柄: (B 归约为A
#b ( A a ) b#
◄◄◄ = =►
句柄: Aa) 归约为B
# b(B b#
◄◄=►
第6章 自底向上优先分析法
6.1 概 述
• 对待分析的符号串,自左向右逐个扫描,输入符 号栈,一旦栈顶符号串形成某个句型的句柄或可 归约串(对应于某产生式的右部),就用该产生 式的左部非终结符代替相应右部的文法符号,即 归约成识别符号。
• 在分析过程中,每次归约的都是最左边的简单短 语(或其它短语)。
V =+=> Si; • Sj ► Si:当且仅当 U → VW,
其中V和W分别满足 V =+=> Sj W =*=> Si 且 Si为终结符号。
优先关系的例子
• 文法:S→bAb A→(B | a B→Aa) • 语言:{bab, b(aa)b, b((aa)a)b, }
• 可以从语法树里面导出部分优先关系。
• 从语法树的角度,以输入符号为树的末端结点, 试图向根结点方向往上构造语法树。
讨论前提
• 和自顶向下技术同样,不考虑符号的具 体构成方式。
• 识别过程是从左到右,自底向上进行的。 一般都采用规范归约:每一步都是对句 柄进行归约(特例除外)。
基本方法
• 采用移入-归约方法。 • 使用一个栈来存放归约得到的符号。
基本问题
• 如何找出进行直接归约的简单短语?即如何 知道栈顶符号串已形成了句柄?
• 将找到的简单短语归约到哪个非终结符号? 即如何选取适当的产生式进行归约?
6.2 两种优先分析法
• 简单优先分析法:
基本思想
– 求出该文法所有符号(终结符和非终结符)之间 的优先关系,按照这种关系确定归约过程中的句
句柄: (B 归约为A
#b A b #
◄= = ►
句柄: bAb 归约为S
优先关系的构造
• 根据优先关系的构造性的定义(定义6.1), 我们立刻可以得到构造算法。
(1) =的构造:直接对每个规则右部处理,对所 有右部X1X2Xn,都有Xi = Xi+1。
Si 当且仅当G中有规则
Sj
=
U → SjSi
(2)◄的构造:由定义,Sj ◄ Si 可以得到 存在规则U → SjV,也就是Sj = V, HEAD(V)={Sk | V =+=> Sk } ={ Si1, Si2, , Sin }。 Si1 Si2 Sin
Sj ◄ ◄ ◄
(3) ►关系的构造:由定义,Sj ►Si 表示:
存在规则 U → VW 其中V = W
• 在分析的过程中,识别程序不断地移入
符号。移入的符号暂时存放在一个栈中。 一旦在已经移入的(和归约得到的)符 号串中包含了一个句柄时,将这个句柄
归约成为相应的非终结符号。
参看课本P102例6.1
基本方法(续)
• 归约中的动作有4类 –移入:读入一个符号并把它归约入栈。 –归约:当栈中的部分形成一个句柄(栈顶 的符号序列)时,对句柄进行归约。 –接受:当栈中的符号仅有#和识别符号的 时候,输入符号也到达结尾的时候,执行 接受动作。 –错误处理:当识别程序发现输入符号串不 是句子时,即出错,调用错误处理模块。
柄。
– 规范归约。
– 分析准确规范,但效率低,不实用。
• 算符优先分析法:
– 规定算符之间的优先关系,即只考虑终结符之间 的优先关系,而不考虑非终结符的优先关系。
– 不是规范归约。
– 分析速度快,适用于表达式的分析。
简单优先分析法
• 思路: 每次察看句型中相邻的两个符号。通过两 个符号的关系判定出前一个符号是句柄的 尾。然后,反向找出句柄的头。这样我们 就找到了一个句柄。
i E::=i E+E E::=E+E
例符号的栈顶部分还不能形成句柄时, 进行移入操作。
• 一旦发现栈顶部分形成了句柄的时候,对该 句柄进行归约。将句柄出栈,然后将归约得
到的非终结符号压栈。
• 如果输入是句子,则栈中的符号(从底到上) 和未处理的符号组成句型。
• 在例子中,发现句柄和归约是人为干预的结 果。所以移入-归约不是实际可运行的技术, 而是技术的模板。