LR(0)分析和SLR
①栈顶出现句柄时规约,否则移入。
②移入项目、代约项目、归约项目
1.引入开始符,得到增广文法,并且给每个式子编号。(即如果文法开头不是一个非终结符到另一个非终结符的产生式则需要加入,如加入 S’->·S )
2.然后需要构造 LR(0)自动机,首先将增广文法增加的产生式加入I0状态当中,并且加入了一个圆点,圆点后的符号是即将处理的符号,然后将待处理的符号在蕴涵式左边的字母写出来(例如I0的E、T、F)。然后按照圆点后要处理的字母都引出一个箭头指向下一个状态。当S’->S·的时候,是accept(如下图)。
3.然后构造 LR(0)分析表
规则如下:列是状态数,action行是终结符,GOTO是非终结符。
填归约的时候,如果已经可以规约了,那么要在归约的规则左部的follow集的元素里面填上rj,其中j是之前给每个式子编的号。
4.判断是不是LR(0)文法
如果文法对应的自动机中不存在移进-归约冲突和归约-归约冲突则为 LR(0)文法。换句话说LR(0)文法分析不能解决这两种冲突,所以范围最小。移进-归约冲突就是在同一个项集族中同时出现了可以移进的产生式和可以归约的产生式。归约-归约冲突类似。
(就是只能有移入项目或者只有一个规约项目)
5.判断是不是SLR文法
SLR文法分析过程可以解决归约-归约冲突,但是不一定能解决移进-归约冲突。
所以当有出现移进-归约冲突(接受也算归约),要把规约的产生式左部的follow集和移进的非终结符进行相交,若空集,则冲突可解决)
LR(0)有时候在分析的时候可以不需要使用状态转换机,可以构建状态转换表。
#表示的是归约项目达成。
SLR(1)可以构建表来分析。
其中空串不要显示。
而且若达到归约项目,要求出例如S0状态的A的follow集,后继符号里面就是那个。
LR(0)处理输入输入的各个步骤
这个结合分析表会很好写的。
首先应该明确的就是stack栈和symbols栈是相同的,二者同增同减。
输入栏首先为id,第一行栈值为0,对应LR(0)自动机为I0,I0从id到I5,所以第二行stack增加一个5。然后第二行开始,符号表增加id,action是那个项目集的产生式。然后是规约按照产生式,第三行id变成F,并且由于id弹出,stack中5也弹出,然后以0为状态,F是到5,所以stack中增加一个5。倒二行中,因为symbols中减少两个,所以stack中也减少两个。
LR(0)分析和SLR相关推荐
- 【编译原理笔记06】语法分析,移入-归约分析:自底向上的分析,LR(0)分析法,LR(0)分析表的构建(基于自动机)
本次笔记内容: 4-8 自底向上的分析概述 4-9 LR分析法概述 4-10 LR0分析 4-11 LR0分析表构造 本节课幻灯片,见于我的 GitHub 仓库:第6讲 语法分析_3.pdf 本节课介 ...
- 编译原理学习笔记(七)~LR(0)分析
LR(0) 项目 解释:右部某位置标有圆点的产生式称为相应文法的一个LR(0)项目(简称为项目) 举例说明:S–>bBB则可以推导出4个项目 注: 项目描述了句柄识别的状态 产生式A→ε 只生成 ...
- 编译原理 实验四 LR(0)分析法(LR0分析表的自动生成)
写在前面 由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客. https://blog.csdn.net/qq_46640863/article/details/1257 ...
- LR(0)项目集规范族的构造及LR(0)分析表的构造
求出文法的所有项目,按一定规则构造识别活前缀的NFA, 再确定化为DFA确定化的工作量较大,而且容易出错,实际应用中并不使用,这里介绍的目的仅仅是为了便于理解.具体见识别活前缀的有限自动机构建方法_用 ...
- 【LR(0)分析】LR(0)算法的分析与设计
LR(0)算法的模拟实现 一.实验目的 通过设计.编写和构造LR(0)项目集规范簇(识别文法全部活前缀的DFA)和LR 分析表.对给定的符号串进行LR 分析的程序,了解构造LR(0)分析表的步骤,对文 ...
- LR(0)分析表的构建
LR(0)分析表的构建 一.实验要求 构建LR(0)分析表 例: G[E]: E->aA E->bB A->cA A->d B->cB B->d 二.实验原理 在网 ...
- 【编译原理】 LR(0) 分析表
LR(0) 步骤 1. 写成 拓广文法 (S'→ S) 2. 活前缀的 DFA(靠近.后面的非终结符) 看状态Ii里面,是不是只存在一个规约项目.如果有两个规约项目,就是规约--规约冲突:如果同时有规 ...
- 【编译原理】LR(0)分析方法(c++实现)
基本流程 Created with Raphaël 2.2.0 输入文法 拓广文法 求项目集规范族 GO[I,a]转移函数 构造DFA (识别活前缀的自动机) LR(0)分析表 LR(0)分析输入串 ...
- 编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析)
编译原理,C语言实现LR0分析扩展文法的生成.项目集规范簇的生成.ACTION GOTO表的生成.句子的分析 演示 演示所用文法和句子 (1)根据提示输入文法的个数 (2)输入文法 (3)扩展文法的生 ...
最新文章
- 函数的重载 - C++快速入门06
- 當前主流防拷光碟的備份
- 深度学习的非主流应用
- C#提取HTML代码中的文字(转)
- eas库存状态调整单不能反审核_审核与反审核
- 阿里巴巴AI夺肝结节诊断两项世界冠军,至今无人超越
- PAT-1127. ZigZagging on a Tree (30)
- [scikit-learn 机器学习] 6. 逻辑回归
- 学习Spark——那些让你精疲力尽的坑
- 几个容器网络相关问题的分析和解决总结
- SDN时代更需要有保障的网络
- POSIX 信号量和互斥锁
- Java实现简易文本编辑器
- html制作免费体验登录页面,Html制作简单而漂亮的登录页面
- matlab 排序函数sort()
- leetcode 904 水果成篮
- 计算机多媒体培训总结,教师多媒体培训心得体会3篇
- (笔试题)风口的猪-中国牛市
- 【Visual C++】游戏开发笔记三十七 浅墨DirectX提高班之五 顶点缓存的红颜知己 索引缓存的故事
- 挺带劲!通过 Nginx 来实现封杀恶意访问