电子科技大学编译原理复习笔记(七):自下而上语法分析

news2024/10/7 1:34:14

目录

前言

重点一览

引言

自下而上分析

分析方法

规范规约(最左规约,对应最右推导) 

算符优先分析法

算符优先文法

最左素短语

举个例子

优先关系表的构造 

规范规约与算符优先分析

LR分析法

概述

LR(0)项目集规范族

项目与分类 

状态转换图 

项目的有效性

有效项目集

LR(0)项目集规范族的构造

SLR(1)分析表的构造

本章小结


前言

本复习笔记基于张老师的课堂PPT,供自己期末复习与学弟学妹参考用。


重点一览

LR与SLR 


引言

自下而上分析

输入串出发,寻找归约序列,逐步进行归约,直至开始符号S

方法:采用栈,移进--归约,在移进的过程中,观察栈顶是否形成某个产生式的一个候选。

         1)采用栈,将输入符号移进栈中

         2)如果栈顶(一个或多个符号)形成某个非终结符号的候选式

         3)则进行归约:

                ◼ 将候选式出桟

                ◼ 归约后的非终结符号移进栈

         4)重复进行上述过程,直到输入串扫描结束。

         5)如果栈内只剩下开始符号S,则输入串是文法合法的句子。

语法分析过程可以用分析树形成过程来表示

语法分析过程也可以用语法树修剪过程来表示 

两种冲突:

        ◼ 移进与归约的冲突

        ◼ 归约与归约的冲突

可归约串的不同的定义,形成不同的语法

分析方法

算符优先分析法最左素短语

LR分析法:句柄

规范规约(最左规约,对应最右推导) 

α是文法G的一个句子序列αn,αn-1,…,α0 满足下述条件时称为 规范归约 :
(1)αn = α
(2)α0为文法的开始符, 即α0=S
(3)对 i, 0<i n,将 i 句柄 归约 得αi-1
例子:

 

注意:按 最左素短语 归约是 结构归约
处于栈顶待归约的最左素短语与对应的产生
式在 结构上一致
即长度一致, 对应的终结符一致
非终结符 可以 不一致

最左素短语归约 的优缺点
优点:
        ◼ 按照最左素短语进行的归约 省略了 A →α的产生式的使用。
        ◼ 其中:α∈V N + (非终结符号串)
缺点:
        ◼ 并不是任何文法都可以按照最左素短语进行归约。
        ◼ 例如:S →AB; A →a; B →b
部分文法可以进行算符优先分析;
所有文法可以进行LR分析。

算符优先分析法

  • 基于终结符号之间的归约顺序进行语法分析
  • 其关键在于比较两个相继出现的终结符的优先级而决定采用的动作。
  • 在算术表达式中,有运算符号的优先级和结合性的规定
  • 算符优先分析法的实质就是仿效表达式的计算过程而设计的

算符优先文法

定义:上下文无关文法G,如果没有形如P→ε 或P→. . .QR. . .的产生式,则称G为算符文法

相邻的2个终结符 之间的优先关系:
(1) a=b
G有P→…ab… 或 P→…aQb…
(2) a<b
G有P→ …aQ… 且Q=> +b… 或 Q=>+Rb …
(3) a>b
G有P→ …Qb… 且Q=>+ …a 或 Q=>+…aR

说人话:大小写挨着的,大写字母能推出来的小写字母优先级高

算符优先文法:

 

 

若算符文法G的任何终结符a、b之间的优先关系 至多只有 = 、>、<中的 一个
或者终结符a、b之间没有优先关系
则G称为 算符优先文法
注意
(1)相同终结符的优先关系未必是=
(2)有a<b,未必有 b>a
(3)a、b之间未必一定有优先关系
故= 、<、>不同于关系运算符“等于”、“小于”、“大于”

 

最左素短语

 

举个例子

 

 

优先关系表的构造 

FIRSTVT集求法

 

LASTVT集求法

 

矩阵规则(了解就行)

 

(说白了就是集合里有就打上1) 

规范规约与算符优先分析

1)规范归约
严格按照句柄进行归约, 终结符和非终结符一起考虑
只要栈顶形成句柄,不管句柄内是否包含终结符都要进行归约。
2)算符优先分析
仅研究终结符之间的优先关系,而 不考虑非终结符之间的优先关系
但句柄是由终结符和非终结符一起构成的,所以算符优先分析相对来说是非规范的分析。


LR分析法

概述

