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日
    浏览(45)
  • 【编译原理】LR(1)分析法:C/C++实现

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月07日
    浏览(38)
  • 数据结构例题代码及其讲解-递归与树

    ​ 树的很多题目中都包含递归的思想 递归 递归包括 递归边界 以及 递归式 即:往下递,往上归 递归写法的特点: 写起来代码较短,但是时间复杂度较高 01 利用递归求解 n 的阶乘。 02 斐波那契数列是满足 F(0)=1,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)的数列,数列的前几项为 1,1,2,

    2024年02月09日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包