- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
状态 Action Goto a b c d # E A B 0 s2 s3 1 1 acc 2 s4 s10 6 3 s5 s11 7 4 s4 s10 8 5 s5 s11 9 6 r1 r1 r1 r1 r1 7 r2 r2 r2 r2 r2 8 r3 r3 r3 r3 r3 9 r4 r4 r4 r4 r4 10 r5 r5 r5 r5 r5 11 r6 r6 r6 r6 r6 文法G[S]: (0) S→E (1) E→aA (2) E→bB (3) A→cA (4) A→d (5) B→cB (6) B→d (3)分析表 CompilerPrinciples * 6.SLR分析 ①问题的提出:LR(0)分析要求条件很苛刻,即使是定义算术表达式这样的简单文法,要想使识别其活前缀的DFA的每个状态都不含冲突项目也不可能。因此,有必要研究一种带一点“展望”材料的LR分析法,也就是要检查一下下一个输入符号。 例如,I={X→α?bβ,A→α?,B→α?},第一个项目为移进项目,第二、三项是归约项目。到底应该采取哪种动作是不清楚的。如果我们分析一下该文法中所有含A,B的句型,考察Follow(A)和Follow(B),若Follow(A) ∩Follow(B)=φ且都不含有b,则问题就解决了。当状态I面临输入a时,我们就可以采取如下的“移进-归约”策略: ⅰ.若a=b,则移进; ⅱ.若a∈Follow(A),则用A→α来归约; ⅲ.若a∈Follow(B),则用B→α来归约; ⅳ.此外,报错。 CompilerPrinciples * ◇一般而言,若LR(0)规范族的一个项目集I中含有m个移进项目和n个归约项目: I={ A1→α?a1β1, A2→α?a2β2...Am→α?amβm, B1→α?,B2→α?,...Bn→α? } , 若集合: {a1,a2,...am}∩Follow(B1)∩...∩Follow(Bn)=φ,则通过查看现行输入符号a属于哪个集合就可以解决问题。 ⅰ.若a=ai (i=1,2,…m) ,则移进; ⅱ.若a∈Follow(Bi) (i=1,2,…n),则用Bi→α来 归约; ⅲ.此外,报错。 这种方法称为SLR(1)解决法。 CompilerPrinciples * ②SLR分析表的构造 这个构造算法与LR(0)分析表的构造算法基本类似,只有些许改动之处:若项目A→α? ∈Ik,那么对任意a∈VT且a∈Follow(A),置Action[k,a]为“用产生式A→α进行归约”,简记为“rj”;(详见参考书P150) 按照上述算法构造出的分析表,如果不含多重入口,则称之为G的SLR分析表;G称为一个SLR(1)文法,使用SLR分析表的分析器称为SLR分析器。每个SLR文法都是无二义的,但也存在许多无二义文法不是SLR(1)的,因为没有足够多的“展望”信息。 (见参考书P151例4.34) CompilerPrinciples * 下面我们来一起做一个练习: S - E E - E + T E - T T - T * F T - F F - id 构造这个文法的项目集规范族和GOTO函数,并试着构造其分析表。 CompilerPrinciples * 7.规范LR分析法 前面我们定义LR(0)项目时,并没有牵扯到任何“展望”信息。只要DFA的某状态中含有归约项目A→α?,那么当栈顶出现α串时,我们就能用A→α进行归约。现在我们想使每个状态含有较多的“展望”信息,这将有助于克服动作冲突和无效归约。为此,我们对项目重新定义: LR(k)项目:形如[A→α?β,a1a2...ak]的项目。 其中,A→α?β是一个LR(0)项目,每个ai∈VT。而a1a2...ak称为该LR(k)项目的向前搜索串(展望串)。类似的,[A→α?, a1a2...ak]称为LR(k)归约项目,而[A→α?Xβ, a1a2...ak]或者是LR(k)移进项目(X∈VT),或者是LR(k)待约项目(X∈VN)。 CompilerPrinciples * 由于对大多数程序语言的语法来说,一般向前搜索一个符号就可以确定“移进”或“归约”,因此,我们只对k≤1的情况感兴趣。 带有1个“向前看符号”的项目称为LR(1)项目,使用LR(1)项目集规范族及其对应的GOTO函数的分析器称为LR(1)分析器,这种分析方法称为“规范的LR”分
文档评论(0)