收藏 分享(赏)

山东理工大学-编译原理内部课件-第六章:自底而上语法分析.ppt

上传人:yjrm16270 文档编号:8924171 上传时间:2019-07-17 格式:PPT 页数:49 大小:2.12MB
下载 相关 举报
山东理工大学-编译原理内部课件-第六章:自底而上语法分析.ppt_第1页
第1页 / 共49页
山东理工大学-编译原理内部课件-第六章:自底而上语法分析.ppt_第2页
第2页 / 共49页
山东理工大学-编译原理内部课件-第六章:自底而上语法分析.ppt_第3页
第3页 / 共49页
山东理工大学-编译原理内部课件-第六章:自底而上语法分析.ppt_第4页
第4页 / 共49页
山东理工大学-编译原理内部课件-第六章:自底而上语法分析.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

1、2019/7/17,1,第6章 自底而上优先分析,引言 简介 相关概念 自下而上分析基本问题 归约 规范归约 算符优先分析 算符优先关系表的构造和分析过程 小结 作业,课程目录,2019/7/17,2,引 言,自下而上分析简介 相关概念 短语、直接短语和句柄 素短语和最左素短语 利用语法树寻找短语、句柄的方法,章节目录,2019/7/17,3,自下而上分析简介,文法G: EE+T|T TT*F|F F(E)|i,输入串:w=i*i+i,最 右 推 导,E,E,+,T,F,i,T,T,*,F,i,F,i,最 左 归 约,E=E+T,=E+F,=E+i,=T*F+i,=T*i+i,=F*i+i,=

2、i*i+i,=T+i,输入串最终能归约到 开始符号,说明输入串是 文法的一个句子,分析成 功结束。,2019/7/17,4,自下而上分析基本思想 p102,从输入串出发,逐步进行归约,直至归约 到文法的开始符号,那么输入串是文法的 句子,否则输入串有语法错误 或者说,从语法树的末端开始,步步向上 归约,修剪语法树,直到只剩根结点 归约用产生式的左部替代右部 关键寻找每步句型中可归约串寻找方式不同,分析方法不同 效率更高,对语法限制更少,节目录,2019/7/17,5,相关概念, ,短语 若=*,且A=+,则称是句型相对于非终结符号A的短语。,节目录,直接短语 若* 且 A ,则称是句型 相对于

3、非终结符号A的直接短语。,句柄 一个句型的最左直接短语。,2019/7/17,6,素短语 最左素短语p115,句型E+T*i的最左素短语是:i,句型E+T*i的短语有三个:E+T*i T*i i,其中:i是句型E+T*i的素短语,T*i不是句型E+T*i的素短语,E+T*i不是句型E+T*i的素短语,不满足条件(3),包含素短语i,不满足条件(3),包含素短语i,素短语 (1)是一个短语 (2)至少包含一个终结符 (3)且除自身外不再包含其它素短语,最左素短语 处于句型最左边的素短语,节目录,2019/7/17,7,利用语法树寻找句型的短语、句柄等,句型=E+T*i,寻找方法,句型的语法树有:

4、,n棵子树n个短语,m棵直接子树m个直接短语,最左直接子树句柄,3个短语,1个直接短语,i,句柄,i,E+T*i,T*i,i,只有父子两代,素短语 i,最左素短语 i,n个内部节点n棵子树,每颗子树的叶结点从左至右排列组成一个短语,2019/7/17,8,利用语法树寻找短语、句柄举例,句型 =T+T*F+i 的语法树,例 文法GE: EE+T|T TT*F|F F(E)|i,E,E + T,F,i,E + T,T * F,T,句型有6个短语:,T+T*F+i 是句型相对于E1的短语 T+T*F 是句型相对于E2的短语 T 是句型相对于E4的短语 T*F 是句型相对于T5的短语 i,i 是句型相

5、对于T3,F6的短语,3个直接短语:,T,T*F,,i,句柄:,T,2个素短语:,T*F,,i,最左素短语:,T*F,6个内部节点6棵子树,2019/7/17,9,利用语法树寻找短语、句柄课堂练习,句型 =i1*i2+i3 的语法树,8个内部节点 8棵子树 句型有8个短语: i1*i2+i3是句型相对于E1的短语 i1*i2是句型相对于E2 ,T4的短语 i1是句型相对于T6 ,F8的短语 i2是句型相对于F7的短语 i3是句型相对于T3,F5的短语,例 文法GE: EE+T|T TT*F|F F(E)|i,直接短语,3个: i1, i2,i3,句柄:i1,素短语3个:i1,i2,i3,最左素

