学编译原理的时候,感觉什么LL(1)、LR(0)、SLR(1)、LALR(1)思想满天飞。

而且做题的时候,一不留意,一道题就写了三页纸了。

就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂了(差不多搞懂了)这是个什么玩意儿。

以下内容,做题的话应该够了而且很!容!易!理!解!,其他学术情况恕博主也是个菜鸡。

废话就不多扯了,能搜到看到这篇文章的小伙伴也不容易,挺有缘的,根据步骤想参考资料的话,就拿出你的《编译原理第二版·清华大学出版社》吧,第二版哦!我也不知道第三版一不一样,反正页数好像是不一样。

我这里就用书上现成的例子了吧,第二版的7.2.4 LR(0)项目集规范族的构造这节本身其实写得很详细很学术很看不懂。大概跟本文有关而且有意思很重要的内容是这样的:

现在得到了一个拓广文法G’(前面有介绍怎么求,很简单就加个S’的规则就行),好这势必是一个好的开头。

S’->E

E->aA | bB

A->cA | d

B->cB | d

接下来求文法的项目,这个也简单,就给每个规则加一个点以后然后挪位置,挪一个位置就得到一个项目,操作完了以后你就得到了一堆项目,这就是你接下来要面对的核心的东西了。

1.S’->·E 2.S’->E· 3.E->·aA 4.E->a·A 5.E->aA· 6.A->·cA 7.A->c·A 8.A->cA· 9.A->·d

10.A->d· 11.E->·bB 12.E->b·B 13.E->bB· 14.B->·cB 15.B->c·B 16.B->cB· 17.B->·d 18.B->d·

有关CLOSURE闭包的构造和转向函数GOTO(I,X)的定义小伙伴们自己看书吧,说实话你要真让我复述定义我也半吊子,但内涵理解了就做题没毛病了。不过还是要提到一个“核”的概念,你可以理解为那张图的每一个状态最头上那条规则。

接下来构造项目集规范族那张图的步骤是这样的:

把有S’的项目而且点在最左边的项目作为状态I0的核,放在开头。然后看这个点后面的非终结符,是个E,接下来就去项目中找左部是E的而且点在最左边开头位置的项目,列在核的下面,这就是状态I0了,你可以画个框框然后标记一下。

接下来还是先看核里面点后的这个非终结符E,输入E(你可以理解为在箭弧上标了个E),把点向后移一位,得到S’->E·,这其实是得到了一个新的状态的核。当然另外两个也一样,输入点后面的符号,比如输入a得到E->a·A为核的新状态,输入b得到E->b·B为核的新状态。得到新状态的核了,就顺便把这个状态剩下的项目也列出来吧,就是看核的点后面的非终结符,找以这个非终结符为左部的点在最左边的项目。当然要是点后面没有东西就不用找了,新的状态记得标号哦。


其实,讲到这里项目集规范族的构造方法部分就!完!了!接下来就是重复上面的工作,从每一个新状态出发,逐个输入每个项目点后面的符号,就是后移一位,又分别作为新的状态的核然后根据核找下面的同状态里的项目。找到找不动为止。比如我再找一个I2后面的试试:

当你求出整张图的时候,恭喜你万里长征走完第一步了,后面可能涉及到的LR(0)分析表的构造,本文就“请看下回分解”了。

分析表的构造
上回把文法的LR(0)项目集规范族搞了半天,革命进行了一半。

鼓捣了半天整了一堆项目集规范族出来,总是有用的呀,接下来就是在那堆的基础上构造分析表了,构造好分析表就能分析输入串了。本文主要讲LR(0)分析表的构造和输入串分析过程。

我这个菜鸡都觉得是通!俗!易!懂!的!!

憋说话往下看->

多的不扯,博(cai)主(ji)我使用的是清华大学出版社的《编译原理第二版》,第二版哦,不知道第三版的小伙伴内容是不是一样的,页数好像不一样我记得。在LR分析这一章的第二节后面,就是有项目集规范族那张图那儿,我们还是以那个文法为主题讲。

为了方便我直接为大家列好啦~

OK,这是上回我们构造好的项目集规范族,在构造分析表之前我们先画好分析表。

先写好ACTION和GOTO两个列标题,然后在ACTION下面写一排文法的所有的终结符,别忘了还有#,GOTO下面写文法中除了S’以外的所有的非终结符。

OK,接下来是这样的,书上也有详细的关于分析表构造算法的解释,说白了,其意思应该是这样的:

1、找项目集规范族有S’->A·这种形状的那个状态Ik,就是第k个状态,则把分析表第k行的#列标上acc

2、按顺序(我一般是按状态序号顺序)分析状态的项目和GOTO函数,主要就是看每个项目的点后面的符号。

(1)要是是个终结符,看输入这个终结符后去的哪个状态,比如当前是状态I0,对于第二个项目E->·aA,输入a以后去了状态I2,那就在分析表中第0行的a列写上S2,意思就是状态Ik输入Vt后去了Ij状态。

