- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
三、SLR(1)分析表的构造 常见程序设计语言都不是LR(0)的,所以LR(0)分析表实用性较差. 例如,典型的分程序结构: B’ →B B →bD;Se D →D;d|d S →s;S |s 不是LR(0)文法. 甚至常见的简单表达式文法G[E]也不是LR(0)文法. B’ →B B →bD;Se D →D;d|d S →s;S |s 不过,常见的程序设计语言相应的LR(0)分析表冲突项目较少,可以对分析表做一定的修改,消除“移进-归约”或“归约-归约”冲突. SLR(1)分析表的构造(续) 考虑LR(0)分析表的造表算法规则(2),对于Ii中归约项目A→?·,不管下一输入符号是谁,均进行归约. 若Ii中同时含有B→?·b?及C→?· 两类项目时,上述填表方法必然得到冲突的分析表. 一般地,Ii={A1→?·a1?1,…,Am→?·am?m,B1→?·,…,Bn→?·} 如果能根据下一输入符号a对上述冲突加以区分,则冲突可解决. 当集合FOLLOW(Bk)(1≦k≦n)与{a1,a2,…,am}两两互不相交时,则可按下述方法解决冲突: ?a?VT?{#}, IF a?{a1,a2,…,am} THEN ACTION[i,a]=sj ELSE IF a?FOLLOW(Bj) THEN ACTION[i,a]=rBj?? ELSE ACTION[i,a]=“ERR” SLR(1)分析表的构造(续) 上述方法就是SLR(1) (Simple LR(1))规则.按照SLR(1)规则,只须将LR(0)分析表的填表规则(2)修改为: (2’) 若归约项目A→??属于Ii,且A→?是P中第j产生式,则对于?a?FOLLOW(A),置ACTION[i,a]=rj 注:其它规则不变! 对于给定的文法G,若其相应的SLR(1)分析表无冲突项,则称G是SLR(1)文法. G[B]的SLR(1)分析表 例 分程序文法G[B]中,I8={S?s?;S, S?s?}含有冲突,但FOLLOW(S)={e} ≠{;},故冲突可解决. 四、LR(1)分析表的构造 尽管SLR(1)分析表简单实用,但还不能解决所有问题; 例如,文法 S’→S S→CbBA A→Aab|ab B→C|Db C→a D→a 相应的DFA见下页。 其中项目集I10={S→CbBA·,A→A·ab}中存在“移进-归约”冲突,由FOLLOW(S)={#} ≠{a}, 冲突是可解决的. 但项目集I8={C→a·,D→a·}中, FOLLOW(C)={a,b}, FOLLOW(D)={b},存在公共元素b,不能解决此冲突. 还需考虑另一个条件:归约后得到的符号串应该是一个规范句型的前缀,即当分析栈内容为#??,输入符为a时,若将?归约为A,则#?Aa必须是某一规范句型的前缀,否则这个归约就是无效的. LR(1)分析表的构造(续) 例如,对于上述文法的规范句型Cbabab,分析达到格局: I0I2I4I8 bab # C b a 时,由于输入符b∈FOLLOW(C), 若用C来归约,得到 I0I2I4I6 bab # C b C 但CbCb不是任何规范句型的前缀!因此应该用D来归约,得到规范句型的前缀CbDb. 因此,将#??a?归约成#?Aa…的前提条件不仅仅是要求a∈FOLLOW(A),还必须要求?Aa是某规范句型的前缀. 在原来的每个LR(0)项目[A????]中放置一向前搜索符号a: [A????,a],称为LR(1)项目. 对活前缀有效的LR(1)项目 定义 LR(1)项目[A????,a]对活前缀 ?=??有效,iff 存在规范推导:S?? ?Ay ? ???y y?VT* ,且满足条件: (1)当y≠?时,a∈FIRST(y); (2)当y=?时,a=#. 例如,对于上例中文法S’→S S→CbBA A→Aab|ab B→C|Db C→a D→a,有 求LR(1)项目集闭包算法 类似于LR(0)分析,识别文法全部活前缀的DFA的状态是由LR(1)项目集表示的. 对每个LR(1)项目集I,相应的闭包CLOSURE(I)的定义为 I?CLOSURE(I); 设项目[A?? ?B? , a] ?CLOSURE(I),对所有形如B??的产生式,及每个b?FIRST(?a),将[B??? , b] =CLOSURE(I); 重复(2),直到CLOSURE(I)不再增大. 新增项目对活前缀仍有效的证明 事实上, 当[A?? ?B?,a] 对?=?? 有效时,由定义,有: S???Ay???B?y y?VT* 且a?FIRST(y) ?{#} 即 S???
文档评论(0)