第五章 自上而下语法分析
◇ 能够对一个给定的文法判断是否是 LL(1)文法; ◇ 能构造预测分析表; ◇ 能用预测分析方法判断给定的输入符号串是否是该文法的句子; ◇ 能对某些非 LL(1)文法做等价变换:
① 消除左递归 ② 提取左公共因子 可能会变成 LL(1)文法。这样可扩大自顶向下分析方法的应用。 2、教学内容: 语法分析器的功能,自上而下语法分析(递归下降分析法,预测分析程序),LL(1) 分析法,递归下降分析程序构造,预测分析程序。 3、教学重点: 递归下降子程序,预测分析表构造,LL(1)文法。 4、教学难点: 对一个文法如何判断是否是 LL(1)文法,由于在判断 LL(1)文法时用到文法符号串 的开始符号集合(FIRST 集)和非终结符后跟符号集合(FOLLOW 集)的计算,而一般学 生往往因概念不清或不够细心对这两个集合的计算常常出错,导致判断和分析结果的错 误。 5、课前思考 为了了解自顶向下(自上而下)分析的一般过程和问题,请学生首先回顾本章之前 介绍的有关基本概念: ◇ 句子、句型和语言的定义是什么? ◇ 什么叫最左推导? ◇ 什么叫最右推导和规范推导? ◇ 什么叫确定的自顶向下语法分析?
四、LL(1)文法的判别 选用自顶向下分析技术时,首先必须判别所给文法是否为 LL(1)文法,因而对任意
给定文法需计算 FIRST,FOLLOW,SELECT 集合,进而判别文法是否为 LL(1)文法。 例:文法 G[S]为:
SAB|bC,A|b,B|aD,CAD|b,DaS|c 解:(第一步)计算能推出 的非终结符
1
第五章 自上而下语法分析
◇ 自顶向下语法分析是从文法的开始符号出发,反复使用各种产生式,寻找与输 入符号匹配的推导。
◇ 确定的自顶向下语法分析中用的是哪种推导? ◇ 在确定的自顶向下语法分析过程中,当以同一个非终结符为左部的产生式有多 个不同右部时,如何选择用哪个产生式的右部替换当前的非终结符? ◇ 确定的自顶向下语法分析对文法有何限制? 6、章节内容 第一节 概述 第二节 LL(1)分析方法 第三节 递归下降分析法
行与文法的一个非终结符号相关联,而每一列则与文法的一个终结符号或#有关。 ➢ 分析表元素 M[A,a],其中 AVN ,a VT {#},指示了分析器应采取的动作。 2、工作过程
分析器对每一输入串的分析均在总控程序控制下进行,算法: 第一步:分析开始时,首先将符号#及文法的开始符号 S 依次放置于分析栈的底部, 并把各指示器调整至起始位置,即起始格局如下图,然后反复执行第二步所列的工作。
第五章 自上而下语法分析
第五章 自上而下语法分析
1、教学目的及要求: 本章介绍编译程序的第二个阶段语法分析的设计方法和实现原理,包括自上而下分
析的无回朔的递归下降分析、 LL(1)分析法。要求理解递归下降分析、LL(1)文法的基 本概念;掌握无回朔的递归下降分析的设计和实现、LL(1)分析表的构造与分析方法。
▪ 若某一非终结符的某一产生式右部为 ,将数组中对应该非终结符的标记置为 “是”,并从文法中删除该终结符的所有产生式。
(3)扫描产生式右部的每一符号; ▪ 若所扫描到的非终结符在数组中对应的标志是“是”,则删去该非终结符,若使 产生式右部为空,则对产生式左部的非终结符在数组中对应的标志改为“是”, 并删除该非终结符为左部的所有产生式。 ▪ 若所扫描到的非终结符号在数组中对应的标志是“否”,则删去该产生式,若使 产生式左部非终结符的有关产生式都被删去,则把在数组中该非终结符对应的标 志改为“否“。
练习:有文法 G[S]: SaAS|b,AbA| 判断是否为 LL(1)文法
SELECT(SaAS)=FIRST(aAS)={a} SELECT(Sb)=FIRST(b)={b} SELECT(AbA)=FIRST(bA)={b} SELECT(A)=FIRST()FOLLOW(A)={a,b} 而 SELECT(AbA)SELECT(A)={b} 所以,该文法不是 LL(1)文法。
用一个一维数组表示:建立一个以文法的非终结符个数为上界的一维数组,其数组 元素为非终结符,对应每一非终结符有一标志位,用以记录能否推出 ,其值有三种情 况:“未定”,“是”,“否”。
计算能推出 的非终结符的步骤: (1)将数组中对应每一非终结符的标记置为“未定”; (2)扫描文法中的产生式;
▪ 删除所有右部含有终结符的产生式,若使得某一非终结符为左部的所有产生式都 被删除,则将数组中对应该非终结符的标记置为否,说明该非终结符不能推出 。
▪ 若 Xm= ai=#,输入串已完全得到匹配,此时即可宣告分析成功而结束分析工作。
▪ 在上述分析的每一步,可视需要附加相应的处理工作。
4
第五章 自上而下语法分析
例:考虑文法 G[E]:ETE’,E’+TE’,E’,TFT’,T’FT’,T’*FT’|, F (E)|i 该文法的分析表如下,分析符号串 i+i*i。
例有文法 G[S]:S→cAd,A→ab|a,输入串 w=cad。其分析过程为带回溯的。
二、 存在问题及解决办法
1、左递归问题:
自顶向下分析方法只有把规则排列得合适时才能正确工作,该方法不能处理具有左 递归性文法,可采取某些算法消除左递归。
2、回溯问题:
2
第五章 自上而下语法分析
回溯问题因语法及与语法分析同时进行的语义分析等工作导致该方法效率低、代价 高,故必须消除回溯。 3、为避免回溯,对文法可提出相应要求: ➢ 设文法是不具有左递归性的文法,U 为文法 G 的任意非终结符,即 UVN,并假定 U
i
+
*
(
)
#
E TE’
TE’
E’
+TE’
T FT’
FT’
T’
*FT’
F i
(E)
步骤 分析栈
1 #E 2 #E’T 3 #E’T’F 4 #E’T’i 5 #E’T’ 6 #E’ 7 #E’T+ 8 #E’T 9 #E’T’F 10 #E’T’i 11 #E’T’ 12 #E’T’F* 13 #E’T’F 14 #E’T’i 15 #E’T’ 16 #E’ 17 #
5.2 LL(1)分析方法
一、LL(1)分析方法
是实现自顶向下分析的一种方法,相应的语法分析将按自左向右的顺序扫描输入符
号串,并在此过程中产生一个句子的最左推导。使用该方法,借助于一张分析表及一个
语法分析栈,在一个总控程序控制下很容易实现。以下是 LL(1)分析器的逻辑结构及工
作过程:
a1 a2 ... ai ... an #
SELECT(A) SELECT(A)= 其中 , 不能同时推导出 。
例:设文法 G[S]:SaA|d,AbAS| 解:因为 SELECT(SaA)=FIRST(aA)={a}
SELECT(Sd)=FIRST(d)={d} SELECT(AbAS)=FIRST(bAS)={b} SELECT(A)=FIRST()FOLLOW(A)={#,a,d} 所以, SELECT(SaA)SELECT(Sd)= {a} {d}= SELECT(AbAS)SELECT(A)={b} {#,a,d}= 故该文法为 LL(1)文法,可用确定的自顶向下分析法。
5.1 概述
LL 分析法
确定的自上而下分析
自上而下分析
递归下降分析法
语法分析
不确定的自上而下分析——即带回溯的分析方法
算符优先分析
自下而上分析
LR 分析
一、带回溯的自顶向下分析方法
是自顶向下分析的一般方法,即对任一输入符号串,试图用一切可能的办法,从树 根结点(识别符号)出发,根据文法自上而下地为输入串建立一棵语法树,或者说,从 识别符号开始,根据文法为输入串建立一个推导序列,这种分析过程本质上是一种试探 过程,是反复使用不同规则谋求匹配输入串的过程。
输入
分析表MБайду номын сангаас
总控程序
…...
x
#
分析栈 3
第五章 自上而下语法分析
二、LL(1)分析器的逻辑结构及工作过程 1、逻辑结构
逻辑上,LL(1)分析器由一个总控程序、一张分析表和一个分析栈组成。其中: ➢ “输入”即待分析的符号串(其中#VT),在输入串的末尾放置一个#,仅为分析算
法格式的统一。 ➢ 分析表 M 可用一个矩阵或二维数组表示,概括了相应文法的全部信息,矩阵的每一
有如下规则 U1| 2|…| n,该规则右部有 n 个选择,从每一个选择出发,都可 以推导一个以上的终结符号串,定义任一个选择 i 的所有可能推出的终结符号串的 首符号集 FIRST(i), FIRST(i)={a| i* a…,a VT}。 ➢ 为避免回溯,须保证当非终结符 U 去匹配输入串时,能够根据当时读入的符号准确 地选用它的一个选择去执行任务,因此,为实现该目的,对文法的要求是:FIRST(i) FIRST(j)=(ij),即对文法中的任一个非终结符,其规则右部有多个选择时,由 各个选择所推出的终结符号串的头符号集要两两不相交。 ➢ 这样,可根据当时读入的符号属于哪个选择的 FIRST()来唯一的确定应该选用哪个 选择匹配输入串,如当前的输入符号为 b(bVT), 若 bFIRST(i),则用第 i 个选择; 若 bFIRST(i),i=1...n,则语法错,转出错处理,避免分析过程的回溯。 4、为实现不带回溯的自顶向下分析,对文法来说需满足下述两个条件: ➢ 文法是非左递归的; ➢ 对文法的任一非终结符号,若其规则右部有多个选择时,则每个选择所推出的终结 符号串的头符号集两两不相交。
1、设 G=(VN,VT,P,S)是上下文无关文法,FIRST()={a|a,aVT, V*} 若 * ,则规定 FIRST()
FIRST()是 的所有可能推导的起始终结符或可能的 。
2、设 G=(VN,VT,P,S)是上下文无关文法,AVN, S 是开始符号, FOLLOW(A)={a|S* A,且 aVT , aFIRST(), V*, V+}