LR分析法 从左向右 扫描输入串,分析 栈中符号 向前搜索 K个输入符号以确定是否已在栈顶形成 句柄, 从而决定应采取的动作。一般只考虑K≦1的情况。
“L”是指从左至右扫描输入符号串
“R”是指构造一个最右推导的逆过程
“k”是指为了作出分析决定而向前看的输入符号的个数
 
有action表和goto表
(1)action[s,a]
在状态 s 下, 当前输入符号为 a
应采取的分析动作:  移进, 归约,接收, 出错
a. 移进 s 例如 s3
b. 归约 r 例如 r3
c. 接受 acc
d. 出错 error
(2) goto[s,A]表
状态及非终结符的二维矩阵
在状态 s 下, 针对归约后的符号 A 入栈状态

例子:

LR(0)项目集规范族

活前缀的概念: 规范句型 中的不含句柄之后任何符号的一个 前缀

活前缀与句柄的三种关系 

 

例子:

 

项目与分类 

 

 

状态转换图 

项目就是把所有的产生式右边挨个加圆点

 

项目的有效性

 

有效项目集

 

闭包函数closure(I)

 

转换函数goto(I, X) 

 

LR(0)项目集规范族的构造

 

 

举个例子:

 

 

 

 

 

 

⭐如果有移进规约冲突,则此文法既不是LR文法也不是SLR文法

SLR(1)分析表的构造

 

 

 

举个例子:

 

 

SLR分析表构造步骤 

 

 

 

 


本章小结

重点掌握算符优先分析法、LR与SLR分析法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统架构设计师 2:计算机基础

一、计算机硬件 1 处理器&#xff08;CPU&#xff09; 处理器是计算机系统运算和控制的核心部件。 1.1 指令集 处理器的指令集按照其复杂程度可分为复杂指令集&#xff08;CISC&#xff09;与精简指令集&#xff08;RISC&#xff09;。 随着研究的深入&#xff0c;RISC已经…

基于深度学习的高精度安全背心检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度安全背心检测识别系统可用于日常生活中或野外来检测与定位安全背心目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的安全背心目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

2.25 sigprocmask函数使用 2.26sigaction信号捕捉函数 2.27SIGCHILD信号

2.25 sigprocmask函数使用 阻塞信号集有时称作信号掩码。 联想&#xff1a;fcntl函数可以修改fd属性。 ./sigprocmask & //将程序设置为后台运行&#xff0c;输入ls可以同步有输出 fg //将程序恢复到前台运行#include <stdio.h> #include <signal.…

动态规划dp —— 21.乘积最大子数组

1.状态表示 是什么&#xff1f;dp表中里的值所表示的含义就是状态表示 因为要考虑负数情况&#xff0c;负数乘以最大数就等于最小数了&#xff0c;负数乘以最小数就是最大数了 f[i]表示&#xff1a;以i位置为结尾的所以子数组中最大乘积 g[i]表会&#xff1a;以i位置为结尾…

Java 实现删除顺序表中第一次出现的某个元素

一、思路 1.顺序表不能是空的&#xff0c;如果顺序表是空的就肯定无法删除第一次出现的 key 元素. 2.定义一个key变量来传入要删除的元素&#xff0c;这个元素要求是第一次出现的. 3.删除之前要先找到第一次出现的key的下标. 4.找到位置之后就开始删除. 5.删除过程是从key下标位…

Linux - struct file与缓冲区

​​​​​​​ ​​​​​​​ 感谢各位 点赞 收藏 评论 三连支持 本文章收录于专栏【Linux系统编程】 ❀希望能对大家有所帮助❀ 本文章由 风君子吖 原创 ​​​​​​​ ​​​​​​​ ​​​​​​​ 前言 对于文件&#x…

DTS迁移Oracle至DM与MySQL至DM

目录 DTS迁移Oracle至DM... 3 一、前期准备... 3 二、DTS迁移... 4 1、新建工程... 5 2、新建迁移... 6 3、填写源库信息&#xff0c;使用指定驱动并自定义URL连接... 7 4、填写目标库信息... 8 5、填写迁移选项... 8 6、指定迁移模式及模式对象... 9 7、执行迁移...…

http长连接与会话保持

"我们半推半就的人生&#xff0c;没有和你一样被眷顾的未来!" 一、Http长连接 (1) 为什么需要长连接 如上展示的是一个常规得并不能再常规的http服务&#xff0c;从本地拉取远端linux上的本地文件上传至浏览器上&#xff0c;经过浏览器的渲染展示成如今的样子。唔&a…

【实战】体验训练Geneface

