首页 > 其他分享 >LR(1) 有限状态机的压缩

LR(1) 有限状态机的压缩

时间:2023-06-14 11:07:05浏览次数:32  
标签:TERM set look ahead 压缩 状态机 LR EOI

上一节描述的状态机构造算法,有一步骤有些问题,特此先进行更正,有问题的步骤是这样的,在计算look ahead 集合的时候,需要把β 和 C 首尾相连后再计算First 集合,特此更正,具体算法步骤,我们再过一遍。

假定表达式形式及其look ahead 集合形式如下:

[S -> a .x β, C]

x 是非终结符, 其对应的表达式如下:

x -> . r

那么上面表达式的look ahead 集合则通过公式:
First(β C)

计算。举个具体例子:

[S -> a .x β, C]
[S -> .e , {EOI}]

此时 a 对应的部分为null, . x 对应部分为 . e, β 对应部分为 null, C 对应的集合是 {EOI}

e 对应的表达式为:
[x -> . r , First(β C)]
[e -> . e+t , First(null EOI)]
[e -> . t , First(null, EOI)]

由于First(null, EOI) = {EOI}, 由此我们生成两个新的表达式:

[e -> . e+t , {EOI}]
[e -> . t , {EOI}]

根据新生成的表达式继续构造新的表达式:
[S -> a .x β, C]
[e -> .e +t, {EOI}]

此时, a 对应的部分是null, . x 对应 . e, β对应 + t,于是First(β C) = First(+ t EOI) , 由于 + 是终结符,所以First(+ t EOI) = {+}, 由于e 对应的表达式有:
e -> . e + t
e -> . t
于是我们又有新的表达式:
[e -> .e + t, {+}]
[e -> . t , {+}]

上面的算法反复进行,直到没有新的表达式生成为止,具体步骤后面通过代码向大家演示。

LR(1) 状态机的压缩

通过上面算法构造的状态机,我们称之为LR(1)状态机,该状态机最显著的特点是,它的大小是我们最早构建的LR状态机的两倍。我们要开发的C语言编译器,对应的LR状态机的节点是287个,如果构造C语言对应的LR(1)状态机的话,那么节点数目则将近600多个,这样的话,状态机体型过于庞大,不但占用内存,而且会严重拖低效率。

由此,有必要对LR(1)状态机进行压缩,使得它的体积变小,同时原有功能不受影响。如果大家拿到代码,运行后可以发现,有很多状态节点,他们的唯一的区别在于,表达式以及表达式中,点的位置是一样的,唯一不同的是,两个节点中,表达式对应的look ahead 集合不一样,这样的节点,我们就可以将他们结合起来。举个例子,运行上面的算法后,在生成的状态机中,有两个节点情况如下:

State Number: 1
EXPR -> TERM .look ahead set: { EOI }
TERM -> TERM .TIMES FACTOR look ahead set: { EOI }
TERM -> TERM .TIMES FACTOR look ahead set: { TIMES }
EXPR -> TERM .look ahead set: { PLUS }
TERM -> TERM .TIMES FACTOR look ahead set: { PLUS }

State Number: 8
EXPR -> TERM .look ahead set: { RIGHT_PARENT }
TERM -> TERM .TIMES FACTOR look ahead set: { RIGHT_PARENT }
TERM -> TERM .TIMES FACTOR look ahead set: { TIMES }
EXPR -> TERM .look ahead set: { PLUS }
TERM -> TERM .TIMES FACTOR look ahead set: { PLUS }

大家注意看上面两个状态节点,点1和点8是通过前面算法构建的两个节点,这两个节点,表达式相同,并且点的位置也相同,唯一不同的就是表达式对应的look ahead 集合,
因此,像这样的两个点,我们就可以将他们结合成一个节点,如下:

EXPR -> TERM .look ahead set: { EOI }
TERM -> TERM .TIMES FACTOR look ahead set: { EOI }
TERM -> TERM .TIMES FACTOR look ahead set: { TIMES }
EXPR -> TERM .look ahead set: { PLUS }
TERM -> TERM .TIMES FACTOR look ahead set: { PLUS }
EXPR -> TERM .look ahead set: { RIGHT_PARENT }
TERM -> TERM .TIMES FACTOR look ahead set: { RIGHT_PARENT }