6、短语: i1,节目录,BEGIN,2019/7/17,10,自下而上分析基本问题,归约与移进归约法 规范推导与规范归约 移进归约分析器 要解决的基本问题?,章节目录,2019/7/17,11,归约与移进归约法,归约 推导的逆过程 当是文法的一个产生式,且、*,则能直接归约到 例如 E+T=E+T*F,那么E+T*F可以归约到E+T 移进归约法 把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,就把栈顶的这一可归约串替换成(归约为)该产生式的左部符号 归约举例,2019/7/17,12,移进归约法举例,例文法GS SaAcBe AAb|b Bd,输入串为:abbcde,S,a,A

7、,c,B,e,d,A,b,b,步骤 栈 输入缓冲区 动作,0 # abbcde#,1 #a bbcde#,2 #ab bcde#,3 #aA bcde#,4 #aAb cde#,5 #aA cde#,6 #aAc de#,7 #aAcd e#,8 #aAcB e#,9 #aAcBe #,10 #S #,分析成功结束,移进a,移进b,归约 Ab,移进b,归约 AAb,移进c,移进d,归约 Bd,移进e,归约SaAcBe,接受,栈中串+余留输入串=当前句型,栈顶可归约串 =当前句型的句柄,语法树,分析过程,说明,最右推导:S,=aAcBe,=aAcde,=aAbcde,=abbcde,右句型中句柄

8、的后面只能出现终结符,修剪语法树,当前句型的句柄,2019/7/17,13,语法分析树的生成(输出),a b b c d e,A,A,B,S,1.Ab,2.AAb,3.Bd,4.SaAcBe,例文法GS: SaAcBe AAb|b Bd,产生式序列: 1.Ab 2.AAb 3.Bd 4.SaAcBe,节目录,2019/7/17,14,规范推导与规范归约,规范推导最右推导 规范句型如果文法G无二义性,由规范推导所得的句型(也称为右句型) 规范归约规范推导的逆过程,即最左归约 规范归约的实质在移进过程中,当发现栈顶呈现句柄时就用相应产生式的左部符号进行替换 对于规范句型来说,句柄的后面不会出现非终

9、结符,只能出现终结符,节目录,2019/7/17,15,移进归约分析器,i i #, #,移进归约 控制程序,产生式序列,栈内容 + 输入缓冲区内容 # 句型 # 分析过程中 符号栈 输入串 初态 # w # 终态 #S # 分析成功,分 析 栈,输入缓冲区,2019/7/17,16,移进归约分析器的四种动作,移进把输入串的一个符号移进栈 归约发现栈顶呈现可归约串,将0个或多个符号从栈中弹出,将相应产生式左部的非终结符压入栈 接受宣布最终分析成功 出错发现栈顶内容与输入串相悖,分析工作无法正常进行,此时需要调用出错处理程序进行诊察和校正,并对栈顶内容和输入符号进行调整,2019/7/17,17

10、,i1*i2+i3的分析,例 文法GEEE+T|T TT*F|F F(E)|i,步骤 栈 输入缓冲区 动作,0 # i1*i2+i3#,1 #i1 *i2+i3#,2 #F *i2+i3#,3 #T *i2+i3#,4 #T* i2+i3#,5 #T*i2 +i3#,6 #T*F +i3#,7 #T +i3#,8 #E +i3#,9 #E+ i3#,10 #E+i3 #,预备,移进 i1,归约 Fi,归约 TF,移进 *,移进 i2,归约 Fi,归约 TT*F,归约 ET,移进 +,移进 i3,11 #E+F #,12 #E+T #,13 #E #,14,归约 Fi,归约 TF,归约 EE+T

11、,接受,分析过程中所用 产生式序列即可 表示语法分析的输出语法树,2019/7/17,18,对输入串规范归约的分析步骤,当栈中的符号的栈顶部分还不能形成句柄 时,进行移入操作 一旦发现栈顶部分形成了句柄的时候,对 该句柄进行归约。将句柄出栈,然后将归 约得到的非终结符号入栈 如果输入是句子,则栈中的符号(从底到 顶)和输入缓冲区剩余符号组成句型,2019/7/17,19,i1+i2*i3的课堂练习,例 文法GE EE+T|T TT*F|F F(E)|i,步骤 栈 输入缓冲区 动作 BEGIN,0 # i1+i2*i3#,1 #i1 +i2*i3#,2 #F +i2*i3#,3 #T +i2*i

