180 likes | 353 Views
第五章 语法分析 —— 自下而上分析. 所谓自下而上分析法就是从输入串开始,逐步进行“归约”,直至归约到文法的开始符号;或者说从语法树的末端开始,步步向上“归约”,直到根结。 5.1 自下而上分析基本问题 我们先讨论自下而上分析的一些基本思想和 基本概念: 5.1.1 归约 自下而上分析的关键问题是寻找 可归约串 。对“可归约串”概念的不同定义,就形成了不同的自下而上的分析方法。在算符优先分析法中我们用“最左素短语”来刻画“可归约串”,在“规范归约”中,则用“句柄”来刻画“可归约串” 5.1.2 规范归约简述
E N D
第五章语法分析——自下而上分析 所谓自下而上分析法就是从输入串开始,逐步进行“归约”,直至归约到文法的开始符号;或者说从语法树的末端开始,步步向上“归约”,直到根结。 5.1 自下而上分析基本问题 我们先讨论自下而上分析的一些基本思想和 基本概念: 5.1.1归约 自下而上分析的关键问题是寻找可归约串。对“可归约串”概念的不同定义,就形成了不同的自下而上的分析方法。在算符优先分析法中我们用“最左素短语”来刻画“可归约串”,在“规范归约”中,则用“句柄”来刻画“可归约串” 5.1.2 规范归约简述 在这一部分应掌握短语和直接短语和句柄三个重要概念 第五章 语法分析--自下而上分析
令G是一个文法,S是文法的开始符,假定是文法G的一个句型,如果有:令G是一个文法,S是文法的开始符,假定是文法G的一个句型,如果有: S*A 且 A + 则称是句型相对于非终结符A的短语。特别是,如果有 A 则称是句型相对于规则A 的直接短语,一个句型的最左直接短语成为该句型的句柄。注意:短语的两个条件是: S*A 且 A + [例5.1]考虑文法: E T|E+T T F|T*F F i | (E) (5.2) 对于句型i*i+i 推导 解: E→E+T→T+T→T*F+T→F*F+T→i*F+T→i*i+F → i*i+i 第五章 语法分析--自下而上分析
尽管有E +i+i 但是, i+i 并不是该句型的一个短语,因为不存在从E(文法开始符)到i*E的推导。但是,i, i*i,和i*i+ i 自身都是句型i*i+i 的短语。而且为为直接短语。 [例5。2] 上题文法(5。2)的另一个句型E+T*F+i 的短语有 E+T*F+i ,E+T*F, T*F,和i. 其中T*F和i为直接短语, T*F为句柄。 解:E→E+T→E+T+T→E+T*F+T→E+T*F+F→ E+T*F+i 第五章 语法分析--自下而上分析
关于规范归约精确的说,假定是文法G的一个句子,我们称序列关于规范归约精确的说,假定是文法G的一个句子,我们称序列 n n-1 n-2, 。。。, 0 是的一个规范规约,如果此序列满足: (1) n = ; (2) 0为文法的开始符,即 0 =S; (3)对于任何的i, 0<i <=n, i-1是从i经把句柄替换为相应产生式的左部符号而得到的。 容易看到,规范归约是关于α的一个最右推导的逆过程。因此规范归约也成最左归约。 在形式语言中,最右推导常被称为规范推导。由规范推导所得的句型称为规范举行。如果文法G是无二义的,那么规范推导的逆过程必是规范归约。 5.1.3 符号栈的使用与语法树的表示 本节重点掌握符号栈的使用请阅读P87相应段落。 现在举个例子以加深对这一节的理解。 第五章 语法分析--自下而上分析
[例5.3]:对于文法(5.2)输入串i1*i2+i3 的分析(规范归约)步骤可表示如下: 步骤 符号栈 输入串 动作 0 # i1*i2+i3# 预备 • #i1 *i2+i3# 读入i1 • #F *i2+i3# 归约,Fi • #T *i2+i3 # 归约,T F • #T* i2+i3# 读入 • #T*i2 +i3# 读入 • #T*F +i3# 归约,F i • #T +i3# 归约,T T*F • #E +i3# 归约,E T • # E+ i3# 读入 • #E+i3 # 读入 • #E+F # 归约, F i • #E+T # 归约, T F • #E # 归约,E E+T • #E # 接受 第五章 语法分析--自下而上分析
5.2 算符优先分析 5.2.1 算符优先文法及优先表的构造 一个文法,如果它的任何产生式的右部都不含量个相继(并列)的非终结符,即不含如下形式的产生式右部: …QR… 则我们称该文法为算符文法。 在后面的定义中,a、b代表任意终结符;P、Q、R代表任意非终结符;‘…’代表有终结符和非终结符组成的任意序列,包括空字。 假定G是一个不含--产生式的算符文法。对于任何一对终结符a、b,我们说: (1) ab 当且仅当文法G中含有形如P …ab…或P …aQb…的产生式; (2) a<b当且仅当G中含有形如P …aR…的产生式,R而R+b…或R +Qb…; (3) a>b当且仅当G中含有形如P …Rb…的产生式, R而R+…a或R +…aQ; 第五章 语法分析--自下而上分析
如果一个文法G中的任何终结符对(a, b )至多只满足下述三关系之一: a=·b, a<·b, a·>b 则称G是一个算符优先文法。 应掌握算符优先表的构造方法。 通过检查G的每个产生式的每个候选式,可以找出满足a=·b的终结符对。为了找出所有满足关系<·和·>的终结符对,我们需要对G的每个非终结符P 构造两个集合FIRSTVT(P)和LASTVT(P): FIRSTVT(P)={a | P+a…或P +Qa…,aVT而 Q VN } LASTVT(P)={a | P+…a或P +…aQ,aVT而 Q VN } 有了这两个集合后,就可以通过检查每个产生式的候选式确定满足关系<·和·>的所有终结符对。例如:假定有个产生式的一个候选式为 …aP… 那末,对任何bFISTVT(P),我们有a<·b。类似地,假定有产生式的一个候选式为 第五章 语法分析--自下而上分析
…Pb… 那末,对任何aLASTVT(P),我们有a·>b. 我们首先讨论构造集合FIRSTVT(P)的算法。按定义,我们可用下面两条规则来构造集合FIRSTVT(P): • 若有产生式Pa…或P Qa…,则aFIRSTVT(P) • 若aFIRSTVT(Q),且有产生式P Q… 则aFIRSTVT(P) 同样我们可以构造LASTVT(P)的算法。 在我们有了每个非终结符P 的FISTVT(P)和LASTVT(P)之后我们就能够造文法G的优先表。其算法如下: FOR 每一条产生式PX1X2…Xn FOR i:=1 TO n-1 DO BEGIN IF Xi 和 Xi+1 均为终结符THEN 置 Xi=·Xi+1 第五章 语法分析--自下而上分析
IF I<=n-2且Xi和Xi+2都为终结符,而Xi+1为非终结符,则置Xi=·Xi+2 IF Xi为终结符而Xi+1为非终结符 THEN FOR FISTVT(Xi+1)中的每个a DO 置 Xi<· a IF Xi为非终结符而Xi+1为终结符THEN FOR LASTVT(Xi)中的每个a DO 置 Xi ·>a END 至此我们完成了从文法G构造优先表的算法。 第五章 语法分析--自下而上分析
5.2.2 算符优先分析算法 为了刻画什么是“可归约串”我们将定义算符优先文法的句型的“最左素短语”这个概念。 所谓素短语是指这样的一个短语,它至少含有一个终结符,并且出它自身外,不再含有更小的素短语。 所谓最左素短语,是指处于句型最左边的那个素短语。 我们把算符优先文法句型(括在两个#号之间)的一般形式写成: #N1a1N2a2…Nnan Nn+1# (5.4) 其中每个ai都是终结符,Ni是可有可无的非终结符。 一个算符优先文法G的任何句型(5.4)的最左素短语是满足如下条件的最左子串:Njaj…Nia i+1, a j-1<·aj aj=aj+1, … , a i-1=·a i ai·>a i+1 根据这个最左素短语的定义我们可以构造算符优先分析算法。参考P93 第五章 语法分析--自下而上分析
5.2.3 优先函数 在实际实现算符优先分析算法时,一般不用优先表而是用两个优先函数f 和g。我们把每个终结符号与两个自然数f()和g() 相对应,使得 若1<· 2 则 f(1)<g(2) 若1=· 2 则 f(1)=g(2) 若1·〉 2 则 f(1)>g(2) 函数f 称为入栈优先函数,g称为比较优先函数。 构造优先函数的方法应在必须掌握之列。 如果优先函数存在,那么,从优先表构造优先函数的一个简单方法是: (1)对于每个终结符a(包括#)令其对应两个符号fa和ga , 画一张以所有符号fa和ga为结点的方向图,如果a·>=·b,那么,就从fa画一箭弧至gb;如果a<·=·b 则画一条从gb到fa的箭弧。 第五章 语法分析--自下而上分析
(2) 对于每个结点都赋予一个数,此数等于从该结点所能到达结点(包括出发结点自身在内)的个数。赋给fa的数作为f(a),赋给gb的数作为g(b). (3)检查构造出来的函数f 和g,看它们同原来的关系表是否有矛盾。如果没矛盾,则f 和g就是所要的优先函数。如果有矛盾,那么,就不存在优先函数。 例题5。5 就是构造优先函数的例子,望同学们好好研究一下。 5。2。4 算符优先分析中的出错处理 第五章 语法分析--自下而上分析
例题与习题解答 [例5.1] 设有文法G和输入串$ G: SaABe $: abbcde A Abc|b B d 通过语法树能使我们直观的理解规范“归约”、“句柄”等概念。 第五章 语法分析--自下而上分析
上图中图a是输入串abbcde的语法树,一个句型的句柄是该句型语法树中最左子树的末端结的自左至右排列。则此子树为A b其末端b为句型abbcde的句柄。将其剪掉(归约)后如图b,其最左子树A Abc其末端结Abc为句型aAbcBe的最左子树末端结故为句柄。图c表明句型aAde的句柄为d。将其归约句型aABe的最左子树为其自身。即为其自身句柄。 [例5.2]考虑下面文法: 1。 EE+T|T 2. T T*F|F 3. F PF|P 4. P (E)|i 构造优先关系表 解: 根据产生式4 我们有‘(’=·‘)’, 从产生式1,2 的+T和T*我们有+<·*,从产生式2,3的*F和P我们有*<·;由产生式1和EE+T可得+·>+,同理可得:。 由产生式P (E)和E E+T T+T T*F+T F*F+T PF*F+T iF*F+T 我们可以得到 (<·+, (<·*, (<·, (<·i .总之,我们可以按定义得到对于文法G的任何终结符对(a,b)的,至多只有一种优先关系。从而得到下面的优先表: 第五章 语法分析--自下而上分析
优先关系表 + * i ( ) # + * i ( ) # [例5.3] 对下列文法G: S’#S# P S|i S D(R) D i R R; P|P 求出每个非终结符的FIRSTVT集和LASTVT集,并构造算符优先关系矩阵。 第五章 语法分析--自下而上分析
文法G每个非终结符的FIRSTVT集合 FIRSTVT(S’)= {#} FIRSTVT(P) ={i, ( } FIRSTVT(S)={ (, i } FIRSTVT(D) ={i } FIRSTVT(R) ={;, (, I } 文法G的每个非终结符的LASTVT集合 LASTVT(S’) ={ #} LASTVT(P) = {i , ) } LASTVT(S) ={ ) } LASTVT(D) = {i } LASTVT(R) ={;, ) ,i } 优先关系矩阵 ( ) ; i # ( <· =· <· <· ) ·> ·> ·> ; <· ·> ·> <· i ·> ·> ·> # <· <· =· 第五章 语法分析--自下而上分析
[例5.4]已知文法G[S]为算符优先文法,其规则为:[例5.4]已知文法G[S]为算符优先文法,其规则为: SSaF|F F FbP|P P c|d 求优先关系矩阵 解:每个非终结符的FISRVT集合 FIRSTVT(S) = {c, d, a,b} FIRSTVT(F) = {b, c, d} FIRSTVT(P) ={c , d } 每个非终结符的LASTVT集合 LASTVT(S)= { a, b, c, d} LASTVT(F) = {b, c, d} LASTVT(P) = { c, d } 因为SSaF 则LASTVT(S)·>a且a<·FIRSTVT(F) 则:a·>a, b·>a, c·>a, d·>a 且a<·b,a<·c,a<·d 由于F FbP; 则LASTVT(F)>b且b<FIRSTVT(P) 则:b>b, c>b, d>b 且b<c, b<d 第五章 语法分析--自下而上分析
优先关系矩阵: a b c d a > < < < b > > < < c > > d > > 第五章 语法分析--自下而上分析