U4_3 语法分析-自底向上分析-LR0/LR1/SLR分析

文章目录

  • 一、LR分析法
    • 1、概念
    • 2、流程
    • 3、LR分析器结构及分析表构造
      • 1)结构
      • 2)一些概念
  • 二、LR(0)分析法
    • 1、流程
    • 2、分析动作
      • 1)移近
      • 2)归约(reduce)
    • 3、总结
      • 1)LR分析器
      • 2)构造DFA
      • 3)构造LR(0)的方法(三步)
    • 4、局限性
  • 三、LR(1)分析法
  • 四、SLR(1):简单LR分析法
    • 1、基本思想
    • 2、分析思路
      • 1)构建表
      • 2)SLR求ACTION表
    • 3、局限性
  • 五、彩蛋

一、LR分析法

1、概念

是一种自底向上的分析方法(1965年 D.Knuth 提出)。
L:从左向右分析 (left to right)
R:产生“最右推导”(right-most derivation)
k=0:不向前查看符号     k=1:向前查看1个符号
从左到右扫描(L)自底向上进行归约(Right-most Derivation)(一定是规范归约), 是自底向上分析方法的高度概括和集中
历史 + 展望 + 现状 => 句柄

2、流程

根据文法不断进行移进或者规约
在这里插入图片描述
规约后回退状态,且得到的终结符也需要回退
在这里插入图片描述

3、LR分析器结构及分析表构造

1)结构

状态栈、分析表、控制程序
在这里插入图片描述
栈顶状态概括了从分析开始到该状态的全部分析历史和展望信息

2)一些概念

符号串 X 1 X 2 . . . . . X m X_1X_2..... X_m X1X2.....Xm:从开始状态( S 0 S_0 S0)到当前状态( S m S_m Sm)所识别的规范句型的活前缀。

规范句型前缀: 将输入串的剩余部分与其连接起来就构成了规范句型。
如: x 1 x 2 . . . . . x m a i . . . a n x_1x_2..... x_ma_i... a_n x1x2.....xmai...an为规范句型( x i x_i xi已处理, a i a_i ai未处理)

对于句型 α β t αβt αβt β β β表示句柄, 如果 α β = u 1 u 2 … u r αβ= u_1u_2…u_r αβ=u1u2ur那么符号串 u 1 u 2 … u i ( 1 ≤ i ≤ r ) u_1u_2…u_i(1≤i≤r) u1u2ui(1ir)即是句型 α β t αβt αβt的活前缀。
在这里插入图片描述

活前缀: 若分析过程能够保证栈中符号串均是规范句型的前缀,则表示输入串已分析过的部分没有语法错误,所以称为规范句型的活前缀。

二、LR(0)分析法

1、流程

根据状态转移图得出状态转移表
在这里插入图片描述
状态栈:# S 0 x 1 S 1 x 2 . . . . . . x i − 1 S i − 1 x i S i S_0x_1S_1x_2...... x_{i-1}S_{i-1} x_iS_i S0x1S1x2......xi1Si1xiSi
S i − 1 S_{i-1} Si1—当前状态(栈顶状态)
x i x_i xi— 新的栈顶符号
S i S_i Si----新的栈顶状态(状态转移)

2、分析动作

1)移近

A C T I O N [ S i , a ] = s ACTION[S_i,a] = s ACTION[Si,a]=s (s表示 s h i f t shift shift,移进)
动作: 将 a a a推进栈,并设置新的栈顶状态 S j S_j Sj
S j = G O T O [ S i , a ] S_j= GOTO[S_i,a] Sj=GOTO[Si,a],将指针指向下一个输入符号

2)归约(reduce)

A C T I O N [ S i , a ] = r d ACTION [S_i,a] = r_d ACTION[Si,a]=rd (r表示 reduce,按规则d规约)
条件:某个项目集形如 A → β A→β Aβ.
动作: 将符号串β(假定长度为 n n n)连同状态从栈内
弹出, 把 A A A推进栈, 并设置新的栈顶状态 S j S_j Sj
S j = G O T O [ S i − n , A ] S_j= GOTO[S_{i-n},A] Sj=GOTO[Sin,A]

3、总结

1)LR分析器

构造LR分析器的关键是构造其分析表
构造LR分析表的方法是:

  1. 根据文法构造识别规范句型活前缀的有穷自动机DFA
  2. 由DFA构造分析表

