语法分析-自底向上.ppt
《语法分析-自底向上.ppt》由会员分享,可在线阅读,更多相关《语法分析-自底向上.ppt(173页珍藏版)》请在三一办公上搜索。
1、语法分析概述短语、直接短语及句柄算符优先分析LR分析LR分析的错误处理与恢复语法分析程序自动生成器,第五章 语法分析 自底向上,2,基本思想:从输入串开始逐步归约 基本问题:归约的问题 优先分析法 优先文法、算符优先文法 优先算符 优先函数的构造 分析方法 基础知识 LR(0)项目及项目集 LR(1)项目及项目集 规范句型活前缀 LR分析法 LR分析器 分析栈、分析表 分析方法 LR分析表的构造 实现技术移进归约,自下而上语法分析,5.1自下而上的语法分析,CompilerPrinciples,3,自下而上分析基本思想从给定的输入串$开始,不断寻找子串与文法G中某个产生式P的候选式进行匹配,并
2、用P的左部代替(归约)之,逐步归约到S,CompilerPrinciples,4,1.归约与语法分析树 例 文法 GS:(1)SaAcBe(2)Ab(3)AAb(4)BdW=abbcde,构造其语法分析树:,S,5,2.移进归约,动作:,符号栈:,移进a,移进b,归约b,移进b,归约Ab,移进c,移进d,归约d,归约aAcBe,移进e,归约产生式:,(2),(3),(4),(1),例 文法 GS:(1)SaAcBe(2)Ab(3)AAb(4)Bd,5.1自下而上的语法分析,CompilerPrinciples,6,自下而上分析的关键:(1)确定可归约串(2)如何归约,归约条件,归约原则,5.1
3、.2 规范规约与句柄,定义:定义5.1 短语:令G是一个文法,S是开始符号,是文法G的一个句型,如果有 S*A且A+,则称是句型相对于非终结符A的短语。特别的,如果有A,则称是句型相对于规则A的直接短语(简单短语)定义5.2 句柄:一个句型的最左直接短语称为该句型的句柄。,CompilerPrinciples,7,5.1.2 规范规约与句柄,注意:直接短语一定是短语;句柄一定是直接短语且具有最左性;句子的句柄是语法树中最左子树的所有叶节点从左到右的排列或在句子的规范推导序列中,最后使用的产生式的右部;,CompilerPrinciples,8,思考:用什么方法找出所有短语、直接短语和句柄?,例
4、:设有文法G和输入串$G:SaAcB AP Pab Bd$:aabcd对$存在推导 S=aAcB=aPcB=aabcB=aabcd,CompilerPrinciples,9,例,例:文法GE:E E+TT T T*F|F F(E)|i求句型T+T+i的短语、简单短语和句柄短语:T+T+i、T+T、T、i简单短语:T、i句柄:T,CompilerPrinciples,10,规范归约,假定是文法G的一个句子,有序列n,n-1,0,如果此序列满足:.n;.0S;.对任何i,0in,i-1是从i经把句柄替换为相应产生式的左部符号而得到的 称此序列是 的一个规范归约,11,规范归约是关于的一个最右推导的
5、逆过程,因此规范归约也称最左归约;例5.1 设有文法G1和输入字符串abbcde(1)SaABe(2)AAbc(3)Ab(4)BdS aABe aAde aAbcde abbcde R R R R,CompilerPrinciples,12,规范归约,(1),(1),(2),(2),(3),(3),(4),(4),13,基本思想:从输入串开始逐步归约 基本问题:归约的问题 优先分析法 优先文法、算符优先文法 优先算符 优先函数的构造 分析方法 基础知识 LR(0)项目及项目集 LR(1)项目及项目集 规范句型活前缀 LR分析法 LR分析器 分析栈、分析表 分析方法 LR分析表的构造 二义性文法
6、的分析 实现技术移进归约,自下而上语法分析,5.2.1直观的优先分析方法,基本思想对给定的G按照一定原则求出G的文法符号间的优先关系,按照优先关系寻找句柄实施归约。,CompilerPrinciples,14,a b 表示的a优先关系低于ba b 表示的a优先关系高于ba b 表示的a优先关系同等于b,优先关系,确定优先关系的规则,(1)X Y 当且仅当G中存在产生式A XY(在语法树的同一层)(2)X Y 当且仅当G中存在产生式A XB,且B Y(Y 在 X 的下一层)(3)X Y 当且仅当G中存在产生式A BD,且B X和D Y(X在 Y 的下一层或X比 Y先归约规范归约/最左归约),+,
7、+,*,例:有文法G(S):SbAb A(B|a BAa)解:文法符号优先关系推导如下:(1)求关系:由SbAb,A(B,BAa)b A,A b,(B,A a,a),(2)求关系:由SbAb 且A(B 可得 b(A a 可得 b a 由A(B 且B(B 可得(B aa 可得(a B Aa)可得(A,(3)求关系:由SbAb,且A)可得)b AB 可得 B b A a 可得 a b由BAa),且A)可得)a Aa 可得 a a AB 可得 B a,+,优先关系矩阵表示法:,简单优先文法的定义:(1)在文法符号集中,任意两个符号之间最多只有一种优先关系;(2)在文法中任意两个产生式没有相同的右部。
8、,优先表,CompilerPrinciples,21,优先表,例5.2 设有文法G(1)S aSb(2)Sab输入字符串aabb,请分析,注意:优先关系既非对称,也不传递。,简单优先分析法特点:只是用于简单优先文法,准确规范,但分析效率低,实际使用价值不大;算符优先分析法的提出:只考虑算符(终结符)之间的优先关系,不考虑非终结符之间的优先关系。,CompilerPrinciples,22,5.2.2.算符优先文法的定义,定义(算符文法)设有一文法G,如果G中没有 形规则,且没有的规则,其中,N,则称文法G是算符文法(OG)。例5.3 设有文法G(1)E EAE|(E)|i(2)A+|*E E+
9、E|E E|E*E|i,23,非OG,OG,定义命题:算符文法的任何句型都不会含有两个相邻的非终结符。,5.2.2.算符优先文法的定义,定义:算符优先文法设G是一不含 形规则的算符文法,则对于任何两个终结符a,b有:ab,当且仅当文法G中有形如 A ab或A aBb的规则:ab,当且仅当文法G中有形如A aB的规则,其中B=b 或B=Cb;a b,当且仅当文法G中有形如A Bb的规则,其中B=a或B=aC。若文法G中所有终结符号之间最多只满足这三者关系之一,则称文法G是算符优先文法(OPG文法)。其中:a、b VT;A、B、C VN;“”(VT VN)*,24,说明:(1)OPG一定是OG;(
10、2)OPG不含产生式;(3)OPG满足定义 的。,5.2.2.算符优先文法的定义,例5.4 设文法G(P):PaQQbRRa考察G(P)是不是算符优先文法。,CompilerPrinciples,25,考察G(P)中的终结符a、b的优先关系:据定义中的,因存在PaQ且Q=bR,所以ab;据定义中的,因存在bR且=a,所以ba;b与b,a与a不存在优先关系。所以G(P)是算符优先文法。,5.2.2.算符优先文法的定义,例5.5 设文法G:S aSb|ab考察G(P)是不是算符优先文法。,CompilerPrinciples,26,考察G(P)中的终结符a、b的优先关系:据定义,S aSb|ab
11、ab;据定义,S aS 且S=a a a;据定义,S Sb且 S=b b b;,问题:在计算机中应如何构造算符优先关系表?,5.2.3算符优先关系表的构造,27,优先关系:ab Pab或PaQb 的产生式;ab PaR形式的产生式,且R+b或R+Qb;ab PRb形式的产生式,且R+a或R+aQ;定义集合:设P是G的任一非终结符,那么:(1)最左终结符集FIRSTVT FIRSTVT(P)=a|P+a或P+Qa,aVT而Q,PVN(2)最右终结符级LASTVTLASTVT(P)=a|P+a或P+aQ,aVT而Q,PVN,问题:FIRSTVT、LASTVT应如何构造?,(1)FIRSTVT的构造
12、算法:方法一:根据定义FIRSTVT(B)可使用如下规则:.若有产生式P a 或PQa,则aFIRSTVT(P);.若aFIRSTVT(Q)且有产生式PQ,则a FIRSTVT(P);方法二:使用一个布尔数组FRP,a和一个栈Stack,CompilerPrinciples,28,29,具体算法描述如下:a.置FR初值为FALSE;b.用规则1对FRP,a初始化对每个非终结符P,若有形如P a 或PQa的产生式,则变FRP,a的FALSE为TRUE,同时(P,a)进栈;c.只要Stack非空,则出栈。每退出一项(Q,a)则检查是否有PQ 形式的产生式,若有,则置FRP,a为TRUE,同时(P,
13、a)进栈,直到栈空为止。当对所有的非终结符执行如上操作之后,就构造出了FIRSTVT集,即:FIRSTVT(P)aFR(P,a)TRUE,方法二:使用一个布尔数组FRP,a和一个栈Stack,例:求非终结符的FISRTVT,GE E#E#EE+TE T TT*F T F F(E)F i,30,FIRSTVT(E)=#FIRSTVT(E)=+FIRSTVT(T)=+,*,(,i FIRSTVT(T)=*FIRSTVT(F)=*,(,i FIRSTVT(F)=(,i,T,T,T,T,T,T,T,T,T,T,例5.6 设文法G(P):P QaQ bRR a据FIRSTVT(G)的算法首先求该文法的数
14、组FR,CompilerPrinciples,31,(2)LASTVT的构造算法:方法一:根据定义LASTVT(B)可使用如下规则:.若有产生式Ba或BaC,则aLASTVT(B);.若aLASTVT(C)且有产生式BC,则aLASTVT(B);方法二:使用一个布尔数组PB,a和一个栈Stack,CompilerPrinciples,32,33,具体算法描述如下:a.置P初值为FALSE;b.用规则1对PB,a初始化对每个非终结符B,若有形如Ba或BaC的产生式,则变PB,a的FALSE为TRUE,同时(B,a)进栈;c.只要Stack非空,则退栈。每退出一项(C,a)则检查是否有BC形式的产
15、生式,若有,则置PB,a为TRUE,直到栈空为止。当对所有的非终结符执行如上操作之后,我们就构造出了LASTVT集,即:LASTVT(B)=a|PB,a=TRUE,方法二:使用一个布尔数组PB,a和一个栈Stack,例:求非终结符的FISRTVT和LASTVT,GE E#E#EE+TE T TT*F T F F(E)F i,CompilerPrinciples,34,FIRSTVT(E)=#FIRSTVT(E)=+FIRSTVT(T)=+,*,(,i FIRSTVT(T)=*FIRSTVT(F)=*,(,i FIRSTVT(F)=(,i LASTVT(E)=#LASTVT(E)=+LASTVT
16、(T)=+,*,),iLASTVT(T)=*LASTVT(F)=+,*,),iLASTVT(F)=),i,5.2.3算符优先关系表的构造,CompilerPrinciples,35,通过检查每个产生式的候选式确定满足关系和的所有终结符对。ab 对形如Pab或PaQb 产生式;ab 对形如PaR产生式,则对任意bFIRSTVT(R),有ab 成立;ab 对形如PRb产生式,则对任意bLASTVT(R),有ab成立;,36,算法5.2:算符优先关系表的构造算法,输入:文法G及G的FIRSTVT(G)和LASTVT(G)输出:文法G的优先关系表方法:for 每条产生式PX1X2Xn for(i=1;
17、in;i+)if(Xi和Xi+1 均为终结符)XiXi+1;if(in-2且都Xi和Xi2为终结符,Xi1为非终结符)XiXi+2;if(Xi为终结符,Xi+1为非终结符)for FIRSTVT(Xi+1)中的每个a Xia;if(Xi为非终结符,Xi+1为终结符)for LASTVT(Xi)中的每个a aXi+1,例:求算符优先关系表,文法GE:EE+T|TTT*F|F FPF|P P(E)|i,CompilerPrinciples,37,FIRSTVT(E)=+FIRSTVT(T)=+,*,(,i FIRSTVT(T)=*FIRSTVT(F)=*,(,iFIRSTVT(F)=FIRSTVT
18、(P)=,(,i FIRSTVT(P)=(,i LASTVT(E)=+LASTVT(T)=+,*,),i,LASTVT(T)=*LASTVT(F)=,*,),iLASTVT(F)=LASTVT(P)=,),i LASTVT(P)=),i,注:表中的空白表示相对应的终结符对偶没有优先关系。,38,5.2.4算符优先分析算法,CompilerPrinciples,39,仅在终结符间定义优先关系。算符优先分析并没有对非终结符定义优先关系,所以也就无法对单个非终结符所组成的句柄进行归约。算符优先不属于规范规约,5.2.4算符优先分析算法,定义素短语:设G是一个算符文法,是句型 关于A的短语且至少含有一
19、个终结符号,并且除自身外不再含有任何更小的带终结符号的短语,则是句型关于A的素短语。最左素短语:处于文法G的句型的最左边的素短语为最左素短语。,最左素短语示例,例GE:EE+TT TT*FF F(E)i句型:T+T*F+i短语:T;T*F;T+T*F;i;T+T*F+i直接短语:T;T*F;i;句柄:T素短语:T*F;i最左素短语:T*F,最左素短语示例,例GE:EE+TT TT*FF F(E)i考察i*i?T?,i,i,素短语,43,由算符文法性质可知:句型记为:#N1a1 N2a2NnanNn+1#其中:ai都是终结符Ni是非终结符定理:算符优先文法G的任何句型的最左素短语是满足如下条件的
20、最左子串NjajNiaiNi+1 aj-1 ajaj aj+1,ai-1 aiai ai+1算符文法的任何句型中终结符和非终结符相邻时含终结符的短语必含相邻的非终结符,5.2.4算符优先分析算法,例5.7 设文法G()E ETTT T*F FF(E)I,CompilerPrinciples,44,算符优先分析器的总控程序,算法5.3 初始化。将“”压入栈,栈顶指针p1;当前输入符号=a;比较符号栈顶项 b(bVT)与a的优先级;若ba或 b=a转;若b a转;否则 error;a入栈(p+)转;/还没形成最左素短语,移进 在栈中寻找满足bn+1bnbn-1b1a的bn,即寻找 最左素短语的头;
21、将 bn bn-1 b1及有关的非终结符归约到,入栈;若栈中为S与a“”,则end,否则(a)=栈顶转;,CompilerPrinciples,45,CompilerPrinciples,46,文法GE:EE+T|TTT*F|F FPF|P P(E)|i试用算符优先分析法分析句子i+i*i,练习,例5.8 设有文法G(Z)和输入串b(aa)bZ bMbM(LaL Ma)文法G(Z)的优先关系表对句子a(c)b进行分析,CompilerPrinciples,47,CompilerPrinciples,48,步骤 符号栈 优先关系(a)输入字符串 动 作1 b(aa)b 初始化2 a)b 用Ma归
22、约6 b(M b 用LMa)归约9 b(L b 用M(L归约10 bM=b b进栈11 bMb 用ZbMb归约12 Z 分析成功,结束,49,注:a.归约并没指明应把找到的最左素短语归约到哪个非终结符N,只能是一棵语法树的架子b.由于忽略了对单非产生式的归约步骤,所以存在一种危险:可能把非法句子误认为是合法句子c.对一目运算符和三目运算符不太好处理,5.2.5优先函数的构造,为什么引入优先函数表引入优先函数表,是每个终结符仅对应两个优先函数,即栈内和栈外优先函数,则G的优先关系表的大小=2(n+1),且在分析中便于进行终结符之间的比较。,CompilerPrinciples,50,5.2.5优
23、先函数的构造,优先函数表引入两个优先函数f和g。其中f(),称为栈内优先函数,g()称为比较优先函数(栈外优先函数)。将每个终结符号与两个优先函数f()和 g()相对应,f(),g()自然数,则可有下列优先关系:若1 2,则 f(1)g(2);若1 2,则 f(1)g(2);若1 2,则 f(1)g(2)两种构造优先函数的方法:有向图(Bell)方法Floyd方法,CompilerPrinciples,51,5.2.5优先函数的构造,CompilerPrinciples,52,对每个终结符a(包括),令其对应两个符号fa和ga,画一张以所有fa、ga为结点的方向图。ab,画一条从fa到gb的弧
24、ab,画一条从gb到fa的弧对每个结点都赋予一个数,此数等于从该结点出发所能到达结点的个数。赋给fa的数作为f(a),赋给gb的数作为g(b)。把以上构造出的f和g同原来的优先表相对照,看是否有矛盾。若无,则f,g即为所求;若有矛盾,则说明并无优先函数存在。,(1)有向图(Bell)方法,5.2.2.算符优先文法的定义,例5.5 设文法G:S aSb|ab试构造文法G(S)的优先函数表。,53,fa fbga gb,(2),(3),(3),(2),检查构造的优先函数:对aa,f(a)g(a)有23;对ab,f(a)g(b)有22;对bb,f(b)g(b)有32;因此,优先函数存在。,54,gi
25、,fi,f*,g*,g+,f+,f#,g#,例如文法GE:EE+TTTT*FFFi,优先关系表并非与优先函数表一一对应,CompilerPrinciples,55,如果假定存在函数 f 和 g,则应有:f(a)g(a),f(a)g(b)f(b)g(a),f(b)g(b)按此假设f(a)g(b)f(b)g(a)f(a)=f(a)f(a),矛盾!,结论:若从优先关系表构造出的有向图中有环路,则优先函数不存在,CompilerPrinciples,56,文法GE:EE+T|TTT*F|F FPF|P P(E)|i,(2)对前面给出的优先表可以画出如下的有向图,并构造出相应的优先函数:(为简单计省去了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法分析 向上
链接地址:https://www.31ppt.com/p-6609157.html