第四章 语法分析 —— 自上而下分析

15
第第第 第第第第--第第第第第第 第第第 第第第第——第第第第第第 第第第第第第第第第第第第第第第第第第第第 第第第 ,, 第第第第第第第第第第第第第第第第第第第 第第第第第 第第 第第第第第第第第 。一, 第第第第第 第第第第第第第第第第 4.1 第第第第第第第 第第第第第第第第第第第第第第 第第第第第第第第第第第第第第第 第第第第第第第 第第第第第第第第第第第第第第第第第第第第第 ,。 第第第第第第第第第第第第第第第第第第第

Upload: santa

Post on 18-Mar-2016

103 views

Category:

Documents


1 download

DESCRIPTION

第四章 语法分析 —— 自上而下分析. 高级语言的语法结构适合用上下无关文法描述,因此,我们将上下文无关文法作为语法分析的基础。本章和下一章,我们将介绍编译程序构造中的一些典型的语法分析方法 4.1 语法分析器功能 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。 下图表明了语法分析器在编译程序中的地位。. 中间. 中间. 编译前端. 代码优化. 代码生成器. 源程序. 目标程序. 代码. 代码. 符 号 表. 代码生成器的位置. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

第四章 语法分析——自上而下分析 高级语言的语法结构适合用上下无关文法描述,因此,我们将上下文无关文法作为语法分析的基础。本章和下一章,我们将介绍编译程序构造中的一些典型的语法分析方法• 4.1 语法分析器功能 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。 下图表明了语法分析器在编译程序中的地位。

Page 2: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

源程序 编译前端 中间代码 代码优化

中间代码 代码生成器 目标程序

符 号 表

代码生成器的位置

Page 3: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

按照语法分析树的建立方法,我们可以粗略地把语法分析方法分为两类:一类是自上而下分析法,另一类为自下而上分析法。

•4.2 自上而下分析面临的问题 本节主要是通过例子使我们认识到,作自上而下分析所遇到的主要

困难是语法的左递归性使分析陷入无限循环;回溯的不确定性,要求我们将已经完成工作推倒从来,为解决这些问题我们要消除左递归和消除回溯。

•4.3 LL(1) 分析法 4.3.1 左递归的消除 一般而言,假定 P 关于的全部产生式是 PP1| P2|…| P1m| 1| 2 |… | n

其中,每个都不等于,而每个都不以 P 开头,那末,消除 P的直接左递归性就是把这些规则改写成:

P | 1 P’| 2 P’|…| n P’

P’1P’| 2P’| …| mP’|

Page 4: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

直接左递归,和非直接左递归的消除方法均在必须掌握之列。这里我们切不可被形式描述消除左递归的算法吓倒,多做几个例题后再来理解是很有好处的: [ 例 4 。 3] : 考虑文法: SQc|c Q Rb|b R Sa|a 消除左递归。 解:将终结符排序为 R 、 Q 、 S 。对于 R 不存在直接左递归。把 R 带入到 Q 中有关的候选式: Q Sab|ab|b 现在 Q 同样不含直接左递归,把它带入 S 的有关候选式: S Sabc|abc|bc|c 经消除 S 的直接左递归后我们们得到整个文法 S abcS’|bcS’|cS’ S’ abcS’| Q Sab|ab|b R Sa|a 由于关于 Q,R 的规则式多余的则可化简

Page 5: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

得到: S abcS’|bcS’|cS’ S’ abcS’|4.3.2 消除回溯、提左因子 我们首先来看一下在不得回溯的情况下对于文法有什么要求。前面已经说过,欲实行自上而下的分析,文法不得含左递归。令 G 是一个不含左递归的文法,对 G 的所有的非终结符号的每个候选定义它的终结首符集 FIRST() 为: FIRST()={a| *a…,aVT} 特别是,若 * ,则规定 FIRST() 。 换句话说 FIRST( )是的所有可能推导的开头终结符或可能的 。如果非终结符 A 的所有候选首符集两两

不相交,即 A 的任何两个不同的候选 i 和 j

FIRST(i) FIRST(j) = 那么,当要求 A 匹配输入串时, A 就能根据它所面临的第一个输入符号 a ,准确地指派某个候选前去执行任务。这个候选就是那个终结首符集含 a 的。 如何把一个文法改造成任何终结首符集的所有候选首符集两两不相交呢?其办法是提取公共左因子。例如,假定关于 A 的规则是 A1| 2| 。。。 |n| 1| 2|… |m (其中每个不以开头) 那末,可以把这些规则改写成: A A’| 1| 2|… |m

A’ | 1 | 2 | …| n

Page 6: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

[ 例 ] 有产生式 B bBcA|b 由于 FIRST(bBcA) FIRST(b) ={b} 则需要提取公共左因子 将产生式改写成: B bC C BcA| 4.3.3 LL( 1 )分析条件 假定 S 是文法 G 的开始符号,对于任何非终结符 A 我们定义: FOLLOW(A) = { a | S* …Aa…, aVT } 特别是,若 S* …A , 则规定 # FOLLOW(A). 也就是说, FOLLOW(A) 是所有举行中出现在紧接 A 之后的终结符活‘ #’ 。 判断某给定文法是否为 LL(1) 文法其条件为: ( 1 )文法不含左递归。 ( 2 )对于文法中每个非终结符 A 的各个产生式的候选首符集两两不相交。即,若 A 1 | 2 | 。。。 | n 则: FIRST(i) FIRST(j) = ( i j ) (3) 对文法中每一个终结符 A ,若它存在某个候选首符集包含,则 FIRST(A) FLLOW(A)= 一个文法若满足以上条件,责称该文法 G 为 LL(1) 文法

Page 7: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