一.环境 conda activate geneface export PYTHONPATH./ CUDA_VISIBLE_DEVICES0 python tasks/run.py --configegs/datasets/lrs3/lm3d_syncnet.yaml --exp_namelrs3/syncnet 训练这篇出过的一些奇奇怪怪的问题基本上都记录在【环境搭建】40系一些奇奇怪怪的环境问题_weixin_50…

aigc - 文化衫设计

团队要用aigc设计个文化衫&#xff0c;就是给些提示词&#xff0c;然后让ai自动生成能够包含这些提示词的文化衫出来 二、第二版 思路&#xff1a;收集了30多张文化衫&#xff0c;然后用两种方式生成提升词&#xff1a;一个是自然语言描述这件t-short&#xff0c;一个是全名词…

IDEA常用插件Top18

前言&#xff1a;精心推荐给大家的一些日常开发中最常用的IDEA效率插件。 1、Alibaba Java Coding Guidelines代码规范检查工具 Alibaba Java Coding Guidelines ,阿里的一款强大的代码规范检查工具&#xff0c;可以让自己写出易读性更高的代码&#xff0c;可以让团队代码风格…

Keepalived+LVS

这里写目录标题 一、Keepalived及其工作原理1.1Keepalived体系主要模块及其作用1.3VRRP &#xff08;虚拟路由冗余协议&#xff09; 二、keepalived实验部署主服务器&#xff1a;备用服务器配置节点 一配置节点二 三、测试 一、Keepalived及其工作原理 Keepalived 是一个基于V…

Linux编译器 gcc、g++

绪论 你热爱生命吗&#xff1f;那幺别浪费时间&#xff0c;由于时间是组成生命的材料。——富兰克林 。 本篇文章写了主要写了Linux下编译器&#xff0c;以及编译器是如何实现编译的过程。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 附&…

2.30 守护进程(1) 2.31 守护进程(2)

2.30 守护进程&#xff08;1&#xff09; 终端 echo $$//查看当前终端的的pid tty//查看当前终端设备控制终端可以操作某一个进程。 进程组 会话 进程组、会话、控制终端之间的关系 find/2 查看2重定向到dev/null设备上&#xff0c;|管道&#xff08;创建子进程&#xff09…

RK3588平台开发系列讲解(USB篇)USB Device端口组合配置过程

文章目录 一、configfs二、configfs 配置过程2.1、使能相关的宏2.2、挂载configfs2.3、创建名为g1的usb复合设备2.4、配置PID和VID2.5、创建并配置strings子目录2.6、创建configuration和字符串2.7、创建functions2.8、将functions和configuration关联起来2.9、绑定到UDC,使能…

数据的存储练习题 -- (解题思路+代码)

目录 前言 知识补充 有符号和无符号的区别 练习一 练习二 练习三 练习四 练习五 练习六 练习七 前言 书接上回&#xff0c;我们学习了整形数据在内存中是怎么存储的。本篇我们就利用这些知识来做一些练习题目&#xff0c;把这些知识很好的消化掉。 知识补充 对…

简单的TCP网络程序·单进程

目录 文件1&#xff1a;tcpServer.cc 文件2&#xff1a;tcpServer.hpp 1.提出日志概念 -- 在后续完善 日志格式 -- 暂定简单的打印功能 2.创建套接字 SOCK_STREAM -- socket参数 3.bind自己的套接字 4.设置socket 为监听状态 * 新接口1&#xff1a;listen 函数1&…

IIC协议总结

IIC&#xff08;Inter-Integrated Circuit) &#xff0c;简单说就是IC&#xff08;芯片&#xff09;之间通信的总线。所谓总线&#xff0c;就是各个器件都并联到一组公共的线路上&#xff0c;然后共用这条线路来传输数据。总线的英文名为BUS&#xff0c;这是个形象的名字&#…

chatgpt赋能python:Python如何取三位数的每一位

Python如何取三位数的每一位 作为一门广泛应用的编程语言&#xff0c;Python在数值相关处理方面也十分得心应手。取三位数的每一位是一个常见的需求&#xff0c;那么在Python中该如何实现呢&#xff1f; 1. 数字字符串切片 Python中的字符串有索引和切片功能&#xff0c;我们…

chatgpt赋能python:Python如何命名输出图片名字

Python 如何命名输出图片名字 Python 是一种非常流行的编程语言。它非常灵活&#xff0c;可以用于各种应用场景。其中一个应用是图像处理。在 Python 中&#xff0c;我们可以使用不同的库来读取和处理图像。但是&#xff0c;当处理大量图片时&#xff0c;给每个图片命名会变得…