(2)要是是个非终结符,这个更好理解,比如从状态Ik输入这个非终结符以后去了状态Ij,那就在GOTO表的第k行第Vn列写j。

3、你会发现有的项目的点是在最后,这就是分析表里面那些小r的来历了。先看这个项目所在的状态,再看点前面的规则是文法里面的第几个规则,比如说状态I10的A->d·里面的A->d就是文法的第4条规则,那就在分析表的第10行所有的终结符列包括#列写上r4,就是ACTION列的一行写满。即状态Ik的项目来自于文法的第j条规则,则分析表的第k行都是rj。

我们具体试试吧:

1、先找acc,以免高兴过头了忘记。状态I1里面有S’->E·,所以acc在第1行。

2、按顺序开始看I0,第一个项目点后面是非终结符E,输入E前往状态I1,所以GOTO表的第0行第E列写1。第二个项目点后面是a,输入a以后前往I2,则ACTION表第0行第a列写S2。第三个项目点后面是b,输入b后前往I3,则ACTION表第0行第b列写S3。

3、状态I1有acc了,不管了。跳过看I2。同理,输入A的时候改GOTO表,输入c和d的时候改ACTION表,而且都是写S形式的。你会发现一直到I5都是这样。

4、状态I6,这是个点在最后面的项目,看前面的规则,是文法的第1个规则,那第6行就写一行r1。状态I7,点前面的规则是文法的第2条规则,则第7行写一行r2。同理到状态I11。

书中 的文法G是

E->aA|bB

A->cA|d

B->cB|d

所以这里的

r1代表E->aA

r2代表E->bB

r3代表A->cA

r4代表A->d

r5代表B->cB

r6代表B->d

即当 . 为结束时,就意味着有了一个可归纳的句柄,此时用ri代表的句型归纳

到这里该文法的LR(0)分析表就!构!造!完!了!

是不是很心累,要是看书看不懂听课犯糊涂更心累!别问我为啥知道…

顺便说说这个表又是拿来干嘛的吧,搞了半天当然是有用的有实际价值的是符合社会发展所需要求的。

输入串的分析过程,在实际的分析程序里面还有两个重要的辅助英雄角色,状态栈和符号栈。要是做题的话就写在草稿纸上吧,考试的时候应该也不会让你分析超长的串。分析前先往状态栈压一个0进去,符号栈压一个#进去,输入串最后加个#。

比如我要分析bccd,书上也有例子。

当前输入串bccd#,即将输入b,看状态栈顶,是0,去看分析表,第0行第b列是S3,不是r什么什么。好,把角标3压状态栈,b压符号栈,输入串少一个。

当前为ccd#,即将压c,状态栈顶为3,看分析表第3行第c列,是S5,好,5和c分别压栈。

当前为cd#,即将压c,状态栈顶为5,看分析表第5行第c列,是S5,好,5和c分别压栈。

当前为d#,即将压d,状态栈顶为5,看分析表第5行第d列,是S11,好,11和d分别压栈。

当前为#,即将压#,状态栈顶为11,看分析表第11行第#列,是r6。好,历史走到了转折点。赶紧去看文法的第6条规则,把符号栈顶归约为B,状态栈顶11弹出。然后再看状态栈顶5和符号栈顶B,GOTO表第5行第B列是9,记得在分析过程这一步的GOTO写9,然后把9压状态栈。这里要分清栈操作的先后顺序。

当前为#,即将压#,状态栈顶为9,看分析表第9行第#列,是r5,好,同上一个步骤找规则归约掉然后压栈,然后找GOTO表把新状态压栈。

重复上面的操作。

最后一步是这样的,状态栈顶为1,即将压#,分析表第1行第#列为acc,至此分析结束,bccd是该文法的产生式。

如果是错误串呢?

你放心,早做不下去了,崩了。

以上用于知道怎么做题

再贴道题目

6、证明文法 S ® bB B® B*a B ® a

不是LR(0)文法,而是 SLR(1)文法。

【解】

①对该文法拓广,得其拓广文法G[S’]:

 (0) S’→S     (1) S ->bB      (2) B-> B*a  (3) B -> a

②计算其LR(0)项目集规范族如下:

I0 = closure{ S’→.S } ={ S’→.S , S→. bB }

I1 = GOTO(I0,S) = { S’→S.}

I2 = GOTO(I0,b) = { S→b.B,B-> .B*a,B -> .a }

I3 = GOTO(I2,B) = { S→bB.,B-> B.*a }

I4 = GOTO(I2,a) = { B -> a. }

I5 = GOTO(I3,) = { B-> B.a }

I6 = GOTO(I5,a) = { B-> B*a. }

③ 因为该文法的LR(0)项目集规范族中有一个项目集I3同时存在移进项目与归约项目,即“移进-归约”冲突,所以不是LR(0)文法。

 I3  = { S→bB.,B-> B.*a }