本节特别注意:如果空字 ε属于某个非终结符的候选首府集的情况。• 4.4 递归下降分析程序构造 当一个文法满足 LL(1)条件时,我们就可以构造一个不带回溯的自上而下分析程序,这个分析程序由一组第归过程组成,每个过程对应文法的一个非终结符。这样一个分析程序称为递归下降分析器。 在本节中我们对巴科斯范式进行了扩充: ( 1 )用花括号 {} 表示闭包运算 * ( 2 )用 {}0

n 表示可以任意重复 0次至 n 次, {}00= 。

( 3 )用方括号 [] 表示 {}01 ,即表示的出现可有可无。

• 4.5 预测分析程序 使用高级语言的递归过程描述递归下降分析器,只有当具有实现这种过程的编译系统时才有实际意义。实现 LL(1) 分析的另一种有效方式是使用一张分析表和一个栈进行联合控制。我们现在介绍的预测分析程序就是属于这种类型的 LL(1) 分析器。 本节要 掌握对给定文法构造出每个非终结符的 FIR

ST 和 FOLLOW 集合。

Page 8: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

掌握 LL(1)预测分析表的构造,请参看 4 。 5 。 1 预测分析程序的工作过程( P76 )和 4 。 5 。 2预测分析表的构造( P78 )。 现在举一些例子帮助同学们理解: [ 例 4 。 7 ] 对于文法 ETE’ E’ +TE’| T FT’ T’ *FT’| F (E)| i 我们构造每个非终结符的 FIRST 和 FOLLOW 集合 解: FIRST(E) = { (, i } FOLLOW(E) ={ ), # } FIRST(E’) = {+, } FOLLOW(E’) = { ), #} FIRST(T) = {(, i } FOLLOW(T) = {+, ), # } FIRST(T’) = {*, } FOLLOW(T’) ={+ , ), # } FIRST(F) = {(, i } FOLLOW(F) ={*, +, ) , # }在这里我们要注意 FOLLOW(F) 的求解过程其中: FOLLOW(F)=FIRST(T’)={*}; 因为 T’ , 所以将 FOLLOE(T)加到 FOLLOW(F) 中 (由于 TFT’), 则: FOLLOW(F)=FOLL

OW(T)=FIRST(E‘)={+}

Page 9: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

构造分析表 M 的算法是: ( 1 )对文法 G 的每个产生式 A执行第二步和第三步; ( 2 )对于每个终结符 aFIRST() ,把 A加到 M

[A,a] 中; ( 3 )若 FIRST() ,则对任何的 b FOLLOW(A)把 A加至M[a,b] 中; ( 4 )把所有无定义的 M[A,a]标上“出错标志”4.6 LL(1) 分析中的错误处理

Page 10: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

例题与习题解答[ 例 1]试构造与下列文法 G[S] 等价的无左递归文法。 G[S]: SSa|Nb|c (1) N Sd|Ne|f (2) 对于( 1 )我们引入新非终结符 S’ 则: S NbS’ |cS’ [1] S’ aS’| [2] 将 S 代入 ( 2 ) N Ne |NbS’d |cS’d |f 引入新非终结符 N’ N cS’dN’ |fN’ [3] N’ eN’ |bS’dN’ | [4]

Page 11: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

[ 例 2] :文法 G 的规则集为 ; P begin d : X end X d : X | sY Y : sY | 做出该文法 LL(1) 分析表。解: 非终结符只有 P , X ,Y 只有 FIRST(Y) 含有 则需 要求出 FOLLOW(Y)且 FOLLOW(Y) =FOLLOE(X)=end则有 LL(1) 表: begin d : end s #P begind : X endX d : X sYY :sY

Page 12: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

[ 例 3] :给出语言 L={1na0n1ma0m|n>0, m>=0} 的 LL(1)文法 G[S] 并说明其理由。 解:观察句子 ,发现可分成两部分 1na0n 和 1ma0m 两部分中符号的个数 n 和 m没有制约关系。则可改造成下列文法: S AB A 1A0 |1a0 B 1B0 |a 对于产生式 A 1A0 |1a0 两个候选式 FIRST(1A0)FIRST(1a0)={1}<> 所以上边文法不是 LL(1) 文法:需左提公因子,得到: S AB A 1C C A0 |a0 B 1B0 |a 此文法满足 LL(1) 文法的要求。

Page 13: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

[ 例 4] 设有文法: G[S]: SaBc | bAB AaAb | b Bb | 构造其 LL(1) 分析表,并分析符号串 baabbb 是否是该文发的句子。 解:因为只有 FIRST(B) 含有 所以只考虑: FOLLOW(B)=FI

RST(c) FOLLOW(S)={c, #} 该文法的 LL(1) 表 a b c #S aBc bABA aAb bB b 符号串 baabbb 是否为句子的分析过程步骤 符号栈 S 输入串 规则1 #S baabbb# SbAB2 #BAb baabbb#

Page 14: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

3 #BA aabbb# AaAb4 #BbAa aabbb#5 #BbA abbb# AaBb6 #BbbAa abbb#7 #BbbA bbb# Ab8 #Bbbb bbb#9 #Bbb bb# 10 #Bb b#11 #B # A12 # # 成功, STOP 分析成功 baabbb 是该文法的一个句子。

Page 15: 第四章 语法分析 —— 自上而下分析

第四章 语法分析--自上而下分析

第五章第五章语法分析——自下而上分析( 1 )所谓自下而上分析法就是从输入串开始,逐步进行“规约”,直至规约到文法的开始符号;或者说从语法树的末端开始,步步向上“规约”,直到根结。5.1 自下而上分析基本问题 其基本问题包括下列问题: 5.1.1 归约 5.1.2 规范归约简述 在这一部分应掌握短语和直接短语两个重要 概念 5.1.3 符号栈的使用与语法树的表示