第6章自底向上分析优先分析法
信息学院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个符号就可以唯一确 定分析器的动作是移进还是归约、利用那个 产生式进行归约。
第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
活前缀:是指规范句型的一个前缀,这种
编译原理-清华大学-第6章-LR分析法(2+1,2+1)

r1 5
三、LR分析算法
状态/符号
Sm Xm Sm-1Xm-1 …… …… …… S1 X1
0#
输入缓冲区 a1…ai…an#
LR主控 程序
动作表 转移表 action goto
产生式 序列
分析表
置ip指向输入串w的第一个符号;
状态0和符号#分别进分析栈;
令S为状态栈的栈顶状态;a是ip指向的符号;
作为DFA的初始状态。
21
3)定义状态转换函数GO (产生新的项目集)
GO(I,X)定义为CLOSURE(J),其中I,J都是项目集, X(VN∪VT), J={AX•|当A•XI}。
J 的构造方法类似于词法分析的 MOVE函数
GO(I,X)类似于 CLOSURE( MOVE(I,X))
4)构造LR(0)项目集规范族的算法
2、S′S• 称为句子识别态或接受项目;
3、转换关系:项目i为XX1…Xi-1•Xi…Xn, 项目j为XX1…Xi • Xi+1…Xn, 则从项目i画一弧线射向j,标记为Xi;
4、若项目i为X•A,其中A是非终结符,则从i项目画 弧射向所有A•的项目,V*
5、规约项目为终态用双圈表示,双圈外有*号者为接受态 18
(最左规约,规范规约)
ab[2]b[3]cd[4]e[1]
(用[2]归约)
<= aAb[3]cd[4]e[1]
<= aAcd[4]e[1] <= aAcBe[1]
(用[3]归约) (用[4]归约) (用[1]归约)
<= S
其中<=表示规约
问题:在归约过程中,那些是可归前缀?
13
4、活前缀:G=(Vn,Vt,P,S'), 若有规范推导 S′* αAωαβω,
LR分析法

10
LR驱动程序算法流程
开始 •0入状态栈; •‘#’入符号栈; •ip指向w#的第一个符号 ; •令S是状态栈栈顶; •a是ip指向的符号;
a入符号栈; 状态j入状态栈; 使ip指向下一个符号;
初始 化
直到(ip指向输入 串的尾部# AND 符 号栈栈顶为S);
执行ACTION[s,a]
移 入
8
-移进Shift:
表示:ACTION[i,a]=Sj 动作:状态j和输入符号a分别入符号 栈和状态栈,输入串向前进一字符。
-归约reduce:
表示:ACTION[i,a]=rk 其中: k表示第k个产生式。 动作:设第k个产生式右部长度为m, 左边非终结符为A,距状态栈栈顶m个 位置的状态为p。 1、从符号栈和状态栈中分别弹出 m个符号; 2、非终结符A入符号栈; 3、GOTO[p,A]=q 入状态栈。
2
(1)LR(K)分析法定义
LR(k)分析法意义 - “L”是指从左至右扫描输入符号串, - “R”是指构造一个最右推导的逆过程, - “k”是指为了作出分析决定而向前看的输入符 号的个数。
3
(2)LR分析法的特点
LR分析器(程序)基本上可以识别所有上下文无关文
法写的编程语言结构,分析能力强且适用范围广
16
活前缀和句柄的关系:
约定:β为该句型的句柄,对应产生式为A→β, β= β1β2 1. 活前缀不含有句柄的任何符号,此时期望 A→β的右部所推出的符号串。 2.活前缀只含句柄的一部分符号,表明 A→β1β2的右部子串β1已出现在栈顶,期待 从输入串中看到β2推出的符号。 3.活前缀已含有句柄的全部符号,表明产生式 A→β的 右部β已出现在栈顶。 如:右句型aAbcde的活前缀ε,a,aA,aAb 其中: ε,a不含有句柄的任何符号; aA只含句柄的一部分符号; aAb含有句柄的全部符号。
第六章 语法分析-自下而上分析法

一、自下而上语法分析的基本问题 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
在自底向上的语法

在自底向上的语法一、什么是自底向上的语法自底向上的语法(Bottom-Up Parsing)是一种常用的语法分析方法,用于将一个字符串根据给定语法规则转化为语法分析树。
与之相对的是自顶向下的语法分析方法,自顶向下的语法分析从根节点开始,逐步将输入的字符串分解为非终结符和终结符,直到得到语法分析树。
而自底向上的语法分析则相反,它从叶子节点开始,逐步合并成非终结符,直到得到语法分析树。
自底向上的语法分析方法通常采用的是操作符优先分析法(Operator Precedence Parsing),也称为算符优先文法。
这种分析方法可以通过构造一个算符优先关系表来进行分析,从而判断字符串是否符合给定的语法规则。
自底向上的语法分析方法适用于各种类型的语言和文法,包括正则文法、上下文无关文法等。
这种方法具有较高的灵活性和适应性,并且能够处理大型复杂的文法和语言。
二、自底向上的语法分析步骤自底向上的语法分析过程可以分为以下步骤:1. 词法分析首先,将输入的字符串进行词法分析,将其划分为一个个单词或记号(Token)。
每个单词或记号都具有一个特定的含义,表示了输入字符串中的一个基本语义单元。
2. 初始化构建一个栈(Stack)用于保存已识别的单词或记号,并初始化一个语法分析表(Parsing Table)用于记录语法规则和操作符的优先级关系。
3. 移入操作从输入的字符串中读取一个未处理的单词或记号,并将其压入栈中。
4. 归约操作不断检查栈中的记号序列是否满足某一语法规则,如果满足,则将该记号序列替换为相应的非终结符,并执行相应的语义动作。
重复这个过程,直到不能再进行归约操作。
5. 接受或错误处理如果最终栈中只剩下一个元素,且该元素为起始符号,则语法分析成功,接受输入的字符串。
如果栈中无法进行归约操作,或者最终栈中还有多余的元素,或者无法匹配到输入字符串的所有部分,则语法分析失败,进行错误处理。
三、算符优先文法算符优先文法是自底向上分析方法的代表,它以操作符的优先级和关联性为基础,构造一个优先关系表来进行分析。