编译原理 第4章 语法分析(第8-18讲).ppt

  1. 1、本文档共125页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理 第4章 语法分析(第8-18讲)

● example 4.5.4 一般的LR(1) 分析 (1)简单直接左递归的消除 A → Aα| β A → βA’ A’ → αA’| ε 1、消除文法中的左递归或提取左因子; ■ LR分析与LL(1)分析比较 (2)将文法G: A→αβ|αγ提取左因子。 解: A→αA’ A’→β|γ 2、求改写文法中的非终结符的First集和Follow集; 3、判断文法是否是LL(1)文法; 对A? α?β,下面的两条件成立才是LL(1)文法: 1、FIRST(α)∩FIRST(β)=?。 2、假若β =* ?,那么, FIRST(α)∩FOLLOW(A)=?。 4、若该文法是LL(1)文法,则构造预测分析表; (1)对于First(α)中的每个记号a,都将A → α添加到表项M[A, a]中; (2)若ε在First(α)中,则对于Follow(A)的每个元素a(记号或是$),都将A → α添加到M[A, a]中。 5、根据分析表进行自顶向下的语法分析。 ——自顶向下的语法分析 * ■ 关于上机 必须实现课本附录C中的 C.1词法分析和 C.2语法分析两个程序。 若都实现了,可以思考: 用LL(1)方法实现语法分析。 * ■ 关于上机 将P199文法改为: (1)lrparser ::= begin yucu end (2)yucu ::= statement {;statment} (3)statement ::= ID:=expression (4)expression ::= term{+term|-term} (5)term ::= factor{*factor| /factor} (6)factor ::= ID|NUM|(expression) 1、第(3)和(6)产生式中ID是指标识符,syn==10; 2、该文法识别的程序,最后一条语句不能有“;”,见第(2)个产生式。 3、所给算法中有一些细节错误,如括号不匹配等! * 例:已知文法G[S] : S → (S)S|ε,求其SLR(1)的分析表,并判断( )( )∈L(G)? (3)SLR(1)分析表 (2)构造识别文法活前缀的DFA,并判断用何种方法进行分析 解: (1)拓广文法 (4)分析过程 注意:|ε|=0,所以用S → ε进行归约时,不用出栈,直接将S入栈即可。 LR(0)分析不了的,SLR(1)有可能能分析;LR(0)能分析的,SLR(1)都能分析! ■ 课堂练习 * 例:已知文法G[E] : E→E + n | n,请使用恰当的自下而上分析方法进行语法分析,并判断n+n∈L(G)? (3)SLR(1)分析表 (2)识别文法活前缀的DFA 解: (1)拓广文法 (4)分析过程 ■课后作业 例:已知文法G[S],求其SLR(1)的分析表,并判断( )( )∈L(G)? S → rD D?D,i | i (3)构造分析表 (2)识别文法活前缀的DFA 解: (1)拓广文法 (4)分析过程 * SLR(1)方法与LR(0)方法的区别仅在于有效项目集中有归约项目时: 在LR(0)方法中,若项目集Ik含有A???,则在状态k时,无论面临什么输入符号都用“A??”进行归约——即假定A??产生式编号为j,则在分析表ACTION部分,对应状态k行的所有栏目都填”rj”。 在SLR(1)方法中,若项目集Ik含有A???,则在状态k时,仅当输入符号为a∈FOLLOW(A)时,才用” A??”进行归约,这样在分析表ACTION部分状态k行,所有b不属于FOLLOW(A)的栏目将空出来。若正好在b这一列有移进项目不会产生冲突。 SLR(1)方法比LR(0)优越,它可以解决更多的冲突。 * 例:已知文法G[S],请判断 id :=id∈L(G)? S → id | V := E V→ id E → V | n ■ 引例 该文法的SLR[1]分析表中存在归约-归约冲突,该文法不能用SLR[1]分析方法进行分析。 所以要采用另一种新的方法——LR[1]分析方法对该文法进行语法分析。 由于用SLR(1)方法解决动作冲突时,它仅孤立地考察对于规约项目A?α. ,只要当前面临输入符号a∈FOLLOW(A)时,就确定使用规则A? α进行规约,而没有考察符号串α所在规范句型的环境。因为如果栈里的符号串为$δa,规约后变成$δA,当前读到的输入符号是a,若文法中不存在以δAa为前缀的规范句型,那么,这种规约无效。 LR(1)分析法的思想是在分析过程中,当试图用某一规则A?α规约栈顶的符号串α时,不仅应该查看栈中符号δα,还应向前扫视一个输入符号a,只有当δAa的确构成文法某一规

文档评论(0)

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

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

1亿VIP精品文档

相关文档