版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 自底向上分析方法,主要内容 自底向上分析的基本思想 简单优先分析方法 LR类分析方法,基本思想 从待分析的符号串开始,自左向右进行扫描,自下而上进行分析,通过反复查找当前句型的句柄,并使用产生式规则将找到的句柄归约为相应产生式的左部非终极符,直到将输入串归约为文法的开始符。(移入-归约分析) 两种分析方法 简单优先和LR类分析方法,自底向上语法分析方法介绍,例:S aAcBe 1 A b 2 A Ab 3 B d 4 输入流:abbcde。 规范推导过程为:,逆过程:(符号栈,输入流) ( -, abbcde) (a,bbcde) (ab,bcde) (aA,bcde) (aAb,cd
2、e) (aA,cde) (aAc,de) (aAcd,e) (aAcB,e) (aAcBe,-) (S,-),S aAcBe1 aAcd4e1 aAb3cd4e1 ab2b3cd4e1,简单优先分析,一种shift-reduce分析方法 根据文法符号的优先关系确定句柄 文法符号的优先关系的确定,简单优先分析中的三种关系,X Y :当且仅当存在一个产生式AXY X Y :当且仅当存在一个产生式AXB 并有B+Y。 X Y :当且仅当存在一个产生式ABC 并有B+X,C*Y。 文法G为简单优先文法如果满足: 对于任意两个语法符号X和Y,至多成立一种 优先关系; 任意两个产生式都具有不同的右部。,文
3、法优先关系的确定,FIRST(W) =S | W + S,S(VNVT) LAST(W) =S | W + S,S(VN VT) 若有USiSj: 则有Si Sj ; 若有USiW:任SjFIRST(W),有Si Sj 若有UVW:任SiLAST(V), Sj(FIRST(W) W)则有Si Sj 输入流的开始和结束标志 ,文法的开始符为Z, SFIRST(Z),有# S,; 且 Z SLAST(Z),有S #,; 且Z 优先关系矩阵 一个文法的全部优先关系可以用矩阵来表示,称作优先关系矩阵。,例: Z bMb M a M (L L Ma),定理: 设X1XiXi+1XjXn是一个句型,若有
4、Xi Xi+1 Xi+2 Xj-1 Xj Xj+1 则Xi+1Xi+2Xj-1Xj一定是该句型的简单短语。 结论: 用来确定句柄的头; 用来确定句柄的内部; 用来确定句柄的结束。,简单优先分析算法要点,找第一个使SjSj+1的Sj 从Sj开始往前(左)找第一个使Si-1Si的Si 用SiSi+1Sj去查产生式的右部,并用相应的左部符号代替句柄SiSi+1Sj (归约) 。 重复上述过程,直至输入符结束。如果归约出文法的开始符号则成功。否则失败。,简单优先分析实例,符号栈 关系 输入流 # b ( a a ) b # # b ( a a ) b # # b ( a a ) b # # b ( a
5、 a ) b # # b ( M a ) b # # b ( M a ) b # # b ( M a ) b # # b ( L b # # b M b # # b M b # # Z #,规范句型:用最右推导导出的句型(也称右句型)。 规范前缀:若存在规范句型,且是终极符串或空串,则称为规范前缀。 规范活前缀:若规范前缀不含句柄或含一个句柄并且具有形式=(是句柄),则称规范前缀为规范活前缀(简称活前缀)。 归约规范活前缀:若活前缀是含句柄的活前缀,即有=,且是句柄,则称活前缀为归约规范活前缀(简称归约活前缀)。,LR类分析方法,活前缀的描述性定义:形成可归前缀之前,包括可归前缀在内所有规范句
6、型的前缀都称为活前缀。 活前缀 为一个或若干规范句型的前缀。 在规范归约过程中的任何时刻已分析过的部分,即在分析栈(符号栈)中的符号串均为规范句型的活前缀,表明输入串的已被分析过的部分是该文法某规范句型的一个正确部分。,派生定理,开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A是产生式, 则也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是: S 1|2|n RPSG=1,n|ARPSG,AP,识别规约活前缀的LRSM的构造,例有文法GS: S aAc 1 A Abb 2 A b 3,可归前缀集: aAc aAbb ab,LR(0)项目:若A是产生式,
7、则称A为LR(0)项目(简称项目),也 写作p形式。 项目集的投影:假设IS是LR(0)项目集,则 称下面IS(X) 为IS关于X的投影集: IS(X) = AX |AXIS, X(VTVN). 项目集的闭包:假设IS是LR(0)项目集,则 称下面CLOSURE(IS)为IS的闭包集: CLOSURE(IS)= IS A | YACLOSURE(IS) A是产生式 ,构造LR(0)活前缀状态机LRSM的算法要点,构造初始状态IS0:IS0=CLOSURE(ZS),并给IS0标上NO。 从已构造的LRSM部分图选择被标为NO的任一状态IS,并做 1 对每个符号XVTVN,做下面动作: 1) 令I
8、Sj = CLOSURE( IS(X)。 2) 若在LRSM部分图中已有ISk与ISj有相同项目 集,则令m=k;否则构造ISj的状态点ISj, 并给ISj标上NO,同时令m=j。 3) 在IS和ISm之间画有向X边:IS ISm 。 2 给IS标上OK。 重复上一步骤,直至没有被标记为NO的状态结点为止。,x,例:构造LR(0)状态机 S E $ E E + T E T T id T ( E ),GE的LRSM,LRSM给出了所有的可归活前缀 LRSM中的每个状态将对应一个饱和项目集: (1)其中一部分是由先驱状态分出来 (称为基本项目); (2)一部分则是由基本项目扩展出来的 (称为扩展项
9、目或派生项目)。派生部 分项目的特点是其中的“”出现在产 生式右部的最左侧。,形如A P的项目称为归约型项目 形如A P的项目称为移入型项目 移入归约冲突 归约归约冲突 LRSM不能直接用于LR分析 LRSM提供的信息: (1)合法性检查信息Aa (2)移入/归约信息 Aa A (3)移入/归约后的转向状态信息,移入动作:设Sit的ai输入边所指向的状态为S*,归约动作:设按AXk+1Xk+2Xt进行归约,则首先归约为A,Sik的A输出边所指向的状态设为S*,则格局变为:,设当前格局是:,LR分析模型,Output,Stack,#,an,ai,a1,LR分析驱动器,goto,action,In
10、put,LR(0)分析,LR分析表,Action矩阵:行代表状态,列代表输入符,而矩阵元素则表示相应的分析动作:Shift / Reduce / Accept / Error GoTo矩阵:行代表状态,而列则代表语法符号(非终极符,终极符),而矩阵元素则表示移入或归约后的转向状态。 定义 若IS是一个LR(0)项目集,X是一个文法符号,函数GO(IS, X)定义为 GO(IS, X)=CLOSURE(IS(X)),其中IS(X)为LR(0)项目集IS的投影。,假设ISk为LR(0)项目集,则 若AaISk,且GO(ISk, a)= ISi,aVT,则action(ISk, a)=Si,表示把状
11、态ISi和展望符a入栈。 若AISk,则对任意aVT#,令action(ISk, a)=Rj,其中产生式A的编号为j,表示用编号为j的产生式进行归约。 若ZISk,且Z为拓广产生式的左部非终极符,则action(ISk, #)=Accept。 若GO(ISk, A)=ISi,AVN,则goto(ISk, A)=i。 其它情形,则Error(n),表示出错标志,也可不填。,LR(0)分析表的构造,LR(0)分析例,文法如下: S E $ E E+T | T T id | (E),GoTo表,Action表,LR(0)驱动程序,首先置状态栈、符号栈和输入流的开始格局为: (#S1,#,a1a2an
12、#),则: 若当前格局为(#S1S2Sn,#X1X2Xn,aiai+1an#),且action(Sn, ai)=Sj,aiVT,则ai入符号栈,第j个状态Sj入状态栈。即移入后的格局变为: (#S1S2Sn Sj,#X1X2Xnai,ai+1an#) 若当前格局为(#S1S2Sn,#X1X2Xn,aiai+1an#),且action(ISn, a)=Rj,aVT#,则按照第j个产生式进行归约,符号栈和状态栈相应元素退栈,归约后的文法符号入栈。假设第j个产生式为A,k=| (=Xn-k+1Xn),则归约后的格局变为: (#S1S2Sn-kS,#X1X2Xn-kA,aiai+1an#) 其中S=g
13、oto(Sn-k, A)。 若状态栈的栈顶状态为Si,输入流当前值为#,且action(Si, #)=Accept,则分析成功。 若状态栈的栈顶状态为Si,输入流当前值为a,且action(Si, a)=Error或空,则转向出错处理程序。,LR(0)分析实例,状态栈 符号栈 输入串 Action Goto 0 id+id$# shift 5 05 id +id$# reduce4 9 09 T +id$# reduce3 1 01 E +id$# shift 3 013 E+ id$# shift 5 0135 E+id $# reduce4 4 0134 E+T $# reduce2 1
14、01 E $# shift 2 012 E$ # accept,id+id$,文法G: Z aAc1 A bB 2 | ba3 B dB 4 | e 5 构造文法的LR(0)状态机,Action表和 goto表,并给出符号串abdec的LR(0) 分析过程。,SLR(1)分析方法,LR(0)分析方法的不足,LR(0)方法对文法的要求严格。 LR(0)方法容易出现冲突状态。,一个文法例: GE: SE $ 1 EE + T 2 ET 3 TT P 4 TP 5 Pid 6 P( E ) 7,如果某个状态有如下项目集: A , B , D d ,则存在 着归约-归约,移入-归约冲突 若用A 归约,
15、则当前输入符应在A的Follow集中 若用B 归约,则当前输入符应在B 的Follow集 若移入,则当前输入符应为d。,SLR(1)分析条件,LRSM0中存在着状态 A1 1,An n, B11 a1r1,Bm mamrm 则集合: Follow(A1)、Follow(An)、a1,am 两两相交为空,SLR(1)分析表的构造,假设ISk为LR(0)项目集,则 若AaISk,且GO(ISk, a)= ISi,aVT,则action(ISk, a)=Si,表示把状态ISi和展望符a入栈。 若AISk,则对任意aVT,aFollow(A),令action(ISk, a)=Rj,其中产生式A的编号为
16、j,表示用编号为j的产生式进行归约。 若ZISk,且Z为拓广产生式的左部非终极符,则action(ISk, #)=Accept。 若GO(ISk, A)=ISi,AVN,则goto(ISk, A)=i。 其它情形,则Error(n),表示出错标志,也可不填。,SLR(1)文法定义,对于一个文法,若按照上述算法构造的分析表中没有冲突动作,则称该文法为SLR(1)文法。 从定义可以看出SLR(1)分析方法是用LR(0)项目构成的LRSM0来识别活前缀,因此它们的状态数相同,但是,由于LR(0)方法只看状态栈的内容而SLR(1)方法还要向前看展望符,因此SLR(1)文法要比LR(0)文法广。,图4.
17、5.5.3 GE 的LRSM0,+,E,P,id,$,+,P,id,(,T,T,id,(,id,E,(,P,),4,E T T T P,7,P id ,5,T P ,4,S E $ E E + T,1,S E $ 1 E E+T 2 E T 3 T TP 4 T P 5 P id 6 P (E) 7,0,T T P P id P (E),8,P,(,T,P ( E ) E E+T E T T TP T P P id P (E),6,7,8,S E $ ,2,Follow(S)=# Follow(E)=$,+,) Follow(T)=$,+,),* Follow(P) =$,+,),*,SLR(
18、1)驱动器,初始格局(#S0,#,a1a2an#) 若当前格局为 (#S0S1Sn,#X1X2Xn, aiai+1an#),则 若action(Sn, ai)=Sk,则当前格局变为: (#S0S1Sn Sk,#X1X2Xnai, ai+1an#) 若action(Sn, ai)=Rp,则当前格局变为: (#S0Sn-kS,#X1X2Xn-kA,aiai+1an#) 其中goto(Sn-k, A)=S 若action(Sn, ai)=Accept,则成功 其它情形,出错。,分析栈 符号栈 输入串 分析动作 转向状态 0 id id+id$# S5 0,5 id id+id$# R6 4 0,4
19、P id+id$# R5 7 0,7 T id+id$# S8 0,7,8 T id+id$# S5 0,7,8,5 Tid +id$# R6 9 0,7,8,9 TP +id$# R4 7 0,7 T +id$# R3 1 0,1 E +id$# S3 0,1,3 E+ id$# S5 0,1,3,5 E+id $# R6 4 0,1,3,4 E+P $# R5 11 0,1,3,11 E+T $# R2 1 0,1 E $# S2 0,1,2 E$ # Accept,SLR(1)与LR(0),SLR(1)和LR(0)具有相同的状态机 LR(0)只看分析栈的内容,不考虑当前输入符 SLR(1
20、)考虑输入符,用follow集来解决冲突,因此SLR(1)要比LR(0)分析能力强,括号文法定义如下: Z S$ S (S) S | 构造该文法的SLR(1)分析表,并给出输入流( )( )$的SLR(1)分析过程。,主要内容: LR(1)分析方法,Z E E (L,E) E S L L,E L E S id S (S),Z E E(L,E) ES Sid S (S),0,E(L,E) S(S) LL,E LE E(L,E) ES Sid S(S),1,ES S(S),2,(,S,状态2存在移入-归约冲突,LR(0)方法不依赖输入流,直接判定归约,容易出现冲突。 SLR(1)方法简单的把非终极
21、符的follow集做为可归约的依据,并不精确。 一个非终极符在不同的位置上出现,它所允许的后继符是不同的。LR(1)针对不同产生式上的非终极符,分别定义其后继符集(展望符集Reducelookup),减少了移入/归约冲突。,LR(1)项目:A, a 。LR(0)项目及一个VT#的展望符集合 IS:LR(1)项目集 IS(X): IS(X) = AX,a |AX,aIS CLOSURE ( IS ) = IS B,b |AB,a CLOSURE(IS), B是产生式 , bFirst(a) GO:若IS是一个LR(1)项目集,X是一个文法符号,则 GO(IS, X)=CLOSURE(IS(X))
22、,其中IS(X)为LR(1)项目集IS的投影。,LRSM1的构造算法,初始项目集: ISS=CLOSURE( Z S, # ) 若所有状态都处理完,则结束 选一未处理完状态IS,对所有语法符号 X(VTVN #),求ISX,令 IS = CLOSURE(ISX),若IS不为空: 若IS为新状态,则增加IS IS,把IS加 入LRSM1中;否则为图中某个状态ISj,则在IS 和ISj之间增加一条转换边:IS ISj 转到步骤2,X,X,非SLR(1)文法: Z S S L= R S R L aR L b R L,LR(1) 分析表的构造,假设ISk为LR(1)项目集则: 若Z, #ISk,且Z为
23、拓广产生式的左部非终极符,则action(ISk, #)=Accept。 若A, aISk,且产生式A的编号为j,则action(ISk, a)=Rj,表示用编号为j的产生式进行归约。 若Aa, bISk,且GO(ISk, a)=ISi,aVT,则action(ISk, a)=Si,表示把状态ISi和展望符a入栈。 若GO(ISk, A)= ISi,AVN,则goto(ISk, A)=i。 其它情形,则Error(n),表示出错标志,也可不填。,LR(1)文法的定义,对于一个文法,若按照上述算法构造的分析表中没有冲突动作,则称该文法为LR(1)文法。,R4,13,R5,12,R6,R6,11,
24、R4,R4,10,R6,9,13,9,S12,S8,8,R2,7,7,9,S12,S8,6,10,11,S4,S5,5,R5,R5,4,R3,3,R6,S6,2,A,1,3,2,1,S4,S5,0,R,L,S,#,=,b,a,LR(1)驱动程序,LR(1)的驱动程序与SLR(1)的驱动程序是相同的,可共用一个。,状态栈 符号栈 输入串 Action GoTo 0 aab=b# S5 0,5 a ab=b# S5 0,5,5 aa b=b# S4 0,5,5,4 aab =b# R5 11 0,5,5,11 aaL =b# R6 10 0,5,5,10 aaR =b# R4 11 0,5,11
25、aL =b# R6 10 0,5,10 aR =b# R4 2 0,2 L =b# S6 0,2,6 L= b# S12 0,2,6,12 L=b # R5 9 0,2,6,9 L=L # R6 7 0,2,6,7 L=R # R2 1 0,1 S # A,设文法GS为: SAS | A aA | b 证明GS是LR(1)文法;构造它的LR(1)分析表;给出符号串abab#的分析过程,LALR(1)方法,它具有SLR(1)的状态数少的优点和LR(1)的适用范围广的优点。 LALR(1)方法的功能介于SLR(1)和LR(1)之间。 LALR(1)状态机的状态个数和LR(0)状态机的状态个数相同,
26、而其展望符则即不采用SLR(1)的Follow集方法,也不采用LR(1)的完全精确法。,LALR(1)的思想来源,LR(1)状态机和LR(0)状态机从它们所表示的自动机角度来看是等价的 ; 自动机可通过合并等价状态来减少状态个数。 在LR(1)状态机出现很多同心状态,而LALR(1)状态机则不产生同心的状态, 从而大大减少状态数,这就是LALR(1)和LR(1)的主要差别。,LALR(1)状态机的定义方式: 用LR(1)状态机来定义; 用LR(0)状态机来定义。 LALR(1)状态机的构造方法: 先构造LR(1)状态机,后构造LALR(1)状态机 按LR(1)状态机的方式构造,但发现同心状态 时不产生新状态,而是采用合并状态的方法。 先构造LR(0)状态机,而后用传播方式求出每 个项目的展望符集。,相关的术语,假设A, b是LR(1)项目,则称其中 的LR(0)项目部分A为该项目的心。 如果LR(1)状态机中的两个状态具有相同的 心,则称它们为同心状态。,例 假设在LR(1)状态机中有状态S1和S2: S1 = A, a1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 员工试用期个人工作总结
- 儿童口腔讲座
- 2026年新课标III卷高考地理压轴题专题卷含解析
- 电气自动化技术专业说课s110201 led实训
- 2026年新课标 II 卷高考生物细胞结构题突破卷含解析
- 银发经济市场新需求
- 合成树脂生产工安全检查强化考核试卷含答案
- 房产测量员岗前安全管理考核试卷含答案
- 中药调剂员岗前理论评估考核试卷含答案
- 液压液力气动密封件制造工岗前实操熟练考核试卷含答案
- 期中基础模拟卷(1-4单元试卷)2025-2026学年五年级数学下册人教版(含答案)
- 兰州翡翠华庭地热项目环评报告表
- 兴业证券集团2027届暑期实习生招聘笔试参考试题及答案解析
- GB/T 44693.4-2026危险化学品企业工艺平稳性第4部分:开工过程管理规范
- 禁种铲毒课件
- 2024-2025学年宁夏银川市唐徕中学南校区九年级下学期期中考试历史试卷
- 人教版(2024)八年级上册英语Unit 4 Amazing Plants and Animals 教案
- (2025年标准)球阀技术协议书
- DL∕T 1860-2018 自动电压控制试验技术导则
- 2024年新疆克拉玛依市独山子石化分公司招聘笔试参考题库含答案解析
- 杭州市旅游职业学校招聘真题
评论
0/150
提交评论