2)构造DFA

在这里插入图片描述
构造DFA:
4. 确定 S S S集合,即 L R ( 0 ) LR(0) LR(0)项目集规范族,同时确定 S 0 S_0 S0
5. 确定状态转移函数GOTO

LR(0) 是DFA的状态集,其中每个状态又都是项目的集合

项目:文法G的每个产生式(规则)的右部添加一个圆点就构成一个项目
在这里插入图片描述

3)构造LR(0)的方法(三步)

  1. 将文法拓广
    目的:使构造出来的分析表只有一个接受状态,这是为了实现的方便。
    在这里插入图片描述
  2. 根据文法列出所有的项目
  3. 将有关项目组合成集合,即DFA中的状态;
    所有状态再组合成一个集合,即LR(0)项目集规范族

举例分析:
在这里插入图片描述
3 将有关项目组成项目集,所有项目集构成的集合即为LR(0)
为实现这一步,先定义:
• 项目集闭包closure
• 状态转移函数GOTO
在这里插入图片描述
在这里插入图片描述

4、局限性

会存在两种冲突,导致LR(0)识别不出来

  1. Shift-Reduce冲突
    在这里插入图片描述
  2. Reduce-Reduce冲突
    在这里插入图片描述
    因此需要采用偷看解决问题, L R ( 0 ) → L R ( 1 ) LR(0) → LR(1) LR0LR1

三、LR(1)分析法

通过“偷看”一个右侧符号,在遇到冲突时辅助决定。
思路:将状态区分的更加细致,构造LR(1)的状态机。

优点就是可以将状态区分的更加细致,构造LR(1)的状态机。
优势:功能强大!任何LR(0)、LL(1)、确定型CFL、LL(k)、LR(k)都有LR(1)的等价文法。

主要问题:状态爆炸,实用性差。

四、SLR(1):简单LR分析法

1、基本思想

由DFA构造出的SLR分析表,在造表时, 只需向前看一个符号就能确定分析的动作是移进还是归约,所以称为SLR(1)分析表,简称SLR分析表,使用SLR分析表的分析器叫SLR分析器,兼有LR(0)和LR(1)的优点,放弃一些精度。

在LR(0)的基础上,只针对冲突进行处理。

当发生 S-R冲突时,根据FOLLOW集合确定S还是R

2、分析思路

1)构建表

先构造LR(0)的自动机,GOTO表。

