- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 可归约前缀可能无限,只要将规则A?Ab改为A?bA,由可归前缀aAcBe就可产生无穷可归前缀。 * * * 合二为一 * 合二为一 * 说明:(1)任何状态均为活前缀的识别态;(2)终态是句柄识别态 * * * * * * * R后面跟=,要求有上文* 四、LR(0)分析表的构造: 1.构造方法:对于文法G[S],按以下规则构造LR(0)分析表: (1) 对于A???x??Si ,GO(Si,x)=Sj ,若x?VT, 则置Action[Si,x]=Sj; 若x?VN, 则置Goto[Si,x]=j; (2) 对于A????Si ,若A?? 是G中第k个产生式,则对所有输入符号x?VT(包括#), 均置Action[Si,x]=rk ; (3) 若S????Si ,则置Action[Si,#]=acc (#表示输入串右界符); (4) 其它情况均置错。 将x入符号栈,要转去的状态Sj进栈 将归约后的非终结符x对应的状态Sj进栈 按指定的产生式进行归约,将归约后的非终结符进栈 对应分析动作为:报告分析成功 例:对文法G[S’]S’?EE?aA|bBA?cA|dB?cB|d (0)S’?E(1)E?aA(2)E?bB (3)A?cA (4)A?d (5)B?cB(6)B?d 状态 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 r5 r5 r5 r5 r5 10 r4 r4 r4 r4 r4 11 r6 r6 r6 r6 r6 GO(Si,x)=Sj ,若x?VT,置Action[Si,x]=Sj GO(Si,x)=Sj ,若x?VN,置Goto[Si,x]=j 若S????Si ,则置Action[Si,#]=acc 若A????Si ,且对应第k个产生式,则对所有符号,置Action[Si,x]=rk 6.3 SLR(1)分析表的构造 一、问题的提出: 如果文法所对应的LR(0)项目集规范族中,有的项目集中含有冲突,则无法按LR(0)分析法进行分析。 通常的程序设计语言一般不能用LR(0)文法来描述,下面是一个实型变量说明的文法: 1.文法: 实型变量说明?Real标识符表标识符表?标识符表,i|i S r D G[S]:S?rDD?D,i|i 将文法进行拓广,有如下项目: (0) S?S (1) S?rD (2) D?D,i (3) D?i S??S S?S? S??rD S?r?D S?rD? D??D,i D?D?,i D?D,?i D?D,i? D??i D?i? 2.构造项目集: S0: S??S S??rD S1: S?S ? S2: S?r ?D D? ?D,i D? ?i S3: S?rD ? D?D ?,i S4: D?i ? S5: D?D, ?i S6: D?D,i ? 3.用转换函数G0(I,x)=closure(J),得DFA S ? r D i , i 结论:S3中有移进—归约冲突,不能用LR(0)分析方法 S?rD ?为归约项目,它认为当前句柄已经形成,所以不管输入什么符号都应归约 D?D ?,i为移进项目:已分析完一个非终结号D,若有输入符号“,”应移进,并转向状态S5 4.原因:决定分析动作仅仅根据到目前已经看到的东西,没有查看下一符号(Token)。 S3: S?rD ? D?D ?,i 对于状态S3,如果要做归约动作,那么句柄rD已经形成,可归约为S。这时S之后不应有其他终结符号(只可以有#)。即文法中含有S的句型中,S之后只能有#。 而对于移进项目D?D?,i ,它只期待移进符号为’,’。 所以可以这样处理:当有输入符号’,’时,移进,当有输入符号‘#’时归约。其它输入符号产生语法错误。 句型:…rD, … …S, … × Follow(S) 二、SLR(1)分析表: 将例中的情况一般化:根据不同的向前看符号将状态Si中的各个项目所对应的动作加以区分,从而解决冲突动作。 1.设有一个LR(0)的规范族中有如下项目集(状态) Si={x?α.b?, A?γ. , B?δ. , α, ?, γ, δ?V*, b?VT} 可用下面方法解决冲突: 2.求Follow(A)、Follow(B)、First(b?)。若Follow(A),Follow(B)和First(b?)互不相交,则对于输入a?VT?{#}, i)对于
文档评论(0)