- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七讲 LR分析;本章学习目标;LR分析; LR分析的概述; SP为栈顶指针,S[i]为状态栈,X[i]为文法符号栈。状态栈的内容按关系GOTO[Si,X]= Sj。其中X为终结符或非终结符。;ACTION[Si,a]规定了栈顶状态为Si时遇到输入符号a应该执行的动作。动作有4种可能:
(1)移进:当Sj=GOTO[Si,a]成立,则把Sj移入到状态栈,把a移到文法符号栈,其中i和j表示状态。
(2)归约:当在栈顶形成句柄为?时,则用?归约为相应的非终结符A,即当文法中有A??的产生式,当?的长度为?(即|?|=?)时,则从状态栈和文法符号栈中自栈顶向下去掉?个符号,即栈指针SP减去?;并把A移入文法符号栈,再把满足Sj=GOTO[Si,A]的状态移进状态栈,其中Si为修改后指针的栈顶状态。
(3)接受acc:当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是?#?,则分析成功。
(4)报错:当遇到状态???某一个状态下出现不该遇到的文法符号栈时,则报错。说明输入串不是该文法能接受的句子。;我们主要是关心的问题是:
如何由文法构造LR分析表?
对于一个文法,如果能构造一张分析表,使得它的每一个入口均是惟一确定的,则称这个文法是LR 文法。对于一个LR文法,当分析器对输入串进行自左向右扫描时,一旦句柄呈现在栈顶,就能及时的对它实行归约。
在有些情况下,LR分析器需要“展望”和实际检查未来的k个输入符号才能决定对应采取什么样的“移进—归约”决策。一般而言,一个文法如果能用一个每步最多向前检查k 个输入符号的LR分析器进行分析,则这个文法称为LR(k)文法。; LR(0) 分析;;步骤;可归前缀和子前缀;从这里可以看出对于一个合法的句子而言,每次归约后得到的都是已归约部分和输入剩余部分合起来构成文法的规范句型。而用哪个产生式继续归约仅取决于当前句型的首部。
例中每次归约前的句型的首部依次为:
ab[2]
aAb[3]
aAbcd[4]
aAcBe[1]
这些符号正是在归约之前栈中的符号。当栈中出现上述的符号串时,就采用相应的产生式进行归约,把规范句型的首部称为可归前缀。
;我们再分析每个首部的前缀:
ab[2]的前缀有?,a,ab
aAb[3]的前缀为?,a,aA,aAb
aAbcd[4]的前缀为?,a,aA,aAb,aAbc,aAbcd
aAcBe[1]的前缀为?,a,aA,aAc, aAcB,aAcBe
我们把在规范句型中形成可归前缀之前包括可归前缀在内的所有的前缀称为活前缀。
在规范归约的任何时刻,只要已分析过的部分即在符号栈内的符号串均为规范句型的活前缀,则表明输入串的已分析过的部分是该文法某规范句型的正确部分。
;拓广文法;识别活前缀的有限自动机;我们将上面的文法进行拓广,文法表示成:
(0)S??S[0]
(1)S?aAcBe[1]
(2)A?b[2]
(3)A?Ab[3]
(4)B?d[4]
现对句子abbcde的可归约前缀列出:
S[0]
ab[2]
aAb[3]
aAbcd[4]
aAcBe[1]
构造出识别其活前缀的自动机如图所示。;;将该不确定的自动机确定化如图所示。将该确定的有穷自动机的状态作为LR(0)分析表的状态,就可以画出LR(0)分析表;活前缀及其可归前缀的一般方法;;LR(0)项目集规范族的构造
1.LR(0)项目的定义
文法G的每个产生式的右部的某个位置添加一个“·”。例如,产生式A?xyz包含4个项目:
A?·xyz
A?x·yz
A?xy·z
A?xyz·
而空产生式A??,只有一个项目A?·。
直观地说,一个项目指明了在分析过程的某一个时刻一个产生式的状态,例如,上面的第一个项目指明,希望看到可从xyz推出的符号串;第二个项目则指明,已经看到了能从x推出的符号串,但希望进一步看到可以从yz推出的符号串。;LR项目的分类;2.构造识别活前缀的NFA;;根据项目构造识别活前缀的NFA和DFA
将项目的编号作为自动机的状态,在构造识别活前缀的NFA时,遵循如下的原则,
即假设有一个项目i为:X?X1X2…Xi-1 ·Xi…Xn
而项目j为:X?X1X2…Xi-1 Xi ·Xi+1…Xn
那么从状态i到状态j连一条标记为Xi的弧。如果Xi是非终结符,则也会有以它为左部的有关项目以及相应的状态,比如:
i X ? ? · A?
k A ? · ?
则从状态i画标记为?的箭弧到达状态k,箭弧上标记为?;采用文法的项目集规范族构造有限自动机;例如给出拓广文法:
S??E
E?aA|bB
A?cA|d
B?cB|d
假定I0={ S??·E},那么CLOSURE(I)包含的项目如下:
S??·E
E?·aA
E?·bB
原创力文档


文档评论(0)