140 likes | 395 Views
第四章 语法分析 —— 自上而下分析. 高级语言的语法结构适合用上下无关文法描述,因此,我们将上下文无关文法作为语法分析的基础。本章和下一章,我们将介绍编译程序构造中的一些典型的语法分析方法 4.1 语法分析器功能 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。 下图表明了语法分析器在编译程序中的地位。. 语法. 单词. 词法 分析器. 语法 分析器. 编译程序 后续部分. 源程序. 目标程序. 分析树. 符号. 符 号 表.
E N D
第四章 语法分析——自上而下分析 高级语言的语法结构适合用上下无关文法描述,因此,我们将上下文无关文法作为语法分析的基础。本章和下一章,我们将介绍编译程序构造中的一些典型的语法分析方法 • 4.1 语法分析器功能 语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。 下图表明了语法分析器在编译程序中的地位。 第四章 语法分析--自上而下分析
语法 单词 词法 分析器 语法 分析器 编译程序 后续部分 源程序 目标程序 分析树 符号 符 号 表 语法分析器在编译程序中的地位 第四章 语法分析--自上而下分析
按照语法分析树的建立方法,我们可以粗略地把语法分析方法分为两类:一类是自上而下分析法,另一类为自下而上分析法。按照语法分析树的建立方法,我们可以粗略地把语法分析方法分为两类:一类是自上而下分析法,另一类为自下而上分析法。 • 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’| 第四章 语法分析--自上而下分析
直接左递归,和非直接左递归的消除方法均在必须掌握之列。这里我们切不可被形式描述消除左递归的算法吓倒,多做几个例题后再来理解是很有好处的:直接左递归,和非直接左递归的消除方法均在必须掌握之列。这里我们切不可被形式描述消除左递归的算法吓倒,多做几个例题后再来理解是很有好处的: [例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的规则式多余的则可化简 第四章 语法分析--自上而下分析
得到: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 第四章 语法分析--自上而下分析
[例]有产生式 B bBcA|b 由于FIRST(bBcA) FIRST(b) ={b} 则需要提取公共左因子 将产生式改写成:BbC CBcA| 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)文法 第四章 语法分析--自上而下分析
本节特别注意:如果空字ε属于某个非终结符的候选首府集的情况。本节特别注意:如果空字ε属于某个非终结符的候选首府集的情况。 • 4.4 递归下降分析程序构造 当一个文法满足LL(1)条件时,我们就可以构造一个不带回溯的自上而下分析程序,这个分析程序由一组第归过程组成,每个过程对应文法的一个非终结符。这样一个分析程序称为递归下降分析器。 在本节中我们对巴科斯范式进行了扩充: (1)用花括号{}表示闭包运算* ( 2)用{}0n表示可以任意重复0次至n 次, {}00=。 (3)用方括号[]表示{}01,即表示的出现可有可无。 • 4.5 预测分析程序 使用高级语言的递归过程描述递归下降分析器,只有当具有实现这种过程的编译系统时才有实际意义。实现LL(1)分析的另一种有效方式是使用一张分析表和一个栈进行联合控制。我们现在介绍的预测分析程序就是属于这种类型的LL(1)分析器。 本节要 掌握对给定文法构造出每个非终结符的FIRST和FOLLOW集合。 第四章 语法分析--自上而下分析
掌握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)=FOLLOW(T)=FIRST(E‘)={+} 第四章 语法分析--自上而下分析
构造分析表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) 分析中的错误处理 第四章 语法分析--自上而下分析
例题与习题解答 [例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] 第四章 语法分析--自上而下分析
[例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 end X d : X sY Y :sY 第四章 语法分析--自上而下分析
[例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)文法的要求。 第四章 语法分析--自上而下分析
[例4] 设有文法:G[S]: SaBc | bAB AaAb | b Bb | 构造其LL(1)分析表,并分析符号串baabbb是否是该文发的句子。 解:因为只有FIRST(B)含有 所以只考虑: FOLLOW(B)=FIRST(c) FOLLOW(S)={c, #} 该文法的LL(1)表 a b c # S aBc bAB A aAb b B b 符号串baabbb是否为句子的分析过程 步骤 符号栈S 输入串 规则 • #S baabbb# SbAB • #BAb baabbb# 第四章 语法分析--自上而下分析
#BA aabbb# AaAb • #BbAa aabbb# • #BbA abbb# AaAb • #BbbAa abbb# • #BbbA bbb# Ab • #Bbbb bbb# • #Bbb bb# • #Bb b# • #B # B • # # 成功, STOP 分析成功baabbb是该文法的一个句子。 第四章 语法分析--自上而下分析