LR(0)文法分析(通过例题穿插讲解)

这篇具有很好参考价值的文章主要介绍了LR(0)文法分析(通过例题穿插讲解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

LR(0)文法的字面含义

LR(0)分析表的构造

写在最后


LR(0)文法的字面含义

LR(0)分析法是其他LR分析法构造的基础,L表示从左往右扫描,R表示反向构造出一个最右推导,k表示向前看k个字符,缺省为1。在学习LR(0)分析时,首先要了解几个概念:分析表(包括动作ACTION,和状态转移GOTO两个部分),分析栈(包括文法分析栈和状态栈),下面是LR(0)分析器工作过程示意图:

LR(0)文法分析(通过例题穿插讲解)

然后最重要的是在进行文法分析是可能产生的动作:移进(shift),规约,接受(accept,简称acc),报错。

LR(0)分析表的构造

在了解了上面的基本概念后就可以开始构造分析表了,下面是一个例题。

给出文法G[S]为:

(1)S->aAcBe

(2)A->Ab

(3)A->b

(4)B->d

1)构造识别活前缀的DFA

2)构造LR(0)分析表

3)对输入串abbcde#进行分析。

 1)首先先写出他的拓广文法(拓广文法:在初始状态的前面加上一个S',如这里的S'->S就是拓广出来的,拓广文法的作用就是让构造的DFA只有一个初态和终态,例如在这个文法中初态:S'->·S,终态(acc):S'->S·),

 LR(0)文法分析(通过例题穿插讲解)

然后是DFA的构造:主要是分清楚·符号在哪个位置:(1)在非终结符的前面,状态集要增加,如:下面的表中的I2状态,由于·符号后面是非终结符A,就要增加以A开始的状态集。(2)在终结符的前面,状态集不变,如I3状态,·符号后面是终结符c,I3状态不变(3)在末尾,是规约状态。如I8。 

LR(0)文法分析(通过例题穿插讲解)

2) 对输入串abbcde#进行分析首先要构造LR(0)分析表,就是将上面的DFA按照规则填入表中:ACTION是遇到终结符,GOTO是遇到非终结符,Si意思是移进,并且i进入状态栈,ri表示用第i个式子规约,根据情况看哪些状态要出栈,i指的是上面拓广文法的前面标号。

LR(0)文法分析(通过例题穿插讲解)

3)分析过程在上面这张图的下半部分,具体步骤是:

(1)首先状态栈有0,根据LR(0)分析表状态0遇到输入串的第一个a,ACTION为S2,a进入符号栈。

(2)状态栈栈顶是2,遇到b,ACTION是S4,4进入状态栈,b进入符号栈。

(3)状态栈栈顶是2,遇到b,ACTION是r2(注意这里b不进入符号栈),利用第二个式子来规约,A进入符号栈,4状态出栈,然后栈顶是2,遇到A,GOTO是3,3进入状态栈。(这里加粗是因为进行了两步才完成,下面只分析两步的)

(4)……

(5)状态栈栈顶是6,遇到c,ACTION是r3(注意这里c不进入符号栈),利用第三个式子来规约,A进入符号栈,3、6状态出栈,然后栈顶是2,遇到A,GOTO是3,3进入状态栈

(6)……

(7)……

(8)状态栈栈顶是8,遇到e,ACTION是r4(注意这里e不进入符号栈),利用第四个式子来规约,B进入符号栈,8状态出栈,然后栈顶是5,遇到B,GOTO是7,7进入状态栈

(9)……

(10)状态栈栈顶是9,遇到#,ACTION是r1(注意这里#不进入符号栈),利用第一个式子来规约,S进入符号栈,2、3、5、7、9状态都要出栈,然后栈顶是0,遇到S,GOTO是1,1进入状态栈

(11)状态栈栈顶是1,遇到#,ACTION是acc,说明该串的输入分析结束了,结果是接受状态。

写在最后

希望大家看完有所收获,如果有错误的话,欢迎大家在评论区指出,共勉。

LR(0)文法分析(通过例题穿插讲解)文章来源地址https://www.toymoban.com/news/detail-460729.html

