编译程序原理与实现:第5章 SLR(1)-LR(1)方法_第1页
编译程序原理与实现:第5章 SLR(1)-LR(1)方法_第2页
编译程序原理与实现:第5章 SLR(1)-LR(1)方法_第3页
编译程序原理与实现:第5章 SLR(1)-LR(1)方法_第4页
编译程序原理与实现:第5章 SLR(1)-LR(1)方法_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章 自底向上的语法分析5.1 自底向上的语法分析方法概述5.2 LR(0)分析的有限自动机5.3 LR(0) 分析5.4 SLR(1) 分析5.5 LR(1) 分析5.6 LALR(1) 分析5.7 LALR(1) 语法分析器的自动生成器 (YACC)5.5 LR(1) 分析LR(0) 分析的局限LR(1) 自动机LR(1) 分析表LR(1) 文法LR(1) 分析过程LR(0)分析的局限LR(0)文法仅凭符号栈里的内容来确定可归约活前缀, 非常容易产生冲突;事实上,只有有限的文法能满足LR(0)文法的条件;LR(0)分析不是一种实用的方法,只是为介绍LR分析的思想而引进的;LR(0)文法易

2、于产生冲突的原因在于在确定分析动作时没有考虑输入串信息。LR(0)自动机的移入-归约冲突VT = a, bVN = S, AS = SP: (1) S Ab (2) A (3) A a0 Z SS AbA aA 1Z S S2S A bA3S Abba4A a 状态0中存在移入-归约冲突:移入项目:(2) 归约项目:A aA LR(0)自动机的归约-归约冲突VT = a, b, cVN = S, A, BS = SP: (1) S Ab (2) S Bc (3) A a (4) B a0Z SS AbS BcA a1Z S S2S A bA3S Abba6A a B a 状态6存在归约-归约冲

3、突:归约项目:(2) 归约项目:A a B aB a4S B cB5S Bcc如何消除冲突?向前看一个输入符号来选择分析动作:假设下一个输入符号是: a移入-归约冲突(S-R冲突)移入: 如存在移入项目 A a归约: 如果存在归约项目 B , 且 a follow(B)归约-归约冲突(R-R冲突)归约(P1): 如果存在归约项目 A , afollow(A), 产生式P1= A 归约(P2): 如果存在归约项目 B , afollow(B), 产生式P2= BLR(0)分析表 (带有S-R 冲突)Action 表Goto 表ab#SA0S5;R2R2R2131Accept2S33R1R1R14

4、R3R3R3VT = a, bVN = S, AS = SP: (1) S Ab (2) A (3) A aLR(0)分析表 (没有冲突)Action 表Goto 表ab#SA0S5R2131Accept2S33R14R3VT = a, bVN = S, AS = SP: (1) S Ab (2) A (3) A a冲突用follow(A)解决掉了LR(0)分析表 (带有R-R 冲突) VT = a, b, cVN = S, A, BS = SP: (1) S Ab (2) S Bc (3) A a (4) B aAction 表Goto 表abc#SAB0S71351Accept2S43R1

5、R1R1R14S65R2R2R2R26R3R4R3R4R3R4R3R4LR(0)分析表(没有R-R冲突)VT = a, b, cVN = S, A, BS = SP: (1) S Ab (2) S Bc (3) A a (4) B aAction 表Goto 表abc#SAB0S71351Accept2S43R14S65R26R3R4冲突用 follow(A) 和 follow(B)消除了;SLR(1) 分析SLR(1) 分析的思想向前看一个输入符号;用非终极符的follow集合解决冲突;如果能将LR(0)自动机中的所有冲突消除掉,则该文法称为SLR(1)文法,否则称为非SLR(1)文法。SL

6、R(1)文法文法G的SLR(1)自动机与它的LR(0)自动机完全相同SLR(1)分析表中Action表与LR(0)分析表的Action表稍有不同(移入动作没有区别,归约动作有区别)SLR(1)驱动程序与LR(0)驱动程序也相同非SLR(1)文法的例子VT = a, b, =VN = S, L, RS = SP: (1) S L = R (2) S R (3) L aR (4) L b (5) R L0Z SS L = RS RL2S L=R R LL aRL bR L1Z S Sfollow(R) = #, =SLR(1)分析的局限性SLR(1)分析存在的问题通过引入follow集,解决了一部

