规范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)相关推荐

  1. 编译原理语法分析之LR分析

    要求: (1)根据给定文法,先对文法进行解析,构造识别活前缀的DFA并输出: (2)根据DFA构造LR分析表并输出: (3)分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程) (4) ...

  2. 【编译原理】LR语法分析器的设计与实现

    LR语法分析器的设计与实现 本文为当时编译原理实验作业,要求用设计的思想完成,小题大做,仅供参考 文章目录 LR语法分析器的设计与实现 实验要求 实现功能 输入输出 样例 一.LR语法分析器问题定义 ...

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

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

  4. [编译原理]构造LR分析器和SLR移进归约分析表

    目录 目标 1.基础知识引入 1.1 文法 1.2 拓广文法 1.3 全部的项目集 2. 计算文法的LR(0)项目集的.识别活前缀的DFA 2.1 分析得到各个项目集 2.2 构建SLR分析表中的移进 ...

  5. 编译原理:语法分析实验(LR分析法)

    语法分析实验 一.实验目的 根据LR分析法的原理,对指定文法构造识别活前缀的DFA,做出相应的LR分析表,并编程实现相应的语法分析程序.或根据预测分析法的原理,对指定文法构造预测分析表,并编程实现相应 ...

  6. 编译原理 --- 语法分析概念,自上而下分析面临的问题以及如何消除左递归问题

    第一部分 --- 语法分析基本概念 1.上面这个箭头 --> 符号表示的意思是P被 α 定义 A是一个非终止符,γ是一个和α,β属于同一个集合的元素 1.一个双箭头符号表示的是直接推出,而一个双 ...

  7. 编译原理 - 语法分析(自下而上分析)

    自下而上语法分析 两种语法分析对比 自下而上语法分析(Bottom-up) 核心思想 - (移进-规约) 移进 : 移进到栈里,当形成产生式时就弹出(规约) 规约 : 右部符号替换为左部符 移进-规约 ...

  8. 【编译原理】LR(0)分析方法(c++实现)

    基本流程 Created with Raphaël 2.2.0 输入文法 拓广文法 求项目集规范族 GO[I,a]转移函数 构造DFA (识别活前缀的自动机) LR(0)分析表 LR(0)分析输入串 ...

  9. 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器

    05-01: Introduction to Parsing 语法分析 parser的作用: 05-02: Context Free Grammars 上下文无关文法 CFG(上下文无关文法)回答了一 ...

  10. 编译原理 语法分析树和二义性文法

    语法分析树是用来描述语法中句子结构的一种树,它能够动态表示一个句子推导的过程. 我们来看一个例子:由左边的文法规则可知,这是一个实现加法减法和乘法的算术表达式.从开始符号E开始,逐步推导,E => ...

最新文章

  1. Qt——容器类(译)
  2. 输入防抖 vue # 输入搜索的时候 及时搜索的快速访问接口的 解决方案 vue 中使用防抖和节流
  3. OpenCV 车道线提取
  4. tensor也可以作为索引
  5. 吴恩达机器学习笔记一
  6. mysql调优explain_MySql性能调优利器之Explain
  7. 60-008-000-使用-命令
  8. 【图精】徐克镜头里的十大美人
  9. 【转载】如何知道自己适合做什么
  10. 从DCF到DCX:构想照进现实
  11. 每秒处理10万高并发订单的乐视集团支付系统架构分享
  12. android打开ofd文件
  13. MySQL读写分离、MySQL锁机制
  14. 天翼网关刷linux,天翼网关3.0-中兴F650光猫最新固件 开Telnet教程
  15. Cnetos linux镜像全版本2.X、3.X、4.X、5.X、6.X、7.X、8.X
  16. DCN可形变卷积实现1:Python实现
  17. 网站换服务器 备案,网站换服务器备案吗
  18. 拓扑容差如何修改_如何在CAD中通过设置容差参数对多段线进行自动修复重构
  19. 小米6怎样打开位置服务器,小米手环6gps定位功能在哪打开?经常无法定位怎么办...
  20. No387FirstUniqueCharacterInAString

热门文章

  1. 好的书籍乃进步的阶梯也
  2. linux查看数据库密码命令
  3. 枪杀5人 美国路易斯安那州枪击案嫌犯在弗州被捕
  4. reversing.kr学习之路-ransomeware
  5. 火车头采集器使用教程
  6. DIP数字图像处理笔记
  7. QQ9.4.3版本勋章墙补丁
  8. java九宫排序,九宫重排java
  9. 快速理解简单的短链接生成原理
  10. java英文字母排序_Java编程实现中英混合字符串数组按首字母排序的方法