编译原理根据项目集规范族构造LR(0)分析表
转载于https://blog.csdn.net/Johan_Joe_King/article/details/79058597?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3
上回把文法的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。
到这里该文法的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是该文法的产生式。
如果是错误串呢?
你放心,早做不下去了,崩了。
菜鸡写篇博客挺不容易的
如果内容有误请小伙伴们在下方评论区指出
编译原理根据项目集规范族构造LR(0)分析表的更多相关文章
- LR(0)文法项目集规范族、DFA和分析表的构建实例
最近在复习编译原理,考试之前以为自己懂了,眼高手低就没去实践.结果一考试出问题了.... 学习就要脚踏实地,容不得半点模糊.凭着侥幸心理很危险的.以后要引以为戒啊. 特别写出这篇文章 :一来总结一下这 ...
- 编译原理LR(0)项目集规范族的构造详解
转载于https://blog.csdn.net/johan_joe_king/article/details/79051993#comments 学编译原理的时候,感觉什么LL(1).LR(0).S ...
- 《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析
<编译原理>LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析 笔记 直接做题是有一些特定步骤,有技巧.但也必须先了解一些基本概念,本篇会通过例题形式解释概念,会容易理解和记忆,以 ...
- 《编译原理》构造 LL(1) 分析表的步骤 - 例题解析
<编译原理>构造 LL(1) 分析表的步骤 - 例题解析 易错点及扩展: 1.求每个产生式的 SELECT 集 2.注意区分是对谁 FIRST 集 FOLLOW 集 3.开始符号的 FOL ...
- Android 7.0 启动篇 — init原理(二)(转 Android 9.0 分析)
======================================================== ================================== ...
- egrep命令的实现 分类: 编译原理 2014-06-01 23:41 329人阅读 评论(0) 收藏
本程序实现了egrep命令,首先将正则表达式转换为NFA,并实现模拟NFA的算法. 本程序使用flex实现词法分析,bison实现语法分析 若给定的一行字符串中存在一个字串能被该NFA接受,则输出整行 ...
- Android 7.0 启动篇 — init原理(一)(转 Android 9.0 分析)
======================================================== ================================== ...
- 求LR(0)文法的规范族集和ACTION表、GOTO表的构造算法
原理 数据结构 // GO private static Map<Map<Integer,String>,Integer> GO = new HashMap<Map< ...
- 编译原理(六)自底向上分析之LR分析法
自底向上分析之LR分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本概念 1. LR分析:从左到右扫描(L)自底向上进行规约(R),是规范规约,也即最右推导(规范推导) ...
随机推荐
- Java Web(2)-jQuery上
一.jQuery初体验 使用jQuery给一个按钮绑定单击事件 <!DOCTYPE html> <html lang="en"> <head> ...
- Residual Attention Network for Image Classification(CVPR 2017)详解
一.Residual Attention Network 简介 这是CVPR2017的一篇paper,是商汤.清华.香港中文和北邮合作的文章.它在图像分类问题上,首次成功将极深卷积神经网络与人类视觉注 ...
- SPRING 阅读--JdkDynamicAopProxy
一.简介 JdkDynamicAopProxy 代理类是spring 默认的JDK动态的代理类实现.它实现了Java 动态代理接口InvocationHandler接口和Spring定义的AopPro ...
- 解决移动端rem加载瞬间页面错乱的方法(放大或者缩小)
移动端布局有很多种,这里我们最常使用到rem+百分比的布局方式(高度/字体设置rem单位,宽度设置百分比)来处理屏幕兼容,这种方法在兼容上是比较不错的,可以使得字体以及整体适应各种大小的屏幕,可以解决 ...
- PHP sqrt() 函数
实例 返回不同数的平方根: <?phpecho(sqrt(0) . "<br>");echo(sqrt(1) . "<br>"); ...
- PHP xpath() 函数
定义和用法 xpath() 函数运行对 XML 文档的 XPath 查询.高佣联盟 www.cgewang.com 如果成功,该函数返回 SimpleXMLElements 对象的一个数组.如果失败, ...
- PDOStatement::fetchColumn
PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列.(PHP 5 >= 5.1.0, PECL pdo >= 0.9.0)高佣联盟 www.cgewa ...
- Java8的@sun.misc.Contended注解
@sun.misc.Contended 介绍 @sun.misc.Contended 是 Java 8 新增的一个注解,对某字段加上该注解则表示该字段会单独占用一个缓存行(Cache Line). 这 ...
- JAVA设计模式 5【结构型】代理模式的理解与使用
今天要开始我们结构型 设计模式的学习,设计模式源于生活,还是希望能通过生活中的一些小栗子去理解学习它,而不是为了学习而学习这些东西. 结构型设计模式 结构型设计模式又分为 类 结构型 对象 结构型 前 ...
- C++文件操作和模板
1.数据层次 位 bit 字节 byte 域/记录 将所有记录顺序地写入一个文件---->顺序文件:一个有限字符构成的顺序字符流 C++标准库中:ifsteam,ofstream,fstream ...