7、分文法的冲突问题,但满足SLR(1)文法条件的文法仍有限;原因在于:对于同一个非终极符可能出现在不同的位置,不同位置的后继符号(follow)是不同的,统一看待,仍有可能引起冲突。P: (1) S L = R (2) S R (3) L aR (4) L b (5) R LS=LRLRa解决的办法LR(1) 分析基本思想:对于非终极符的每个不同出现求其后继终极符(follow), 称为展望符;一个非终极符的一个出现的所有后继终极符构成的集合称为展望符集;分析步骤:构造 LR(1) 自动机LR(1) 项目 = LR(0)项目+展望符集生成 LR(1)分析表 (action & goto)LR(1

8、)驱动程序 = LR(0)驱动程序LR(1) 自动机LR(1) 项目两个部分 : (A , a, ) (1) LR(0) 项目: A (2) 展望符集: a, ,表示非终极符A此次出现的所有可能follow符号。例如:S L=R , #A , a, b展望符集的作用: 对于移入型项目, 不起作用,但是需要保存;对于归约型项目, 表示只有当下一个输入符是其中一个展望符时, 才可以进行归约动作LR(1) 自动机LR(1) 项目集合关于符号X的投影IS 是 LR(1) 项目的集合;X 是一个符号;IS(X) 表示项目集IS关于X的投影:IS(X) = (S X, ss) | (S X, ss) IS

9、, X VT VN投影对展望符集没有影响!IS = (A ABb, a,b), (B a, #), (B bB, b)X = BIS(B) = (A ABb, a, b), (B bB, b)LR(1) 自动机LR(1)项目集合的闭包IS 是LR(1)项目的集合;CLOSURE(IS)是一个LR(1)项目集合, 按照下面的步骤计算:1初始, CLOSURE(IS) = IS;2 对于CLOSURE(IS)没有处理的LR(1)项目, 如果其形式为 (B A, ss) , 而且A的全部产生式是A1, , An 则增加如下LR(1)项目到CLOSURE(IS) (A 1, ss), , (A n,

10、ss), 其中 ss = first(), 如果符号串不导出空; ss = (first()-) ss, 如果符号串导出空; 3 重复2直到 CLOSURE(IS)收敛;LR(1)自动机goto函数()IS 是 LR(1) 项目集;X 是一个符号;goto(IS, X) = CLOSURE(IS (X) ) LR(1)自动机的构造VT = a, b, =VN = S, L, RS = SP: (1) S L = R (2) S R (3) L aR (4) L b (5) R L0Z S , #S L = R, #S R, #R3S R, # L aR, =L b , =R L , #1ZS,

11、#Sb4L b, =, # L5S L=R, # R L, #L aR, #L b , #L aR, =, #L b , =, #=6a126S L=R, # R L , #L aR, #L b , #LR7S L=R, # a9L aR, # R L , #L aR, #L b , #R10L aR, # L8R L, # ab11L b, # b12L aR, =, # R L , =,#L aR, =,#L b , =,#R13L aR, =,# baL14R L, =,# 4如何计算展望符集?投影得到的项目继承闭包新产生的项目扩展S X, ssXS X, ssS A, ss.A 1,

12、ss.A n, ssss = first(), 如果不导出空;ss = (first()-) ss, 如果导出空;LR(1)自动机的构造过程1增广产生式 Z S2 = VT VN #3S0 = CLOSURE(S S, #)4ISS = S05对于ISS中的每一个项目集合IS, 和每个符号X , 计算IS = goto(IS, X), 如果IS不为空, 则 建立 IS IS, 如果IS不为空且IS不属于ISS,则把IS加入ISS;6重复5直到ISS收敛;XLR(1) 分析表action表goto表LR(1) 分析表action表 终极符状 态 a1#S1Sn(1)action(Si,a) =

13、Sj, 如果Si到Sj有a输出边(2)action(Si,a) = Rp, 如果Si中包含这样LR(1)项目, (A, ss),其中A是产生式P,且ass; (3)action(Si,#) = accept, 如果Si是接受状态(4)action(Si,a) = error, 其他情形LR(1) 分析表goto表 非终极符状 态 A1AnS1Sngoto (Si, A) = Sj, 如果Si到Sj有A输出边 goto (Si, A) = error,如果Si没有A输出边 LR(1) 分析表Action 表Goto 表ab=#SLR0S12S41531Accept 3R24R4R45S6R56S

14、9S11877R1 LR(1) 分析表 (接上页.)Action 表Goto 表ab=#SLR8R59S9S111010R311R412S12S4141313R3R314R4R415LR(1) 文法给定一个上下文无关文法 GLR1 是文法G的 LR(1) 自动机A1 是G的action表如果对于任意一个状态s和任意的一个终极符a, A1(s,a)只有一个唯一的动作, 则文法G称为LR(1)文法;ShiftReduceAcceptError LR(1) 分析方法输入#a状态栈action表goto表LR(1)驱动程序LR(1) 分析驱动程序初始化: push(S0); a = readOne();L: Switch action(stack(top), a) Case error: error();Case accept: return true;Case Si: push(Si), a=readOne(); goto L;Case RP: pop(|P|); push(goto(stack(top), PA ); goto L;如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论