- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 LR分析
第六章 LR 分析 迄今为止我们所学的分析方法对文法都有一定的要求,即有局限性; 1965年D.Knuth提出了分析效率极高的LR(k)分析技术; LR分析: 自左至右扫描的自底向上的分析; 在分析的每一步,只须根据分析栈中的已移进的和已归约出的符号,并至多向前扫描k个字符就能确定应采取什么分析动作(移进、归约、接受、报错); LR分析对文法要求很少,效率极高,且能及时发现错误,是目前最广泛使用的方法;一般用CFG描述的语言均可用LR分析法 LR(K)分析法的含义 L—自左向右扫描输入串(源程序) R—分析过程构成最右推导的逆序 K—每次根据当前的输入符号最多向前(右)查看K个符号就可以唯一地确定下一步动作是移进还是归约以及用哪条规则进行归约,因而也能唯一地确定句柄 LR文法 LR文法 一个文法G若能构造一张LR分析表,并使它的每个入口(表中的元素)都是唯一确定的,则称文法G为LR文法。 LR(K)文法 一个LR文法G,若每步最多向前查看K个输入符号就能决定当前分析动作,从而按LR方法进行分析,则称文法G为LR(K)文法。 LR分析的特点: 是规范归约 适用范围广,适用于大多数上下文无关文法描述的语言 分析速度快,能准确定位错误 缺点:LR分析器的构造工作量大 LR分析法的概念 LR分析器的逻辑结构 LR分析器组成: 分析表 总控程序 下推分析栈 分析栈 符号栈 符号栈内存放分析过程中移进或归约的符号。 状态栈 状态栈存放的是状态(标记),状态Si概括了栈中位于Si下面的全部信息,也就是记录分析过程从开始的某一归约阶段的整个分析历史或预测扫描可能遇到的分析符号。分析开始时,分析栈压入初始状态S0和输入符号#,分析器处于初始状态S0。S0刻画了当前栈内仅有一个符号#的事实并预示将扫描的输入字符应刚好是可作为句子首符号的那些符号。 分析表 动作表(ACTION) 状态转换表(GOTO) ACTION表 ACTION表的结构如下: 分析动作 ACTION表中的元素ACTION[Sm, ai]是一个动作,表示当前状态Sm面临输入符号ai时所完成的分析动作。分析动作可分四类: 移进 归约 接受 出错 移进 此时ACTION[Sm, ai]=‘Sj’。分析动作为移进时,表示句柄尚未在分析栈的栈顶形成,正期待继续移进符号,以形成句柄。 ACTION[Sm, ai]=‘Sj’表示当前栈顶状态为Sm,输入符号为ai,应将输入符号ai移进分析栈的符号栈栈顶,同时将Sj移进分析栈的状态栈栈顶。 归约 此时ACTION[Sm, ai]=‘rj’。其中rj表示按文法的第j条规则(产生式)进行归约。设第j条规则为: A?Xm-r+1Xm-r+2 ?Xm 分析动作为归约时,表明当前分析栈顶部的符号串Xm-r+1Xm-r+2 ?Xm已是当前句型的句柄,需要立即进行归约。具体是将分析栈自顶向下的r个符号(包括状态栈内相应的状态)弹出,将A压入符号栈内,此时分析栈格局为: 再以(Sm-r,A)查GOTO表,若GOTO[Sm-r, A]=Sk, 把Sk压入状态栈。 接受 此时ACTION[Sm, ai]=‘acc’。分析动作接受表示当前输入的符号串分析成功,终止分析器工作。 出错 此时ACTION[Sm, ai]=‘error’(error表示出错,在此用空白来表示)。分析动作为出错,表示当前输入的符号串中有语法错误,调用相应的出错处理程序。 GOTO表 GOTO表的结构如下: 状态转换 GOTO表中的元素GOTO[Sm, Xi]是一个状态,表示当前状态Sm面临输入符号Xi时需转移的下一个状态。 ACTION表 GOTO表 文法G[E] :(1)E::=E+T (2)E::=T (3)T ::=T*F (4)T::=F (5)F::=(E) (6)F::=i 总控程序 总控程序是LR分析的实现算法。描述如下: 初始化,将初始状态S0及输入符号串的左界符#推入分析栈; 从输入串中读入当前的输入符号ai,根据当前状态栈栈顶状态Sm与输入符号ai查ACTION表: 若ACTION[Sm, ai]=‘Sj’,完成移进动作; 若ACTION[Sm, ai]=‘rj’,以文法的第j条规则完成归约动作; 若ACTION[Sm, ai]=‘acc’,分析成功,结束; 若ACTION[Sm, ai]=‘error’,出错处理。 重复2)直到出错或接受为止。 接受时分析栈的格局 LR分析实例 设已给文法G[L]: 1. L?E,L 2. L?
原创力文档


文档评论(0)