2)SLR求ACTION表

  1. 求出文法每个非终结符的FOLLOW集合
  2. 若项目 A → α . a β ∈ k A→α.aβ ∈k Aα.aβk,且 a ∈ V t a ∈V_t aVt ,则置 A C T I O N [ k , a ] = s ACTION[k,a] = s ACTION[k,a]=s (移进)
  3. 若项目 A → α . ∈ k A→ α.∈k Aα.k, 那么对输入符号 a a a,若 a ∈ F O L L O W ( A ) a∈FOLLOW(A) aFOLLOW(A),则置 A C T I O N [ k , a ] = r j ACTION[k,a]=r_j ACTION[k,a]=rj,其中 A → α A→ α Aα为文法 G ’ G’ G的第j个产生式。
  4. 若项目 E ’ → E . ∈ k E’→E.∈k EE.k, 则置 A C T I O N ACTION ACTION[ k , k , k,#] = a c c e p t =accept =accept
  5. 空白格,均置error
    在这里插入图片描述
    看到 f o l l o w follow follow应该做规约(已经跳出表达式了)

3、局限性

在这里插入图片描述
F O L L O W ( R ) FOLLOW(R) FOLLOW(R)中有=,应该做规约,但是碰到=,E中表达式应该移进,因此还是冲突。

对文法G,若应用上述算法所造出的分析表具有多重定义入口,分析动作不唯一, 则文法G就不是SLR的,需要用别的方法来构造分析表。如下图
在这里插入图片描述

五、彩蛋

L L ( k ) LL(k) LL(k)是无二义性的, L L ( k ) LL(k) LL(k)文法识别的语言都是确定型下推自动机所识别的语言,但反之,不能保证任何一个确定型下推自动机 D P D A DPDA DPDA L L ( k ) LL(k) LL(k)等价

LL(k)文法总是一个LR(k)文法 L L ( k ) LL(k) LL(k) L R ( k ) LR(k) LR(k)的子集
在这里插入图片描述
定义上看,LR(0), LR(1), LR(k), SLR(1), LALR(1)等,要求构造出来的分析表是“确定性”的,也就是分析表不允许存在冲突,无二义性!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/312350.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【一分钟】ThinkPHP v6.0 (poc-yaml-thinkphp-v6-file-write)环境复现及poc解析

写在前面 一分钟表示是非常短的文章,只会做简单的描述。旨在用较短的时间获取有用的信息 环境下载 官方环境下载器:https://getcomposer.org/Composer-Setup.exe 下载文档时可以设置代理,不然下载不上,你懂的 下载成功 cmd cd…

【动态规划】【字符串】C++算法:正则表达式匹配

作者推荐 视频算法专题 涉及知识点 动态规划 字符串 LeetCode10:正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ’ 匹配零个或多个前面的那一个元素 所谓匹配,是…

大数据应用领域:数据驱动一切

大数据出现的时间只有十几年,被人们广泛接受并应用只有几年的时间,但就是这短短几年的时间,大数据呈现出爆炸式增长的态势。在各个领域,大数据的身影几乎无处不在。今天我们通过一些大数据典型的应用场景分析,一起来看…

C练习——爱因斯坦台阶问题(穷举法)

题目:爱因斯坦曾经提出过这样一道有趣的数学题:有一个长阶梯,若每步上2阶,最后剩下1阶;若每步上3阶,最后剩2阶;若每步上5阶,最后剩下4阶;若每步上6阶,最后剩5…

浅析xxl-obj分布式任务调度平台RCE漏洞

文章目录 前言本地环境搭建1、初始化数据库2、搭建调度中心3、搭建出执行器 XXL-JOB漏洞1、后台弱口令->RCE2、未授权API->RCE3、默认accessToken4、CVE-2022-361575、SSRF漏洞->RCE 总结 前言 在日常开发中,经常会用定时任务执行某些不紧急又非常重要的事…

软件测试/测试开发丨Python 内置库 sys 学习笔记分享

sys 概述 是 Python 自带的内置模块是与 Python 解释器交互的桥梁 sys 使用 常用属性常用方法导入 sys 模块 # 导入sys模块 import sys# 查看sys模块帮助文档 help(sys)# 查看sys模块的属性和方法 print(dir(sys))sys 常用属性 sys.version:返回 Python 解释器…

个人博客主题 vuepress-hope

文章目录 1. 简介2. 配置2.1 个人博客,社媒链接配置 非常推荐vuepress-hope 1. 简介 下面的我的博客文章的截图 通过md写博客并且可以同步到github-page上 2. 配置 2.1 个人博客,社媒链接配置 配置文件 .vuepress/theme.ts blog: {medias: {BiliB…

【漏洞复现】企望制造ERP系统 RCE漏洞

漏洞描述 企望制造ERP系统是畅捷通公司开发的一款领先的生产管理系统,它以集成化管理为核心设计理念,通过模块化机制,帮助企业实现生产、采购、库存等方面的高效管理。该系统存在RCE远程命令执行漏洞,恶意攻击者可利用此漏洞进行…

设计模式:抽象工厂模式(讲故事易懂)

抽象工厂模式 定义:将有关联关系的系列产品放到一个工厂里,通过该工厂生产一系列产品。 设计模式有三大分类:创建型模式、结构型模式、行为型模式 抽象工厂模式属于创建型模式 上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定…

MongoDB的基本使用

MongoDB的引出 使用Redis技术可以有效的提高数据访问速度,但是由于Redis的数据格式单一性,无法操作结构化数据,当操作对象型的数据时,Redis就显得捉襟见肘。在保障访问速度的情况下,如果想操作结构化数据,…

金蝶云星空其他出库单,审核中/审批流中可以选择序列号设置

文章目录 其他出库单,审核中,审批流中可以选择序列号设置 其他出库单,审核中,审批流中可以选择序列号设置

Redis(上)

1、redis Redis是一个完全开源免费的高性能(NOSQL)的key-value数据库。它遵守BSD协议,使用ANSI C语言编写,并支持网络和持久化。Redis拥有极高的性能,每秒可以进行11万次的读取操作和8.1万次的写入操作。它支持丰富的数…