到了这里,关于LR(0)文法分析(通过例题穿插讲解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

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

    2024年02月09日
    浏览(37)
  • 编译原理-6-LR语法分析器

    自顶向下的、不断归约的、基于句柄识别自动机的、适用于LR(∗) 文法的、LR(∗) 语法分析器 只考虑无二义性的文法 自底向上 构建语法分析树 根节点 是文法的起始符号 S S S 每个中间 非终结符节点 表示 使用它的某条产生式进行归约 叶节点 是词法单元$w$$ 仅包含终结符号与

    2024年02月05日
    浏览(46)
  • 【编译原理】LR(1)分析法:C/C++实现

    🌈 个人主页: Sarapines Programmer 🔥 系列专栏: 《编译原理奇遇记》 🔖墨香寄清辞:空谷幽篁风动,梦中仙鹤月明。 辗转千秋豪情在,乘风翱翔志不移。 目录结构 1. 编译原理之LR(1)分析法概念 1.1 编译原理 1.2 LR(1)分析法 2. 逆波兰式的产生及计算 2.1 实验目的 2.2 实验要求

    2024年02月03日
    浏览(39)
  • 【例题讲解】拓扑序列求解过程

    拓扑序列的含义:是求 有向无环图 的 拓扑序列 的方法。 拓扑序列过程:在有向图中任取一个入度为0的顶点,然后将它的值存入拓扑序列中,最后将该顶点以及以该顶点为弧尾的弧全部删掉。随后重新任取一个入度为0的顶点重复上述过程,直到没有一个入度为0的顶点或者

    2024年02月02日
    浏览(91)
  • 微机原理 || 8253 芯片 (详细讲解 + 经典例题)

    一点点看!一定可以看懂!考试没有问题的!加油💪 前面知识写的详细,看不懂可以先看 典例 ,回头来梳理就明白了【典例就是常考的题】 目录 Part 1: 芯片知识总结  (一)8253 芯片特点 (二) 8253芯片引脚功能      知道才好编程 (三) 8253编程 (1)8253 初始化 ① 工

    2024年02月01日
    浏览(53)
  • 数据结构例题代码及其讲解-链表

    单链表的结构体定义及其初始化。 ①强调结点 LNode *p; ②强调链表 LinkList p; 01 遍历打印 02 按位查找(有一个带头结点的单链表 L,请设计一个算法查找其第 i 个结点位置,若存在则返回指向该结点的指针,若不存在则返回 NULL。) 03 按值查找(有一个带头结点的单链表 L,请

    2024年02月10日
    浏览(54)
  • 算法 动态规划 及Java例题讲解

    动态规划 (英语:Dynamic programming,简称 DP ),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题 。 简单来说,动态规划其

    2024年01月22日
    浏览(44)
  • c++详解递归算法-全网最全+例题讲解

    什么是递归? 递归的思想是什么? 什么时候该用递归? 使用递归需要注意哪些问题? 递归思想解决经典问题 递归和循环的区别是什么? 递归算法: 定义:直接或间接地出现对自身的调用 本质:递归即 递进 与 回归, 基本思想就是把规模大的问题转化为规模小的相似的子

    2024年02月07日
    浏览(38)
  • 数据结构例题代码及其讲解-顺序表

    静态分配内存及初始化 动态分配内存及初始化 01 对顺序表L进行遍历并输出每个数据元素的数据值 02 假设有一个顺序表L,其存储的所有数据元素均为不重复的正数,查找 L 中值为 e 的数据元素,若找到则返回其下标,若找不到则返回-1。 03 假设有一个顺序表 L,其存储的所有

    2024年02月10日
    浏览(39)
  • 整数规划、对偶理论、线性规划经典例题讲解

    整数规划是一类要求问题的解中的全部或一部分变量为整数的数学规划,应用范围极其广泛。不仅在工业和工程设计和科学研究方面有许多应用,而且在计算机设计、系统可靠性和经济分析等方面也有新的应用。 通过前面的学习,我们已经掌握了整数规划的数学模型、割平面

    2024年02月05日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包