12、3#,4 #E +i2*i3#,5 #E+ i2 *i3#,6 #E+i2 *i3#,7 #E+F *i3#,8 #E+T *i3#,9 #E+T* i3#,10 #E+T*i3 #,预备,移进 i1,归约 Fi,归约 TF,归约 ET,移进 +,移进 i2,归约 Fi,归约 TF,移进 *,移进 i3,11 #E+T*F #,12 #E+T #,13 #E #,14,归约 Fi,归约 TT*F,归约 EE+T,接受,E+T不是当前句型 的句柄,不能归 约,继续移进,归约 8次 规范归约,节目录,2019/7/17,20,要解决的基本问题,如何找出能够进行直接归约的“可归约串”? 将找到的“可

13、归约串”归约到哪个非终结符号? 如何决定什么时候移进,什么时候归约?,节目录,2019/7/17,21,6.3 算符优先分析 p106,算符优先分析简介 相关定义 算符文法 算符优先关系 算符优先文法 算法优先关系表 算符优先关系表的构造 FRISTVT集合和LASTVT集合的计算 算符优先分析算法 小结,章节目录,2019/7/17,22,算符优先分析简介,是一种自下而上的语法分析法 优点:简单、有效、易于手工实现 借助于定义算符之间的某种优先关系,寻找“可归约串”进行归约 特别有利于表达式的分析,但只适合于一类不大的文法算法优先文法 例如:E+T*F 只需要知道*的优先级高于+,就可以知道

14、T*F是“可归约串” 广义讲,文法中终结符号即为算符,节目录,举例:i+i*i,2019/7/17,23,算法优先分析的相关定义,算符文法 算符优先关系 算符优先文法 算法优先关系表,节目录,2019/7/17,24,算符文法 OGOperater Grammer p107,定义:如果文法中不存在 PQR的产生式,其中Q,RVN ,则称G为算符文法 特点:文法G中任一产生式右部不含两个非终结符 相邻的情况 举例,G1(E): EEAE|(E)|i A+|*,G1不是OG,改造为 G1(E): EE+E|E*E|(E)|i,G1是OG,文法G(E):EE+T|TTT*F|FF(E)|i,G是OG

15、,小节目录,2019/7/17,25,算符优先关系,终结符a和b之间三种优先关系的表示 a b a 的优先级高于 b 如果a,b存在优先关系,则a,b是在句型中为相邻的一对终结符,且a一定在b左边,2019/7/17,26,算符优先关系a=b p108,设G为不含产生式的OG,对于任何a、bVT,P、Q、RVN,定义: a = b 当且仅当G中含有形如Pab 或PaQb的产生式,其中=或Q,因a,b同时归约,故 a与b优先级相同,( = ),注意:若a,b存在优先关系,则a,b在句型中为相邻的一对终结符,且a一定位于b的左边,2019/7/17,27,算符优先关系ab p108,a b 或 R

16、=+Qb,其中=或Q,因 b先于a被归约故 a优先级低于b,b是由R能推出的首遇终结符,+ *,* i,2019/7/17,28,算符优先关系ab p108,a b 当且仅当G中含有形如PRb的 产生式,而 R=+a 或 R=+aQ,其中=或Q,因 a先于b被归约 故 a优先级高于b,a是由R能推出的终遇终结符,* +,i *,小节目录,2019/7/17,29,算符优先文法 p109,定义 如果不含产生式的算符文法中,若任意 两个终结符之间至多有一种优先关系存在,则称G为算符优先文法 OPG Operator Precedence Grammar 注意 允许bc,cb 例 +-,-+ 不允许

17、bc,ba或S=+Ra,则 #a或S=+aR,则 a#,小节目录,2019/7/17,30,算符优先关系表,定义 一个算符优先文法G的终结符之间的优先关系可以用一个矩阵来表示,该矩阵称为该文法的优先关系表 用矩阵M表示优先关系表,其中 (1) a,bVT或#。(2) 若a与#存在优先关系,则有M(#,a)=,M(a,b)=, 当ab 当ab = 当a=b 空白 其它(a与b的匹配有错误),2019/7/17,31,表达式文法的算符优先关系表 p111表6.5,算符优先文法可以保证优先关系表不含多重入口(1)相同终结符之间未必是= 例 +,*(2)如果有aa 例 +),而)+(3)a,b之间未必