我们看到,结合后的节点,只不过是把两个节点表达式结合在一起而已。

通过上面的节点压缩后,整个状态机的体积能够被压缩一半,同时保证状态机的效率得到提高。

接下来,我们结合代码看看整个算法如何实现。


标签:TERM,set,look,ahead,压缩,状态机,LR,EOI
From: https://blog.51cto.com/u_16160261/6476207

相关文章

  • java开发编译器:LR 状态机的缺陷与改进
    前两节我们构造的状态机有些缺陷,当我们进入某个状态节点时,根据该节点的特性,我们需要产生一些动作,根据上两节的有限状态机图,当我们进入节点5,我们发现,符号”.”为位于表达式的最右边,在.后面不再有其他非终结符或终结符,进入这样的节点时,我们要根据表达式做一次reduce操作,例如在节点5......
  • LRU 算法与 LFU 算法
    算法介绍LRULRU全称是LeastRecentlyUsed,即最近最久未使用算法。LRU根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高,它是页面置换算法的一种,也常用于缓存设计。LFULFU全称是LeastFrequentlyUsed,根据频率来选择要......
  • H264,H265编码概念 压缩方法
    一、什么是H264编码H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,JointVideoTeam)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者AVC/H.264或者H.264/MPEG-4AVC或MPEG-4/H.264AVC,Advance......
  • 加速44%!RT-DETR量化无损压缩优秀实战
    RT-DETR模型是飞表目标检测套件PaddleDetection最新发布的SOTA目标检测模型。它是一种基于DETR架构的端到端目标检测器,在速度和精度上均取了SOTA性能。在现实部署中,为了追求“更准、更小、更快”的效率,本文使用飞模模型压缩工具PaddleSlim中的自动压缩工具(ACT,AutoCompressionTo......
  • 443.压缩字符串
    问题描述443.压缩字符串解题思路双指针、滑动窗口,注意for循环中不需要fast++。代码classSolution{public:intcompress(vector<char>&chars){vector<char>res;intcnt=0;for(intslow=0,fast=0;fast<chars.size();){......
  • RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2 新增解压缩工具类ZipHelper
    在项目对文件进行解压缩是非常常用的功能,对文件进行压缩存储或传输可以节省流量与空间。压缩文件的格式与方法都比较多,比较常用的国际标准是zip格式。压缩与解压缩的方法也很多,在.NET2.0开始,在System.IO.Compression中微软已经给我们提供了解压缩的方法GZipStream。对于GZipSt......
  • 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式
    本文目录1、概述2、SignalR的永久连接类Mvc实现2.1、创建ASP.NETMvc项目2.2、安装Nuget包2.3、增加SignalR服务2.4、启动路由注册2.5、前端界面处理2.6、效果展示3、控制台做SignalR服务端实现4、代码下载5、参考文章1、概述通过上篇史上最全面的SignalR系列教程-1、认识Signal......
  • 史上最全面的SignalR系列教程-目录汇总
    本文目录1、引言2、SignalR介绍3、百度百科给它的定义4、它的作用5、代码下载6、史上最全面的SignalR系列文章列表参考文章框架相关1、引言最遗憾的不是把理想丢在路上,而是理想从未上路。每一个将想法变成现实的人,都值得称赞和学习。致正在奔跑的您!2、SignalR介绍SignalR实现服务......
  • LRU 算法与 LFU 算法
    算法介绍LRULRU全称是LeastRecentlyUsed,即最近最久未使用算法。LRU根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高,它是页面置换算法的一种,也常用于缓存设计。LFULFU全称是LeastFrequentlyUsed,根据频率来选择要......
  • 从HEVC到通用视频编码的下一代视频压缩技术
    本文来自于ATEME研究总监兼总监米克尔·劳莱特的主题演讲。他主要分享了MPEG-2、H.264、H.265、H.265、VVC,以及EVC、LCEVC等较新的编解码器。我们需要了解HEVC方面的编解码器授权,以及VVC标准化的过程。在探索的过程中,我们从Intra-coding和Inter-prediction方法等方面对图片分割进行......