编译原理第6章LR导论.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
规范归约回顾;刻画“可归约串”---短语、直接短语、句柄;第六章 LR分析方法;目 录;6.1 LR分析方法的基本思路;1. 定义:;Abbcde的可归前缀与活前缀;例:对于G[S’] S’?S S?aAcBe A?b A?Ab B?d 输入串:abbcde;Sn;每个可归约前缀与一个产生式相关联,该可归前缀的每个活前缀也就与这个产生式相关联。活前缀反映了已经得到了产生式的多大一部分,还期望得到什么,可归前缀表明已经得到产生式的全部,应该归约了。有三种情况:;Sn;活前缀与产生式的关系描述----项目;根据项目的定义,每个项目为识别活前缀的NFA的一个状态。;2.举例:;三、LR分析器的逻辑结构:;2. 分析表的组成:;I0 :S ′? ? S S ? ? aSb S? ?ab;四、LR分析(算法);LR分析;6.2 LR(0)分析表的构造;由于不同的项目反映了分析过程中栈顶的不同情况,因此可根据它的不同作用,将一个文法的全部LR(0)项目进行归类;举例:;根据转换函数,可画出NFA的状态图如下:;二、获得识别活前缀的DFA:;2. 对上述过程进行归纳总结,可以发现,一个DFA状态对应一个项目集,它们的全体称这个文法的项目集规范族.;3. DFA的形成过程举例:;活前缀的有效项目和有效项目集;有效项目的含义:;三、LR(0)文法:;四、LR(0)分析表的构造:;例:对文法G[S’] S’?E E?aA|bB A?cA|d B?cB|d;6.3 SLR(1)分析表的构造;将文法进行拓广,有如下项目:;4.原因:决定分析动作仅仅根据到目前已经看到的东西,没有查看下一符号(Token)。;二、SLR(1)分析表:;三、SLR(1)分析表的构造规则;移进——归约冲突;构造SLR(1)分析表;(5)对输入串i+i*i的SLR(1)分析过程:;用S?S.作为初态集的项目,构造识别文法活前缀的DFA如下:;1. SLR(1)方式失效的原因:假设有规范句型αAa…和βAb…,则a和b?follow(A)。但是一旦求出follow(A),其中的a就不再反映它的搭档α,而将α和β混为一谈--处理方式是不精确的。;显然,搜索符a只对归约项目A?αβ.有意义。问题是A?αβ. 来自于A?α. β,这样也就有必要为非归约项目加上搜索符。从而得到一般形式的LR(1)项目:[A?α. ?,a];(1) 闭包函数:;3 举例:;状态;6.5 LALR(1)分析;[S′??S,#] [S??BB,#] [B????aB,a/b] [B??b,a/b];[S′??S,#] [S??BB,#] [B??aB,a/b] [B??b,a/b];构造LALR(1)分析表;讨论:;6.6 二义性文法在LR分析中的应用;语法规则(.y文件);Yacc源程序有三部分组成: 声明 %% 翻译规则 %% C写的支持例程 声明部分?? 有任选的两节。第一节处于分界符%{和%}之间,它是一 些普通的C的声明; 第二节是文法记号的声明。 翻译规则部分 每条翻译规则由一个文法产生式和有关的语义动作组成。?? 支持例程部分?? ?一些C写的支持例程。例:词法分析器,错误恢复例程等。;台式计算器:输入一个表达式并回车,显示计算结果(也可以输入一个空白行)。;expr : expr ‘+’ expr {$$ = $1 + $3; } | expr ‘?’ expr {$$ = $1 ? $3; } | expr ‘*’ expr {$$ = $1 * $3; } | expr ‘/ ’ expr {$$ = $1 / $3; } | ‘(’ expr ‘)’ {$$ = $2; } | ‘?’ expr %prec UMINUS {$$ = ?$2; } | NUMBER ; %% yylex ( ) {int c; while ( ( c = getchar ( ) ) = = ‘ ’ ); if ( ( c = = ‘.’ ) | | (isdigit (c) ) ) { ungetc (c, stdin); scanf ( “% lf ”, yylval); return NUMBER;} return c; };例:;总结:;;作业:;例G[S]: (0)S`→S (1)S→L=R (2)S→R (3)L→ *R (4)L→i (5)R→L;I1:S’?S ?,#

文档评论(0)

558411 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档