编译原理--语法分析:LR(1)
规范LR(1)项
对LR(0)中本来需要归约的行为,再往前看一步,考察归约后,
下一步是否会报错.
入股归约后下一步不会报错,按LR(0)进行归约.
否则,不进行归约.正式地将,
可行前缀&有效项是LR(0)的概念.说LR(1) 项 [A->α.β, a]对于一个 可行前缀γ 有效的条件是
存在一个推导 S=>^{*}_{rm} δAω =>_{rm} δαβω,其中
1.γ = δα,且
2.要么a是ω的第一个符号,要么ω为ε且a等于$如果在遇到a,对A按αβ进行归约,
归约后Aa必须是合法的.LR(1)对可行前缀解释和LR(0)一致,
对可行前缀的有效项,进一步提供了一个终结符号.
因为LR(1)会对可行前缀,继续接受0个或多个文法符号可以按有效项进行归约的行为,
多看一步.
即看归约后的句型,结合下一待处理终结符号是否会报错.
不同终结符号下结果可能是不同的.
所以,有效项需要结合每个可能出现的终结符号,给出关于此终结符号下的结果.
构造LR(1)项集
基本和LR(0)项集族相同.
需修改CLOSURE和GOTO.考虑对某些 可行前缀γ 有效的项集合中的一个形如[A->α.Bβ, a]的项,
则必然存在一个最右推导
S=>^{*}_{rm} δAax =>_{rm} δαBβax,
其中γ = δα.
假设βax推导出终结符号串by,
则对某个形如B->η的产生式,
有推导S=>^{*}_{rm} γBby =>_{rm} γηby.
因此,[B->.η, b]是 γ 的有效项.LR(0)可行前缀
可行前缀的有效项,
意味着,继续接收有效项.后的0个或多个文法符号后,
应该按有效项产生式进行一次归约.
LR(1)项集族的构造方法
输入:一个增广文法G'
输出:LR(1)项集族,其中的每个项集对文法G'的一个或多个可行前缀有效
方法:
过程CLOSURE和GOTO,及用于构造项集的主例程items
SetOfItems CLOSURE(I)
{repeatfor(I中的每个项[A->α.Bβ, a])for(G'中的每个产生式B->γ)for(FIRST(βa)中的每个终结符号b)将[B->.γ, b]加入到集合I中until 不能向I中加入更多的项return I
}SetOfItems GOTO(I, X)
{将J初始化为空集for(I中的每个项[A->α.Xβ, a])将项[A->α.Xβ, a]加入到集合J中return CLOSURE(J)
}void items(G')
{将C初始化为{CLOSURE}({[S'->.S, $]})repeatfor(C中的每个项集I)for(每个文法符号X)if(GOTO(I, X)非空且不在C中)将GOTO(I, X)加入C中until 不再有新的项集加入到C中
}
规范LR(1)语法分析表
规范LR语法分析表的构造
输入:一个增广文法
输出:G'的规范LR语法分析表的函数ACTION和GOTO
方法:
1.构造G'的LR(1)项集族C'={I_{0}, ..., I_{n}}
2.语法分析器的状态i根据I_{i}构造得到
状态i的语法分析动作按下面规则确定
a.如 [A->α.aβ, b] 在I_{i}中,
且GOTO(I_{i}, a) = I_{j}
则ACTION[i, a]为移入j.
b.如 [A->α., a] 在I_{i}中,
且A != S',
则ACTION[i, a]为 归约A->α
c.如 [A->α., a] 在I_{i}中,
且A == S',[a应该是$]
则ACTION[i, a]为 接收如存在冲突,
说明对文法G,按LR(1)对其进行语法分析是不可行的.
3.状态i相对于各个非终结符号A的goto转换按以下规则得到
如GOTO(I_{i}, A) = I_{j},则GOTO[i, A] = j
4.没按2,3,得到的条目为报错
5.初始状态由含[S'->.S, $]的项集构造得到.
二义性文法
有些文法允许存在个别会导致二义性产生式,
可能理解上,实现上更友好.
此时,在语法分析实现时,可以对个别产生式特殊处理,
来消除二义性同时获得该文法理解上,实现上的优势.
编译原理--语法分析:LR(1)相关推荐
- 编译原理语法分析之LR分析
要求: (1)根据给定文法,先对文法进行解析,构造识别活前缀的DFA并输出: (2)根据DFA构造LR分析表并输出: (3)分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程) (4) ...
- 【编译原理】LR语法分析器的设计与实现
LR语法分析器的设计与实现 本文为当时编译原理实验作业,要求用设计的思想完成,小题大做,仅供参考 文章目录 LR语法分析器的设计与实现 实验要求 实现功能 输入输出 样例 一.LR语法分析器问题定义 ...
- 编译原理lr(0)c语言,关于编译原理:LR(1)LR(0)文法判断?
"编译原理"是大学计算机类专业的一门主干课程.设置本课程的目的,在于系统的向学生讲述编译系统的结构.工程流程以及编译程序各组成部分的设计原理和实现技术,使学生通过本课程的学习,既掌 ...
- [编译原理]构造LR分析器和SLR移进归约分析表
目录 目标 1.基础知识引入 1.1 文法 1.2 拓广文法 1.3 全部的项目集 2. 计算文法的LR(0)项目集的.识别活前缀的DFA 2.1 分析得到各个项目集 2.2 构建SLR分析表中的移进 ...
- 编译原理:语法分析实验(LR分析法)
语法分析实验 一.实验目的 根据LR分析法的原理,对指定文法构造识别活前缀的DFA,做出相应的LR分析表,并编程实现相应的语法分析程序.或根据预测分析法的原理,对指定文法构造预测分析表,并编程实现相应 ...
- 编译原理 --- 语法分析概念,自上而下分析面临的问题以及如何消除左递归问题
第一部分 --- 语法分析基本概念 1.上面这个箭头 --> 符号表示的意思是P被 α 定义 A是一个非终止符,γ是一个和α,β属于同一个集合的元素 1.一个双箭头符号表示的是直接推出,而一个双 ...
- 编译原理 - 语法分析(自下而上分析)
自下而上语法分析 两种语法分析对比 自下而上语法分析(Bottom-up) 核心思想 - (移进-规约) 移进 : 移进到栈里,当形成产生式时就弹出(规约) 规约 : 右部符号替换为左部符 移进-规约 ...
- 【编译原理】LR(0)分析方法(c++实现)
基本流程 Created with Raphaël 2.2.0 输入文法 拓广文法 求项目集规范族 GO[I,a]转移函数 构造DFA (识别活前缀的自动机) LR(0)分析表 LR(0)分析输入串 ...
- 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器
05-01: Introduction to Parsing 语法分析 parser的作用: 05-02: Context Free Grammars 上下文无关文法 CFG(上下文无关文法)回答了一 ...
- 编译原理 语法分析树和二义性文法
语法分析树是用来描述语法中句子结构的一种树,它能够动态表示一个句子推导的过程. 我们来看一个例子:由左边的文法规则可知,这是一个实现加法减法和乘法的算术表达式.从开始符号E开始,逐步推导,E => ...
最新文章
- Qt——容器类(译)
- 输入防抖 vue # 输入搜索的时候 及时搜索的快速访问接口的 解决方案 vue 中使用防抖和节流
- OpenCV 车道线提取
- tensor也可以作为索引
- 吴恩达机器学习笔记一
- mysql调优explain_MySql性能调优利器之Explain
- 60-008-000-使用-命令
- 【图精】徐克镜头里的十大美人
- 【转载】如何知道自己适合做什么
- 从DCF到DCX:构想照进现实
- 每秒处理10万高并发订单的乐视集团支付系统架构分享
- android打开ofd文件
- MySQL读写分离、MySQL锁机制
- 天翼网关刷linux,天翼网关3.0-中兴F650光猫最新固件 开Telnet教程
- Cnetos linux镜像全版本2.X、3.X、4.X、5.X、6.X、7.X、8.X
- DCN可形变卷积实现1:Python实现
- 网站换服务器 备案,网站换服务器备案吗
- 拓扑容差如何修改_如何在CAD中通过设置容差参数对多段线进行自动修复重构
- 小米6怎样打开位置服务器,小米手环6gps定位功能在哪打开?经常无法定位怎么办...
- No387FirstUniqueCharacterInAString