18、一定存在优先关系 例如i与i, )与(,不可能相邻 (与#,#与),括号不匹配,b 所面临的输入符号,小节目录,2019/7/17,32,算符优先关系表的构造,FRISTVT集合和LASTVT集合的定义 FRISTVT集合和LASTVT集合的计算 算符优先关系表的构造 构造算法 举例,节目录,2019/7/17,33,FIRSTVT和LASTVT集合的定义 p109,关于文法G中的每个非终结符P:FIRSTVT(P)=a| P+a,或者P+Qa,aVT且QVN 含义:由P往下推导所有可能出现的首个终结符例如:有F(E)|i ,则(,iFIRSTVT(F)有EE+T,则EE+T,+FIRSTVT

19、(E),LASTVT(P)=a|P+a,或者P+aQ, aVT且Q VN含义:由P往下推导所有可能出现的最后一个终结符例如:有 F(E)|i ,则),iLASTVT(F) 有EE+T,则EE+T,+LASTVT(E),2019/7/17,34,如何计算算符优先关系 p109-110,= 关系直接看产生式的右部,若出现了Aab或 AaPb,则a=b关系若 APb,则a LASTVT(P),ab,小节目录,2019/7/17,35,集合FIRSTVT(P)的算法 p111,连续使用下面两条规则,直到FIRSTVT(P)不再扩大为止 若有 Pa或PQa ,则aFIRSTVT(P) 若aFIRSTVT

20、(Q),且有PQ,则aFIRSTVT(P) 即FIRSTVT(Q)加入FIRSTVT(P),文法GE:E#E#EE+T|T TT*F|F F(E)|i,FIRSTVT(E)= # ,FIRSTVT(F)=(,i,FIRSTVT(T)=*,(,i,FIRSTVT(E)=+,*,(,i,2019/7/17,36,集合LASTVT(P)的算法,连续使用下面两条规则,直到LASTVT(P)不再扩大为止 若有 Pa或PaQ ,则aLASTVT(P) 若aLASTVT(Q),且有 PQ ,则aLASTVT(P) 即把LASTVT(Q)中加入LASTVT(P)中,文法GE:E#E#EE+T|T TT*F|F

21、 F(E)|i,LASTVT(E)= # ,LASTVT(F)=),i,LASTVT(T)=*,),i,LASTVT(E)=+,*,),i,2019/7/17,37,计算FIRSTVT(P)和LASTVT(P)课堂练习,FIRSTVT(E)=# FIRSTVT(P)=(,i FIRSTVT(F)=,(,i FIRSTVT(T)=*,(,i FIRSTVT(E)=+,*,(,i,文法G为: E#E# EE+T|T TT*F|F FPF|P P(E)|iBEGIN,LASTVT(E)=# LASTVT(P)=),i LASTVT(F)=,),i LASTVT(T)=*,),i LASTVT(E)=

22、+,*,),i,小节目录,2019/7/17,38,算符优先表的构造算法,计算每个非终结符P的FIRSTVT(P)和LASTVT(P) 确定算符的优先关系,构造文法的算符优先表 若有Aab或 AaPb,则a=b 若有AaP,对b FIRSTVT(P),则ab 把所有无定义的M(a,b)标上“出错标志”,2019/7/17,39,优先表构造举例,拓广GE (0)E#E# (1)EE+T (2)ET (3)TT*F (4)TF (5)F(E) (6)Fi,FIRSTVT(E)=# FIRSTVT(E)=+,*,(,i FIRSTVT(T)=*,(,i FIRSTVT(F)=(,i LASTVT(E

23、) =# LASTVT(E)=+,*,),i LASTVT(T)=*,),i LASTVT(F)=),i,1)=关系 (0)#=# (5)(=),=,=,2) 关系 找形如:AaP,(0)#E,则#FIRSTVT(E),(1)+T,则+FIRSTVT(T),(3)*F,则*FIRSTVT(F),(5)(E,则(FIRSTVT(E),3) 关系 找形如:APa,(0)E#,则LASTVT(E)#,(1)E+,则LASTVT(E)+,(3)T*,则LASTVT(T)*,(5)E),则LASTVT(E),4)表中的空白格表示相应终结符对没有优先关系,小节目录,2019/7/17,40,算符优先分析算