而,FOLLOW(S)={ # }

Follow(S) ∩ { * } = φ

即可采用Follow集能解决其冲突,所以该文法是SLR(1)文法。

转载于https://blog.csdn.net/Johan_Joe_King/article/details/79051993

编译原理LR(0)项目集规范族的构造和分析的构造相关推荐

  1. 编译原理LR(0)项目集规范族的构造详解

    学编译原理的时候,感觉什么LL(1).LR(0).SLR(1).LALR(1)思想满天飞. 而且做题的时候,一不留意,一道题就写了三页纸了. 就拿今天这个玩意儿来讲,我真的是考试前花了最多的时间,搞懂 ...

  2. 编译原理中LR(0)项目集规范族的构造

    本文转载自:  http://www.cnblogs.com/lazycoding/archive/2012/05/12/2497065.html 此文略长.我也没想到这写起来这么多,但对构造过程绝对 ...

  3. LR(0)项目集规范族的构造及LR(0)分析表的构造

    求出文法的所有项目,按一定规则构造识别活前缀的NFA, 再确定化为DFA确定化的工作量较大,而且容易出错,实际应用中并不使用,这里介绍的目的仅仅是为了便于理解.具体见识别活前缀的有限自动机构建方法_用 ...

  4. LR(0)项目集规范族和分析表的构造

    1. LR分析 LR分析是干什么用的?简单来说就是你在编程时编译器用来判断你输入的符号串是否合法以及时哪一种类型.官方的说法时LR分析是一种能根据当前分析栈中的符号串和向右顺序查看输入串的k个符号就能 ...

  5. 编译原理lr(0)c语言,关于编译原理:LR(1)LR(0)文法判断?

    "编译原理"是大学计算机类专业的一门主干课程.设置本课程的目的,在于系统的向学生讲述编译系统的结构.工程流程以及编译程序各组成部分的设计原理和实现技术,使学生通过本课程的学习,既掌 ...

  6. 编译原理 LR分析(主要是LR(0)分析)

    一.LR分析的基本原理 1.LR分析的基本思想 LR方法的基本思想就是,在规范归约的过程中,一方面要记住已移进和归约出的整个字符串,也就是说要记住历史:一方面能够根据所用的产生式的推测未来可能碰到的输 ...

  7. 编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析)

    编译原理,C语言实现LR0分析扩展文法的生成.项目集规范簇的生成.ACTION GOTO表的生成.句子的分析 演示 演示所用文法和句子 (1)根据提示输入文法的个数 (2)输入文法 (3)扩展文法的生 ...

  8. 编译原理第一个项目——个人所得税PersonalTax

    1.实验目的 本实验面向 Java 语言的初学者,假设学生已掌握结构化程序设计方法,对面向对象程序设计方法有初步了解.学生最好至少已掌握一门 Java 之外的面向对象程序设计语言,例如 C++或 Sm ...

  9. 【C++实现】编译原理 免考小队 FIRSTVT集生成算法

    背景 期末考试免考,冲! 实验名称 FIRSTVT集生成算法 实验时间 2020年6月3日 到 2020年6月9日 院系 信息科学与工程学院 组员姓名 Chocolate.kry2025.钟先生.le ...

最新文章

  1. linux shell合并文件命令paste
  2. debian虚拟机装上后开机不行_华为MT9进水不开机, 一步一个“坑”把掌柜修的也是无语,想发火...
  3. Direct2D (23) : 复合几何对象之 ID2D1GeometryGroup
  4. 06.系统编程-2.线程
  5. vsphere通用配置_Mac环境下如何用Hexo+Github搭建个人博客
  6. spring的AOP配置之XML方式
  7. Postgresql 截取字符串
  8. java session失效之后跳转,session失效后如何实现页面不跳转到主页而是跳转到session失效时的页面...
  9. IDEA-Maven的Dependencies中出现红色波浪线
  10. keil5.36设置GB2312编码后无法修改字体的解决方法——2022.04.04
  11. 加速打开win10自带图片查看器
  12. Hive实战之视频网站数据分析
  13. 2013 ACM-ICPC南京赛区全国邀请赛
  14. python crc16-ccitt
  15. Vue中的@blur和@focus事件
  16. 国家气象局天气预报城市及城市代码
  17. hbase major compact脚本
  18. 自绘按钮实现颜色选择器
  19. 华为服务器安装乌班图系统,安装乌班图服务器版本
  20. 请求消息详解(请求头、get、post、请求体)

热门文章

  1. 国产达梦数据库学习笔记(一):NeoKylin7.0安装及配置与常用基础命令
  2. 蛇形矩阵 java_Java实现打印二维蛇形矩阵(螺旋矩阵)。
  3. 机器学习之Naive Bayes算法:日撸Java三百行day58-59
  4. Chinaren校友录
  5. jconsole是否可以在生产环境使用_使用rmi jmx JCONSOLE远程监控JVM
  6. android 好的 钢琴软件,真正完美的android钢琴软件
  7. 制作pDF 格式电子书
  8. steam进不了社区错误代码-102
  9. html插件 开发工具,前端开发必备工具之辅助开发工具篇
  10. 云与海计算机谱,天谕手游云与海乐谱_云与海乐谱代码分享_3DM手游