编译原理 课件 第三章 语法分析3.ppt
《编译原理 课件 第三章 语法分析3.ppt》由会员分享,可在线阅读,更多相关《编译原理 课件 第三章 语法分析3.ppt(114页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、3.4 3.4 自下而上语法分析自下而上语法分析本节要求本节要求1.掌握自下而上语法分析的基本思想和基掌握自下而上语法分析的基本思想和基本概念本概念2.了解算符优先语法分析了解算符优先语法分析3.掌握句柄的定义与判定掌握句柄的定义与判定4.理解规范归约的过程和理解规范归约的过程和LR分析过程中的分析过程中的实现实现5.掌握掌握LR语法分析的实现过程语法分析的实现过程【例例】回顾:回顾:一个简单的归约过程一个简单的归约过程 设文法为:设文法为:SaAcBeSaAcBeAAb|bAAb|bBdBdA Aa b b c d ea b b c d eB BA AS S自下而上自下而上自下而上自下而上构
2、造语法构造语法构造语法构造语法树的过程树的过程树的过程树的过程句子分析:句子分析:句子分析:句子分析:a a a ab b b bbcdebcdebcdebcdea a a aA A A Ab b b bcdecdecdecdea a a aA A A Ac c c cd d d de e e e aAcaAcaAcaAcB B B Be e e e S S S S对应的是最右推导对应的是最右推导注意:每次归约的是句柄注意:每次归约的是句柄3.4.1自下而上语法分析的原理自下而上语法分析的原理实现思想实现思想从从输输入入符符号号串串开开始始,从从左左到到右右进进行行扫扫描描,将将输输入入符符号
3、号逐逐个个移移入入一一个个栈栈中中,边边移移入入边边分分析析,一一旦旦栈栈顶顶符符号号串串形形成成某某个个产产生生式式的的右右部部时时,就就用用该该产产生生式式的的左左部部非非终终结结符符代代替替,称称为为归归约约。重重复复这这一一过过程程,直直到到归归约约到到栈栈中中只只剩剩下下文文法法的的开开始始符符号号时时,则则分分析析成成功功,称称为为“移移进进-归归约约”方方法法。从从语语法法树树的的角角度度看看:从从语语法法树树的的树树叶叶开开始始,逐逐步步向向上上归归约约构构造造分分析析树树,直直到到形形成成根根结结点点。是是推导推导的逆过程的逆过程。“移移进进-归约归约”分析法分析法移进移进-
4、归约分析器使用了一个分析栈和一个输入缓冲区。归约分析器使用了一个分析栈和一个输入缓冲区。1、句型表示、句型表示a1a2a3#X1X2X3#“移进-归约”分析程序输出栈(存放句型前缀)输入串即:分析栈内容即:分析栈内容+输入缓冲区内容输入缓冲区内容#当前句型当前句型#一般形式一般形式分析栈的内容分析栈的内容剩余输入串剩余输入串初态:初态:#输入串输入串#终态:终态:#S#2、分析器结构分析器结构、“移进移进-归约归约”分析法的栈实现分析法的栈实现“移进移进归约归约”分析器使用一个栈和一个存放输分析器使用一个栈和一个存放输入符号串入符号串w w的缓冲器。分析器的初始状态为的缓冲器。分析器的初始状态
5、为:栈栈输入输入w w工作过程:工作过程:自左至右把串自左至右把串ww的符号一一移进栈里,一的符号一一移进栈里,一旦栈顶形成可归约的串(如旦栈顶形成可归约的串(如句柄句柄)时,就进行归约。)时,就进行归约。这种归约可能持续多次,直至栈顶不再呈现句柄为止。这种归约可能持续多次,直至栈顶不再呈现句柄为止。然后,继续向栈里移进符号,重复这个过程,直至最然后,继续向栈里移进符号,重复这个过程,直至最终形成如下格局:终形成如下格局:栈栈输入输入SS分析栈分析栈输入串输入串动作动作【例例】文法文法GS:SaAcBeAb AbBd待分析的句子为:待分析的句子为:待分析的句子为:待分析的句子为:abbcdea
6、bbcde#abbcde#移进移进#abbcde#移进移进#abbcde#归约归约Ab#aAbcde#移进移进分析栈分析栈输入串输入串动作动作cde#aAcde#移进移进#aAcde#归约归约Bd#aAcde#移进移进#aAb归约归约AAb#aAcBe#移进移进#aAcBe#归约归约SaAcBe#S#接受接受小结小结 分析器的四种动作分析器的四种动作1)1)移进移进:读入下一个输入符号并把它下推进栈。:读入下一个输入符号并把它下推进栈。2)2)归约归约:当栈顶符号串形成一个可归约的串(如:当栈顶符号串形成一个可归约的串(如:句柄句柄)时,直接进行归约,即用产生式左侧的非终结符替换栈时,直接进行
7、归约,即用产生式左侧的非终结符替换栈顶的句柄。顶的句柄。3)3)接受接受:当栈底只有:当栈底只有“#”#”和开始符号,而输入也已经到和开始符号,而输入也已经到达右端标志符号达右端标志符号“#”#”时,识别出符号串是句子,执行时,识别出符号串是句子,执行该动作,表示分析成功,是归约的一种特殊情况。该动作,表示分析成功,是归约的一种特殊情况。4)4)出错出错:栈顶的内容与输入符号相悖,即当识别程序发现栈顶的内容与输入符号相悖,即当识别程序发现输入符号串不是句子时,进行出错处理。输入符号串不是句子时,进行出错处理。注意:决定移进和归约的依据是什么?注意:决定移进和归约的依据是什么?栈顶是否出现了可归
8、约的符号串。栈顶是否出现了可归约的符号串。关键:关键:如何识别可归约的符号串?如何识别可归约的符号串?通过不同的自下而上的通过不同的自下而上的分析算法分析算法来解释,不同来解释,不同的算法的算法对可归约串的定义是不同的对可归约串的定义是不同的,但分析过,但分析过程都有一个共同的特点:程都有一个共同的特点:边移进边归约边移进边归约。规范归约:使用规范归约:使用句柄句柄来定义可归约串来定义可归约串算符优先:使用算符优先:使用最左素短语最左素短语来定义可归约串来定义可归约串自下而上语法分析主要有以下三种方法自下而上语法分析主要有以下三种方法简单优先分析法简单优先分析法(规范归约规范归约)文法按文法按
9、一定原则规定文法符号的优先关系。一定原则规定文法符号的优先关系。算符优先分析法算符优先分析法(非规范归约非规范归约)规定规定算符算符之间的优先关系。之间的优先关系。LR分析法(规范归约)分析法(规范归约)LR(0)、LR(1)、SLR(1)和和LALR(1)。规范归约相关概念复习有文法有文法G G,开始符号为开始符号为S,S,如果有如果有S=xy,S=xy,则则xyxy是是文法文法G G的的句型句型,x,yx,y是任意的符号串。是任意的符号串。如果有如果有S=S=xAyxAy,且有且有A=,A=,则则是句型是句型xyxy相对于相对于非终结符非终结符A A的的短语。短语。如果有如果有S=S=xA
10、yxAy,且有且有AA,则则是句型是句型xyxy相对相对于于AA的的直接短语。直接短语。位于一个句型最左边的直接短语称为位于一个句型最左边的直接短语称为句柄。句柄。句型句型短语短语直接短语直接短语句柄句柄*+*注注:采用规范归约的算法,每次归约的部分就是分析为采用规范归约的算法,每次归约的部分就是分析为句柄句柄的字符串的字符串。因此,在规范归约中,因此,在规范归约中,关键问题就转化为关键问题就转化为如何识别句柄如何识别句柄?练习练习有文法如下有文法如下:(1)EE+T|T(2)TT*F|F(3)F(E)|id分析输入串分析输入串id+id*id,给出对该句子进行,给出对该句子进行“移移进进-归
11、约归约”语法分析的过程。语法分析的过程。栈栈 输入缓冲区输入缓冲区 动作动作#id+idid+id*id#*id#移进移进#id +id*id#id +id*id#归约归约 FidFid#F +id*id#F +id*id#归约归约 TF TF#T +id*id#T +id*id#归约归约 ET ET#E +id*id#E +id*id#移进移进#E+id*#E+id*idid#移进移进#E+idE+id *id#*id#归约归约FidFid#E+F *id#E+F *id#归约归约 TF TF#E+T *id#E+T *id#移进移进#E+T*id#E+T*id#移进移进#E+T*id#E+
12、T*id#归约归约 FidFid#E+T*F#E+T*F#归约归约 TT*F TT*F#E+T#E+T#归约归约 EE+T EE+T#E#E#接受接受(1)EE+T|T(2)TT*F|F(3)F(E)|ididid1 1+id+id2 2 *id *id3 3FTEFTFTEE=E+T=E+T*F=E+T*id=E+F*id=E+id*id=T+id*id=F+id*id=id+id*id移进归约分析过程中存在的问题移进归约分析过程中存在的问题移进移进-归约冲突归约冲突 在分析到某一步时,既可以移进,又可以归约。在分析到某一步时,既可以移进,又可以归约。上例第上例第9)9)步可以移进步可以移进
13、*,也可以按产生式,也可以按产生式EE+TEE+T进行归约。进行归约。归约归约-归约冲突归约冲突存在存在两个两个可选的句柄可对栈顶符号进行归约。可选的句柄可对栈顶符号进行归约。例如上述第例如上述第12)12)步,可以用步,可以用TFTF进行归约,又可进行归约,又可以按以按TT*FTT*F进行归约。进行归约。各种分析方法中处理冲突的技术不同!各种分析方法中处理冲突的技术不同!3.4.2算符优先分析法算符优先分析法算符优先分析法的算符优先分析法的思想思想源于表达式的分析,利用相邻终源于表达式的分析,利用相邻终结符号之间的关系来寻找可归约串。结符号之间的关系来寻找可归约串。将句型中的终结符号当作将句
14、型中的终结符号当作“算符算符”,借助于算符之间的,借助于算符之间的优先关系确定句型的优先关系确定句型的“可归约串可归约串”。在一个符号串中,任意两个相邻终结符号在一个符号串中,任意两个相邻终结符号a和和b之间,只之间,只可能存在以下四种可能存在以下四种优先关系优先关系:(1)a,b优先性相同,记作优先性相同,记作ab。(2)a优先性高于优先性高于b,记作记作ab。(3)a优先性低于优先性低于b,记作记作ab。(4)a与与b不可能相邻,即此符号串不是句型不可能相邻,即此符号串不是句型(出错出错)。如果以上四种关系中的任意两种都不会同时成立,则可如果以上四种关系中的任意两种都不会同时成立,则可以根
15、据终结符号之间的归约关系进行语法分析。以根据终结符号之间的归约关系进行语法分析。注意:注意:注意:注意:在整个归约过程中起决定作用的是相继两个终结在整个归约过程中起决定作用的是相继两个终结符的符的优先关系优先关系。1、算符文法算符文法:一个上下无关文法一个上下无关文法G,如果没有如果没有P,且没有且没有P.QR.(P,Q,R属于非终结符属于非终结符),则则G是一个是一个算符文法。算符文法。2、算符优先关系算符优先关系的定义:假定的定义:假定GS是一个不含是一个不含 产生式的产生式的算符文法,对于任何一对终结符算符文法,对于任何一对终结符a和和b,有:,有:ab,当且仅当,当且仅当GS中有中有P
16、.ab.或或P.aQb.的产的产生式生式(在同一产生式中在同一产生式中)ab,当且仅当,当且仅当GS中有中有P.aR.的产生式的产生式,且且R=b.或或R=Qb.(注意注意ab相邻相邻)ab,G中有中有P.Rb.的产生式的产生式,且且R=.a或或R=.aQ(注意注意ab相邻相邻)算符优先文法算符优先文法+【例例】有文法有文法GE:EE+E|E*E|(E)|i证明该文法不是算符优先文法。证明该文法不是算符优先文法。因为:因为:EE+E,EE*E则有则有+*又因为:又因为:EE*E,EE+E则有则有+*所以不是算符优先文法。所以不是算符优先文法。3.算符优先文法算符优先文法算符文法算符文法G的任何
17、终结符的任何终结符a,b之间可能没有优之间可能没有优先关系,若有优先关系先关系,若有优先关系,至多有至多有中的一种成立中的一种成立,则则G为一算符优先文法。为一算符优先文法。算符优先关系表算符优先关系表的构造的构造用表格形式来表示各终结符号的优先关用表格形式来表示各终结符号的优先关系,这种表称为系,这种表称为优先表优先表。构造优先关系表的方法构造优先关系表的方法按照定义手工计算按照定义手工计算使用算法使用算法由F(E)得(=)T=i,得+T*F,得+(E),得+i,得i +E=E+T,得+E=T*F,得*+E=(E),得)+*i()#+*i()#【例例】文法文法GE:EE+T|T TT*F|F
18、 F(E)|i求其算符优先表。求其算符优先表。终结符+#终结符+#对于结束符对于结束符#和其它终结符和其它终结符a有关系有关系:#*GE的算符优先关系表:的算符优先关系表:在优先表中,在优先表中,空白部分空白部分是一种错误关系。是一种错误关系。相同的相同的终结符之间的优先关系不一定是。终结符之间的优先关系不一定是。如果有如果有a b,a b,不一定有不一定有b a(b a(不具传递性不具传递性),因为算符优先只定义了相邻运算符之间的优因为算符优先只定义了相邻运算符之间的优先关系。当先关系。当a,b相邻时,不一定相邻时,不一定b,a相邻。相邻。a,b之间之间未必有未必有优先关系优先关系、和。、和
19、。说明1、FIRSTVT集合集合定义:定义:对每个非终结符对每个非终结符P,FIRSTVT(P)=a|P=a.或或P=Qa.,aVT,QVN+按照下面两条按照下面两条规则规则来来构造构造FIRSTVT集合:集合:若有产生式若有产生式Pa.或或PQa.,则,则aFIRSTVT(P)。若有产生若有产生式式PR.,且有,且有aFIRSTVT(R),则,则aFIRSTVT(P)中。中。2、LASTVT集合集合定义:定义:LASTVT(P)=a|P=.a或或P=.aQ,aVT,QVN+按照下面两条按照下面两条规则规则来来构造构造LASTVT集合:集合:若有产生式若有产生式P.a或或P.aQ,则,则aLA
20、STVT(P)。若有产生若有产生式式P.R,且有,且有aLASTVT(R),则,则aLASTVT(P)。3 3、构造优先关系表、构造优先关系表如果每个非终结符的如果每个非终结符的FIRSTVT和和LASTVT集均已知集均已知,则则可构造优先关系表可构造优先关系表。若产生式右部有若产生式右部有.aR.的形式的形式,则对于每则对于每个个bFIRSTVT(R)都有都有ab。若产生式右部有若产生式右部有.Rb的形式的形式,则对于每个则对于每个aLASTVT(R)集集,都有都有ab。若产生式形如若产生式形如Pab或或PaQb形式,则有形式,则有ab。【例例3.11】文法文法GE:EE+T|T TT*F|
21、F F(E)|i试构造其算符优先表。试构造其算符优先表。、构造、构造FIRSTVT集。集。(1)根据规则根据规则可知:可知:由由EE+得得FIRSTVT(E)=+;由由TT*得得FIRSTVT(T)=*;由由F(和和Fi得得FIRSTVT(F)=(,i;(2)根据规则根据规则可知:可知:由由FIRSTVT(F)=(,i和和TF得得FIRSTVT(T)=*,(,i;由由FIRSTVT(T)=*,(,i和和ET得得FIRSTVT(E)=+,*,(,i。、构造、构造LASTVT集。集。(1)根据规则根据规则可知:可知:由由E+T得得LASTVT(E)=+;由由T*F得得LASTVT(T)=*;由由F
22、)和和Fi得得LASTVT(F)=),i;(2)根据规则根据规则可知:可知:由由LASTVT(F)=),i和和TF得得LASTVT(T)=*,),i;由由LASTVT(T)=*,),i和和ET得得LASTVT(E)=+,*,),i。EE+TTTT*FFF(E)|i3、构造优先关系表。、构造优先关系表。(1)根据规则根据规则可知可知,由由“(E)”得()。得()。(2)根据规则根据规则可知:可知:由由E+T得得+FIRSTVT(T),即,即+*,(,i;由由T*F得得*FIRSTVT(F),即,即*(,i;由由F(E得得(FIRSTVT(E),即,即(+,*,(,i;(3)根据规则根据规则可知:
23、可知:由由EE+得得LASTVT(E)+,即,即+,*,),i+;由由TT*得得LASTVT(T)*,即,即*,),i*;由由FE)得得LASTVT(E),即,即+,*,),i)。得得GE的算符优先关系表:的算符优先关系表:此外,由此外,由#E#得得#;#FIRSTVT(E),即,即#+,*,(,i;LASTVT(E)#,即,即+,*,),i#。算符优先分析法的设计算符优先分析法的设计通过比较终结符间的通过比较终结符间的优先关系优先关系来实现;来实现;根据优先分析的原理:语法分析程序的根据优先分析的原理:语法分析程序的任务是不断移进输入符号,识别任务是不断移进输入符号,识别可归约可归约串串并进
24、行归约。并进行归约。问题:如何识别可归约的串?问题:如何识别可归约的串?分析的基本方法:分析的基本方法:根据优先关系根据优先关系“高于高于”来识来识别可归约串的别可归约串的尾尾,根据优先关系,根据优先关系“低于低于”来识来识别可归约串的别可归约串的头头。分析栈存放已识别部分,比较栈顶和下一输入分析栈存放已识别部分,比较栈顶和下一输入符号的关系,如果是符号的关系,如果是可归约串的尾可归约串的尾,则沿栈顶,则沿栈顶向下寻找向下寻找可归约串的可归约串的头,找到后弹出可归约串,头,找到后弹出可归约串,归约为非终结符。归约为非终结符。注注:各种优先关系已经存于优先关系表中。各种优先关系已经存于优先关系表
25、中。分析输入串:分析输入串:i+ii+i#+#F F+#F F+#F F+#E#E#表达式文法表达式文法GE:EE+T|TTT*F|FF(E)|i可见可见,每次归约的不是句柄每次归约的不是句柄每次归约的串是什么?每次归约的串是什么?复习复习素短语:素短语:至少含有一个终结符至少含有一个终结符,且除自身外且除自身外,不再包含任何其它更小的素短语。不再包含任何其它更小的素短语。最左素短语:最左素短语:是指位于句型最左边的那个素短语。是指位于句型最左边的那个素短语。回忆:如何求素短语和最左素短语?回忆:如何求素短语和最左素短语?【例例】对于表达式文法的一个句型:对于表达式文法的一个句型:T*F+i求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 课件 第三章 语法分析3 编译 原理 第三 语法分析
限制150内