从上下文无关文法(CFG)到语法分析树——SLR(1)分析法

SLR分析2及文法汇合 SLR:解决了LR0的规约规约冲突。 这里配合这里的图片看: 下面表明存在移入规约冲突。 阅读详情

LR方法


LR parsing是一种相对于LL更通用的方法,LR parser是高效的、自底向上的用于上下文无关文法的语法分析技术。
LR(k)方法中的L、R、K分别代表:

  • L: left-to-right scan从左向右扫描
  • R:construct a rightmost derivation in reverse最右推导
  • k:the number of input symbols of look ahead每次扫描的字符数

LR方法分为三种:

  • SLR: simple LR 简单LR方法,本文介绍的就是简单LR(1)方法
  • LR(1): canonical LR 规范LR方法
  • LALR: look ahead LR

更多关于LL语法的分析方法,如预测分析法,可以查看这里。

本文例:

E => E + T
E => T
T => T * F
T => F
F => ( E )
F => i

构造自动机


首先为每个产生式构造自己的状态机。
FA-original

首先,我们需要理解这些状态机的含义。每个状态机都描述了每个产生式推导过程需要的状态转换。这样的转换是分层的。比如T=>T+F这个状态转换,当进行到最后F那一步时,可以直接通过i来转换,也可以通过(E)来转换,就是最后的那两个表达式,每个以非终结符为发出边的状态转换,如E、F等,都意味这样的转换需要分解为更细化的转换,而这些“更细化的转换”,都在后面定义了,如对于F有F=>(E)和F=>i。
因此,我们连出具体的分解状态。
complete
(注:空白边都是指 ϵ 边)
我们完全不需要去细看图中的每条线(其实可以不画这张图),但是我们需要理解的是状态间的分层关系,即每个非终止符构成的发出边一定可以分解,分解的方式就是以这个非终止符为左边的推导式。因为每个推导式都被转化为状态机,这就意味着它可以分解为对应的更细化的状态。

Q:为什么有S’=>E这个状态存在?
A:
为了有一个共同的起点。因为一开始E => E + T,E => T是并列的一层,需要定义一个公共的起点。

生成DFA


Step1:State naming 命名状态

在之前我们直接把状态命名为1、2、3、4等,在这里这样简单的命名不能体现分层的特征,如何既能体现分层,又能具体标明以上图中每个具体的状态呢?我们的解决方案是:用产生式命名层,用点表示位置。
naming
两个命名示例如上图所示。

Step2:Determination 将NFA转化为LRDFA

在之前的文章中,我们提到了如何将NFA转化为DFA,使用的是表驱动法,当时提到了两个概念: ϵ 闭包和子集构造法。在这里我们列出这种方法的特色部分。

  1. ϵ 闭包->状态内扩展
    如何寻找开始状态S’=>.E的“ ϵ 闭包”?方法是如果有一个点在非终结符的前面,那么该非终结符为左边的产生式对应的第一个状态也要加入这个新的状态。说人话就是,对于S’=>.E,点在E的前面,则E=>.E+T和E=>.T就加入S’=>.E的 ϵ 闭包,这是一个递归的过程,E=>.T里点在T的前面,则T=>.T*F和T=>.F也加入S’=>.E的 ϵ 闭包,然后再找F…我们为这种方法找一个新的名字叫做状态内扩展,当然这只是更简便的做法,用之前 ϵ 闭包的方法完全可以找到相同的结果。

  2. 子集构造法->状态间扩展
    与之前不同的是,这里非终结符构成的发出边也要考虑。而寻找子集的方法更简单,只要将对应的点右移即可。如T=>.T*F从T发出的状态就是T=>T.*F,同样,这里用之前子集构造法一样可以解决,只是这种命名方法为转化DFA提供了很大的便利。

下图是完整的LRDFA图:
LRDFA

构造LR分析表

LR
Action里的S和GOTO里的数字都很好填,直接按照上面生成的状态转换填写即可,如I0通过发出边T到I2,则在state0行T列写2,I0通过发出边i到I5,则在state0行i列写S5(Shift5)。这里要解释的是r(Reduce)的填写。
REDUCE
首先为所有产生式标号:

(0)S’=>E
(1)E => E + T
(2)E => T
(3)T => T * F
(4)T => F
(5)F => ( E )
(6)F => i

随后,观察每一个具体的状态。如果有一个状态中包含终止状态(即点在最右边),意味着这个子状态分析完毕,需要进行规约。我们就需要对这个推导求Follow(Follow是什么见上一篇文章)。
比如说,对于I2, 有E=>T.这个状态,这里点在T后面,也就是最后,我们需要对E求Follow,可以知道E的Follow为+和(和$,所以我们在state2的+、(、$列填上r2,这里的2的意思是产生规约的是第二个产生式E=>T。

分析过程

LR PARSING MODEL
LR Parsing模型和之前的有一点区别,最大区别就是左边的栈有两列,最左边一列用于存放当前的状态,右边一列用来存放临时的字符和状态。

  • 若当前状态与字符指针所指字符在LR表中对应一个ACTION的Shift(就是Si,状态转换),则把这个字符压栈,因为每次压栈时要同时压入字符和状态,此时压入的对应的状态就是ACTION里标明的状态,同时字符指针右移。
  • 关键:若当前状态与字符指针所指字符在LR表中对应一个ACTION的Reduce(即Ri),首先查看Ri对应的产生式,比如说F=>E+F,此时则需要弹出栈中的E+F(如果步骤顺利,那此时栈中已经有了E,+和F),把F压栈,与F同时压栈的状态为当前的状态(都弹出以后下面一行的状态)与F在LR表中对应的GOTO,如果当前状态为0,那么与F一起压栈的状态就是(0,F)对应的GOTO状态。
  • 弹栈时字符要与状态一起弹出。
  • R0的意思是Accept,即分析成功结束。

PS:有空会画出每一步的栈图
PS:写这个花的时间实在太长了,真的是从周一写到周五,还有三节课不一定每节课都更啦!

Unit 6 语法分析 LR文法 自底向上分析 将输入符号串w不断归约成文法开始符S 采用:最左归约(反向构造最右推导) 通用框架为:移入-归约分析(Shift-Reduce Parsing) 过程: 输入符号不断移入栈 直到构成某产生式右部 --(出栈) --> 归约成产生式左部(再入栈),同时构造语法树 句柄:每次归约出来的符号串 (当前句型的最右直接短语) LR 文法: L :Left-scaning, ... 阅读详情

相关推荐

LL1和SLR文法在算术表达式分析中的应用与VC++实现

在编译原理中,文法是用来描述语言结构的规则集合,它能够定义一个语言中合法的句子。形式文法通常包括四个组成部分:终结符集、非终结符集、产生式规则集和一个特殊的起始符号。产生式规则规定了如何从符号串生成新的符号串,每一条规则都可以被理解为一种替换规则。文法可以根据其产生式的特性被分类为不同类型,主要包括:正则文法、上下文无关文法(CFG)、上下文相关文法和无限制文法。在这些分类中,上下文无关文法(CFG)是最为常见和广泛使用的,LL(1)文法就是CFG的一个特例,它适用于自顶向下解析技术。

weixin_31139479的博客 1044

SLR(1)分析法

1.基本概念 (1)按上述方法构造出的ACTION与GOTO表如果不含多重入口,则称该文法为SLR(1)文法。 (2)使用SLR表的分析器叫做一个SLR分析器。 (3)每个SLR(1)文法都是无二义的。但也存在许多无二义文法不是SLR(1)的。 (4)LR(0)∈ SLR(1)∈无二义文法 2.如何构造SLR(1)分析表 (1)把G拓广为G' (2)对G'构造 1.LR(O)项目集规范族C 2.活前缀识别自动机的状态转换函数GO (3)使用C和G...

qq_55168827的博客 1万+

SLR(1)分析法的实现

对于文法 E E + T | E – T | T T T * F | T / F | F F (E) | i 使用自下而上分析法的一种来进行构造算法 目前学过的自下而上分析法有 1、算符优先分析法(需要先来判断文法是否为算符优先文法) 2、LR(0)分析法 3、SLR(1)分析法 该程序的功能为,给定输入,程序按照先后顺序将使用的产生式输出。 如,输入25.6 * 14.5 + 2(首先经过词法分析,将其转化为 i * i + i),将在规约过程中使用到的产生式依次输出出来。

4.6 Introduction to LR Parsing: Simple LR

4.6 Introduction to LR Parsing: Simple LR The most prevalent type of bottom-up parser today is based on a concept called LR(k) parsing; the "L" is for left-to-right scanning of the input, the "R" for...

weixin_30237281的博客 283

雷达截面积建模仿真(RCS)

在目标侧,其形状、材料、尺寸(相对于雷达波长)和相对于雷达观察方向的方向等特征都会影响雷达看到的RCS。严格的数学处理超出了讨论的范围,但入射波和目标之间的相互作用可以定性描述。对于给定的散射方向,可以积分求和物体表面电流的振幅相位,当电流同相时,会出现较大的回波幅度。随着目标方向和雷达视角随时间变化,电流振幅和相位会发生变化,形成看似随机的峰值和零点的散射模式,出现“相长”和“相消”干涉。除了雷达到目标的距离外,雷达截面(RCS)是RRE(雷达距离方程)中唯一与目标相关的参数,因此不在雷达设计者的。

qq_30796447的博客 3138

线性分类器(Linear Classifier)

线性分类器 如上图所示,这是二维空间中的一个数据集,如果他正好能够被一条直线分成两类,那么我们称它为线性可分数据集,这条直线就是一个线性分类器。 在三维空间中,如果数据集线性可分,是指能够被一个平面分为两类。 在一维空间中,所有的点都在一条直线上,如果线性可分。可以理解为它们能够被一个点分开。 这里的直线、平面、点被分为决策边界。 一个 m 维空间中的数据集,如果能够被一个超平面一分为二,那么这个数据集就是线性可分的,这个超平面就是决策边界。 例如,这是二维平面上的一条直线, 它可以把平面切分成两

xuechanba的博客 1万+

编译器实现(五)

1.自底向上的分析 最普通的自底向上算法称作LR(1)分析( LR(1)parsing) ( L表示由左向右处理输入,R表示生成了最右推导,而数字1则表示使用了先行的一个符号)。 1.1自底向上分析概览 自底向上的分析程序使用了显式栈来完成分析,这与非递归的自顶向下的分析程序相类似。分析栈包括记号和非终结符,以及一些后面将讨论到的其他信息。自底向上的分析开始时栈是空的,在成功分析的末尾还包括...

weixin_33901926的博客 344

(一)ANSYS WORKBENCH实践入门

ANSYS-workbench 有限元分析应用基础教程 (张晔)学习笔记

qq_51767372的博客 1万+

SLR(1)语法分析程序的实现

【代码】SLR(1)语法分析程序的实现。

m0_62806440的博客 2269

【Claude Code】Claude Code 使用指南

本文介绍了AI编码助手Claude的基础和进阶操作指南。基础部分涵盖启动命令、模式切换(自动编辑/Plan/Yolo模式)、资源监控等核心功能,重点讲解了斜杠命令的使用方法。进阶操作详细说明了CLAUDE.md文件的创建与管理,包括项目规范、代码风格等内容的配置,以及如何通过该文件建立持久上下文。同时提醒了使用过程中的安全风险,建议通过配置文件限制AI对关键代码的访问权限。全文提供了完整的操作指引和安全建议,帮助开发者高效安全地使用Claude进行编码辅助。

大家好,我是敖云岚,一个沉迷代码的 “技术玩家”。擅长 Java、C++ 开发,对 MySQL、Redis、RabbitMQ 等技术也颇有研究。博客里既有硬核技术干货,也有诙谐幽默的编程日常分享。愿和你一起,笑着学技术,快乐敲代码! 1万+

ROSTCM6+Gephi的网络语义分析详细教程(附案例实战)

ROSTCM6是武汉大学沈阳教授研发编码的国内目前唯一的以辅助人文社会科学研究的大型免费社会计算平台。该软件可以实现微博分析、聊天分析、全网分析、网站分析、浏览分析、分词、词频统计、英文词频统计、流量分析、聚类分析等一系列文本分析。Gephi是一款开源免费跨平台基于JVM的复杂网络分析软件,可用于各种图形和网络的可视化和探索,是最受欢迎的网络可视化软件之一。

m0_64336780的博客 1万+

【编译原理】03LR分析法

LR分析法 LR(0)分析法算法简述 L:left to right parsing R:right-most derivation in reverse k:look ahead k to token 方法:移进-归约法 框架:总控程序、分析栈、分析表 分析表中的符号: SiS_iSi​:第i个状态 rir_iri​:第i个产生式 a:输入串(符号) accept:接受,结束 GOTO:归约后的状态 分析表中的列名: ACTION:终结符,单元格内容为S和r GOTO:非终结符,单元格内容为S

qq_45775524的博客 2533

FPGA信号处理系列文章——分数倍插值抽取滤波器(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章——分数倍插值抽取滤波器(一)前言信号流matlab模型频谱示意图分析总结 前言 变采样率滤波器不仅仅存在整数倍插值和整数倍抽取的情况,还会存在分数倍插值抽取的情况。那这种情况下要怎么处理呢 信号流 分数倍插值抽取滤波器的信号流是什么?信号先进行插值,再进行FIR滤波,最后进行抽取 matlab模型 %signal 定点化数据输入 coeff_val_fir = importdata('fir.coe'); si

gzy0506的博客 1万+

LR文法整理【LR文法的概念、LR(0)、SLR、LR(1)、LALR】(上)

LR文法整理【LR文法的概念、LR(0)、SLR、LR(1)、LALR】(上)

weixin_47365232的博客 8995

openclaw 保姆级部署与核心玩法解析:国产DeepSeek模型 + 飞书

OpenClaw是一款功能强大的开源AI个人助理,支持全平台私有化部署,数据完全本地掌控。它不仅可通过聊天窗口直接操控电脑(安装软件、创建项目),还支持接入飞书等主流通讯工具,化身24小时在线的智能助理。本文提供了从零开始的详细部署教程,涵盖基础安装、模型配置(如GLM-4、DeepSeek)到飞书集成的完整实战指南,助你将这款“核动力”AI助手快速融入日常工作流。

甘蓝的专栏 3000

DPI — 业务识别技术

目录 文章目录目录DPI 的业务识别技术类型特征识别Protocol 特征Payload 特征关联识别行为识别 DPI 的业务识别技术类型 DPI 的关键技术是能够高效的识别出网络上的各种应用类型。 浅报文检测是通过端口号来识别应用类型的。如:检测到端口号为 80 时,则认为是 HTTP 协议。但实际上,为了应用的安全性考虑通常不会使用默认端口来暴露业务能力。此时采用 L2 ~ L4 层的传统检测方法已无能为力了。 而 DPI 技术与我们熟知的防病毒软件在某些方面比较类似,即:其能识别的应用类型必须是系统已

烟云的计算 3517

【编译原理】Up-Down-LR分析法

LR分析法是一种相当有效的自下而上分析技术,它可以用于很大一类上下文无关文法的语法分析。L表示从左向右扫描输入串;R表示构造一个规范推导(最右推导)的逆过程,也就是规范归约(最左规约)。LR分析法比我们前面介绍的算符优先分析法或其它的"移进-归约"技术更加广泛,并且识别效率也不比它们差。能用LR分析器分析的文法类,包括了能够使用LL(1)分析器分析的全部文法,LR分析法在从左向右扫描输入串时就能发现其中的任何错误,并能准确指出出错地点。

Esperanto.的博客 1961

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

编译原理(核心速成)

编译原理(混子速成): 1.DFA、NFA 2.LL文法、LR文法:FIRST、FOLLOW

Edward2022的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

编译原理选择题【太原理工大学】

TYUT 太原理工大学编译原理期末复习选择题,持续更新。

m0_52861684的博客 8074

编译原理 期末速成

对于 CFG G 的句型,分析树被定义为具有下述性质的一棵树:根由开始符号所标记;每个叶子由一个终结符、非终结符或 ε 标记;每个内部节点都是非终结符;若 A 是某节点的内部标记,且。

island1314的博客 1807

【编译原理】编译原理知识点汇总·语法分析器(消除左递归、消除二义性、自顶向下语法分析、自下向上语法分析)

这部分在考试中最重要并且比较难,首先需要大致了解一以下概念: 文法:文法用于描述编程语言的句法结构和语法规则,也就是一大堆产生式。程序设计语言通常使用的叫做上下文无关文法(CFG)。 语法:语法是编程语言中定义的语法规则,用于规定程序的结构和正确组织方式。文法就是语法更加规范化统一化的表示,语法较于文法更加抽象。语法分析器根据文法规则进行词法分析和语法分析,检查源代码的语法正确性,并构建语法树表示程序的结构。 语法分析:语法分析就是对程序进行上下文无关部分的检查,看看程序是否符合文法所定义的句子结构。语法

十二月的猫 2836

编译原理-语法分析

1.语法分析器的两个重要作用 1.根据词法分析器提供的记号流,为语法正确的输入构造分析树(或语法树),这是本章的重点,在以后各节中详细讨论; 2.检查输入中的语法(可能包括词法)错误,并调用出错处理器进行适当处理,下边简单介绍语法错误处理的基本原则,而在以后的讨论中忽略此问题。 2.语法错误的处理和错误类型 对语法错误的处理,一般希望达到以下基本目标: 清楚而准确地报告错误的出现,地点正确、...

qq_40427276的博客 3320

算符优先文法分析器_编译原理:LL, LR 文法浅析

编译原理-文法编译原理文法这里有很多混淆的地方,在这里梳理一下,尤其是各种“文法”(LL(k), SLR(k), LALR(k), LR(k), unambiguous grammar, ambiguous grammar, context-free grammar)。首先说明,Context-free grammar与无二义性文法不是一个层级的概念。CFG的意思是:我们用产生式设计的一组文法,...

weixin_39524636的博客 709

【学习笔记】编译原理——第五章 自底向上分析法

系列文章目录 【学习笔记】编译原理——第一章 编译引论 【学习笔记】编译原理——第二章 词法分析 【学习笔记】编译原理——第四章 自上而下分析法 【学习笔记】编译原理——第五章 自底向上分析法 文章目录系列文章目录概述LR分析法LR0分析增广文法 概述 自底向上分析: 从分析树的底部向顶部方向构造分析树 可以看成是将输入串w规约为文法开始符号S的过程 自顶向下的语法分析采用最左推导方式 自底向上的语法分析采用最左归约(反向构造最右推导) 自底向上语法分析的通用框架——移入归约分析 栈的左侧为栈底,

TommyGong08的博客 2393

编译原理笔记(哈工大编译原理)(及格版)

哈工大编译原理课程,虽然很多人说这个老师是念ppt,但是其实不然,ppt很复杂,你自己看还是有点麻烦,不如让老师给你指出顺序,这样也舒服,建议2倍速。

亦梦亦醒乐逍遥的博客 3632

006-语法分析与文法理论

语法分析与文法理论摘要 本章系统介绍了编译器的语法分析阶段,重点讲解上下文无关文法(CFG)的理论基础和应用。内容包括:文法符号、产生式定义和验证;自顶向下(LL)与自底向上(LR)分析技术;LL(1)、LR(0)、SLR(1)等分析器的实现原理;抽象语法树构建和语法制导翻译方法;以及语法错误处理策略。通过Python代码示例展示了算术表达式文法的建模过程,包括终结符、非终结符的定义和产生式规则验证机制。

wyl703的博客 646
上一篇: 从上下文无关文法(CFG)到语法分析树——LL(1)分析法
下一篇: Java8函数式编程1-简介和流
cuiods
博客等级 码龄12年 41粉丝 15原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值