24、法 p114,算符优先分析举例 算符优先分析的动作 算符优先分析算法 算符优先分析与规范归约的差异,节目录,2019/7/17,41,i1*i2+i3的分析过程,例 文法GEEE+T|T TT*F|F F(E)|i,步骤 栈a 输入串b 动作,1 # i*i+i# #i,移进i,2 #i *i+i# i*,归约 Fi,3 #F *i+i# #*,移进*,4 #F* i+i# *i,移进i,5 #F*i +i# i+,归约 Fi,6 #F*F +i# *+,归约 TT*F,7 #T +i# #+,移进+,8 #T+ i# +i,移进i,9 #T+i # i#,归约 Fi,10 #T+F # +#

25、,归约 EE+T,11 #E # #=#,接受,结构归约,2019/7/17,42,算符优先分析中可归约串 p114,对于算符优先文法,句型的一般形式为:# N1 a1 N2 a2 Nn an Nn+1 #其中ai 是终结符,Ni是可有可无的非终结符,任何两个终结符之间至多有一个非终结符 一个算符优先文法G的任何句型的最左素短语是满足如下条件的最左子串Njaj Niai Ni+1 :aj-1 ai+1 例如 句型 #i+i*i#因为 #+ 所以 i是最左素短语,小节目录,2019/7/17,43,算符优先分析动作,移进 当栈顶终结符 或 当前输入符号时 归约 当栈顶终结符 当前输入符号时,在栈

26、中寻找最左素短语进行归约 接受 当栈顶终结符当前输入符号# 时,分析成功结束 出错 当栈顶终结符与当前输入符号没有优先关系时,2019/7/17,44,i1+i2*i3的课堂练习,例 文法GEEE+T|T TT*F|F F(E)|i,步骤 栈a 输入串b 动作 BEGIN,1 # i+i*i# #i,移进i,2 #i +i*i# i+,归约 Fi,3 #F +i*i# #+,移进+,4 #F+ i*i# +i,移进i,5 #F+i *i# i*,归约 Fi,6 #F+F *i# +*,移进*,7 #F+F* i# *i,移进i,8 #F+F*i # i#,归约 Fi,9 #F+F*F # *#

27、,归约TT*F,10 #F+T # +#,归约 EE+T,11 #E # #=#,接受,归约 5次 结构归约,小节目录,2019/7/17,45,算符优先分析算法,把句型的最左素短语归约到一个非终结符,该非终结符是一个产生式的左部符号,此产生式的右部和最左素短语构成如下一一对应关系:自左至右,终结符对终结符,非终结符对非终结符,对应的终结符相同,对应的非终结符可以不相同结构归约 非规范归约:不是严格的最左归约 算符优先分析跳过了所有单个非终结符产生式所对应的归约步骤 8次5次,2019/7/17,46,算符优先分析算法实现 p114,k:=1;Sk:=# REPEAT把下一个输入符号读进a中;

28、 IF SkVT THEN j:=k ELSE j:=k-1; WHILE Sja DOBEGINREPEAT Q:=Sj;IF Sj-1VT THEN j:=j=1 ELSE j:=j-2;UNTIL SjQ; 把Sj+1Sk归约为某个N;k:=j+1;Sk:=N;END OF WHILE;IF Sja OR Sj=a THENBEGIN k:=k+1;Sk:=a ENDELSE ERROR UNTIL a=#,小节目录,栈顶指针、符号栈置初值 取栈顶终结符栈顶终结符优于输入符号进行归约寻找素短语 当前栈顶终结符Sk保存到变量Q寻找栈中下一终结符栈中终结符Sj低于Q,则找到最左素短语归约最左素短语Sj+1Sk归约后的栈顶指针 归约后的栈顶归约动作结束栈顶终结符低于或相同于输入符号将输入符号移进栈栈顶终结符与输入符号不能匹配,出现语法错误,失败退出输入串结束,分析过程成功退出,2019/7/17,47,算符优先分析与规范归约的差异,算符优先分析的语法树,规范归约的语法树,小节目录,2019/7/17,48,算符优先分析小结,优点 简单、效率高 能够处理部分二义性文法 缺点 文法书写限制大 占用内存空间大 不规范、存在查不到的语法错误,节目录,2019/7/17,49,作业 p122,1 (1)(2)(4) 必做 (3)优先函数 选作 2 4,章节目录,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报