编译原理:代替LR的MP:2.遇到的问题

用指针加速

MP是multi-pass,多遍分析法,它是从“先乘除后加减”中得来的灵感。在实践中,发现C语言优先级有15级,如果将源代码处理15遍,每一遍都从头开始找,势必很慢。所以,有了用指针加速的想法。

例如,给所有乘除号的指针排列起来,所有加减号的指针排列在它下面。这是在词法分析那一遍完成的。然后,处理乘除法的那一遍,可以直接找到乘除号,处理加减法时,能够直接找到加减号。不用再从头开始找了,有提速效果。

树的结构

要想实现“用指针加速”的想法,需要用指针指向树上的节点,并且还能在树上移动。用C++的vector实现树状结构恐怕不行,它需要一个指针指向父节点,再来一个下标说明是第几个子节点。

希望只用一个指针描述节点,这么一来,要用C语言实现树状结构了。树上的每个节点,包括一个字符串,和4个指针,分别指向父节点(上)、兄弟节点(左右)、长子节点(下)。其中“长子”是个新的概念,是子节点中最左边的一个。

重叠的产生式

在实践中遇到了“重叠的”产生式,即两个产生式,有公共的部分,又不完全一样。如:

A->*E
B->E*E
或
E->id
E->id=E

星号E,表示C语言的指针操作,可星号同时也是乘号,并且,前者的优先级更高。如果先把所有*E归约为A,再遇到乘法时,看到的就是EA,这就错了。

第二个例子,先把id归约为E,然后发现id=id变成了E=E,这导致不能识别id=E。

用FIRST集和LAST集解决上述问题。比较*EE*E,左侧多出一个E,应该求LAST(E),当判断*E时,看到星号左边的符号属于LAST(E),则不做归约。LAST集的求法,在《编译原理》书中没有说,但是它和FIRST集差不多,对称的。

比较id和id=E,右侧多出=E,求FIRST(=E),结果是等于号。在尝试把id归约为E时,看一看右边是不是等于号,如果是,就不归约。

修正

解决上述产生式重叠问题的另一个方法,是“修正”。对于产生式A->*E,修改为Ax->*E,这么一来,在之后的某一遍中,遇到EAx就知道应该“修正”为E*E

Ax是一个新的文法符号,并且它的子节点正是星号和E。修正时,检查一下子节点,更安全。

突破

在这里插入图片描述
图中的语言是一串a,很简单,但是,它的文法产生式却如此复杂。有时,我觉得chomsky的四型文法是个陷阱,至少也是个坑,许多人都掉进去了。

在MP分析法中,使用函数来处理树状结构,而基于纯文法的语法分析,只使用“替换”。不管是推导还是归约,都是替换。用左边的替换右边的,或者用右边的替换左边的。用函数则更灵活。

图中的语言,用函数来识别,可以是这样:

/a+/ =~ s
n=strlen(s)
n=2^i, i=1,2,3...

如此说来,MP分析法超越了上下文无关文法,更强。

前进的动力

下图中,成功实现了一个源代码的分析,这给了我动力。在这里插入图片描述
一开始,是一个只有根节点,没有任何子节点的树,它的内容是源代码。

经过词法分析,出现了一棵略微复杂一点的树。

之后的一步步,形成了完整的语法树。

注意,这个例子中,总是针对根节点进行分析的。在添加了括号之后,用数数的方法进行括号的配对,这需要对某个子节点进行分析。引入递归的函数,可以完成括号的分析。
a(bcd(efg)h)ijk
括号配对的结果是
a(.)ijk
bcd(efg)h
把指针p指向点号,第二行做它的子节点。调用分析函数f(p)。由于在子节点中还有括号,所以会出现函数f的递归调用。

总结

MP分析法可以代替LR分析法,并且还能有所超越。这是一个有希望的研究方向。发明LR分析法的Knuth先生还健在,它看到MP分析法之后,会怎么想呢?

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

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

相关文章

Attention机制到底是什么?

AI算法之一 的Attention机制到底是什么,你知道吗? 这里写目录标题 1. Attention 的本质2. Attention的3大优点3. Attention的原理3.Attention的类型3.1计算区域3.2 所用信息3.3 结构层次 4. 模型方面5. 相似度计算 1. Attention 的本质 Attention(注意…

Redis 面试热点(二)

在前一篇文章中,我们介绍了 Redis 的基础知识和一些常见面试问题。本文将继续探讨 Redis 面试中的一些高级话题,包括 Redis 的事务、Lua 脚本、缓存一致性、热 Key 问题以及 Redis 与其他数据库的对比。 1. Redis 事务 Redis 事务的特性 原子性: Redi…

构建数字化校园,开启创新教育模式

在当今信息化时代,教育的转型升级已成为推动社会进步与发展的关键力量。构建数字化校园,不仅是对传统教育模式的革新,更是开启一场以技术赋能教育、创新驱动成长的教育革命。这一进程旨在通过深度融合信息技术与教育教学实践,重塑…

hive on spark 记录

环境&#xff1a; hadoop 2.7.2 spark-without-hadoop 2.4.6 hive 2.3.4 hive-site.xml <property><name>hive.execution.engine</name><value>spark</value> </property> <property><name>spark.yarn.jars</name>&l…

【代码随想录——动态规划——第三周】

1.目标和 这里设置背包的最大长度为2100即可&#xff0c;因为题目中有说数组之和小于1000.但考虑到我们需要实行jnums[i]所以保守起见我们设置的数应该稍大于2000即可&#xff0c;这里我们设置为2100。 1.1 我的解法&#xff08;粗糙了&#xff09; func findTargetSumWays(n…

Jackson指定json的key

指定json的key ‍ ‍ 要在序列化JavaBean时指定JSON的key&#xff0c;可以使用JsonProperty​注解来指定JavaBean属性序列化到JSON时使用的key。以下是一个简单的示例&#xff1a; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.da…

品质主管的面试题目

在品质主管的面试中,面试官可能会提出一系列问题来评估应聘者的经验、技能和专业知识。以下是一些常见的品质主管面试题,你可以提前准备,以更好地展示自己的能力和适应性。 一、自我介绍与背景了解 请简单介绍一下自己,包括教育背景、工作经验等。你在过去的工作经历中,主…

数据分析------知识点(六)

如何用数据说话 确定问题 如何写好数据分析报告中的确定问题部分 数据分析报告是数据分析师展示工作成果、影响业务决策的重要工具。而确定问题是数据分析报告的第一个也是最关键的部分。只有正确地确定了问题&#xff0c;后续的分析才能有的放矢&#xff0c;产生真正的价值…

BetterZip 5软件安装包下载

BetterZip是一款功能强大的Mac解/压缩软件&#xff0c;可以满足用户对文件压缩、解压、加密和保护等方面的需求。以下是关于BetterZip软件的主要功能、特点和使用方法的详细介绍&#xff0c;以及对其用户友好度、稳定性和安全性的评价。 安 装 包 获 取 地 址: BetterZip 5-安…

R语言 | 绘制带P值的差异柱状图

原文链接&#xff1a;R语言 | 绘制带P值的差异柱状图 本期教程 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组下游分析等内容。凡是在社群同学&#xff0c;可免费获得自2021年11月份至今全部教程&…

Docker配置代理

有时候我们在使用docker下载镜像的时候可能想要配置代理区下载那么本文就给大家分享一下docker怎么配置代理。 假设你已经有了代理&#xff0c;那就编辑/usr/lib/systemd/system/docker.service 在[Service]下添加 Environment"HTTP_PROXYhttp://127.0.0.1:6666/" E…

免费公开的源代码

虽然免费公开的软件被称为免费软件&#xff0c;但是一般不会公开源代码。另外&#xff0c;公开了源代码&#xff0c;并且可以免费使用&#xff0c;而且谁都可以自由进行修改并再次发布的软件被称为开源软件。 开源软件并不是特定企业开发的&#xff0c;大多数是由有关人士组织…

Spring 事务传播行为之Propagation.NESTED REQUIRES_NEW等探讨

当一个事务方法&#xff08;标记为Transactional(propagation Propagation.NESTED))被另一个活动事务调用时&#xff0c;它会创建一个“保存点”&#xff08;Savepoint&#xff09;作为新的事务开始点。这意味着&#xff0c;如果这个嵌套事务方法内部发生异常并导致回滚&#…

深入探讨:Spring与MyBatis中的连接池与缓存机制

深入探讨&#xff1a;Spring与MyBatis中的连接池与缓存机制 引言 在现代应用程序开发中&#xff0c;性能优化是一个永恒的话题。而在企业级Java应用开发中&#xff0c;Spring和MyBatis是两种非常流行的框架&#xff0c;它们的连接池和缓存机制对应用程序的性能有着至关重要的…

Vue55-TodoList案例-本地存储

一、TodoList案例-本地存储 此时&#xff0c;修改对象里面的属性&#xff0c;watch监视不到&#xff01; 需要深度监视&#xff0c;就不能用简写形式&#xff01; 二、jeecg-boot中的本地存储 jeecg-boot中&#xff0c;浏览器的本地存储&#xff0c;存储的是token&#xff01;…

kali - 配置静态网络地址 + ssh 远程连接

文章目录 观前提示&#xff1a;本环境在 root 用户下kali 配置静态网络地址打开网络配置文件 kali 配置 ssh 远程连接 观前提示&#xff1a;本环境在 root 用户下 kali 配置静态网络地址 打开网络配置文件 vim /etc/network/interfaces出现一下内容 # This file describes …

Parallels Desktop 19 for mac破解版安装激活使用指南

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

git 如何撤销已经 push 的 merge

今天在合并代码时, 发现自己失误把另外一个分支 B 的代码合并到了自己分支 C, 于是想到要撤销这次 merge 一般地, 如果我们想要撤销某次 commit 可以 git revert <commit-id>. 然而, 对于 merge 类型的 commit 不能直接 git revert <commit-id> 这里举个例子: 我…

最新编程语言排行榜,C++ 和 Go 成为新王?!

大家好&#xff0c; 我是不爱敲代码吖,2024 年 6 月最新的 TIOBE 编程语言排行榜已经发布&#xff0c;如图&#xff1a; 注意&#xff0c;TIOBE 编程语言排行榜是基于 全球 工程师的数量、课程、热门网站、第三方供应商综合计算出来的&#xff0c;只是一个编程语言流行度和趋势…

MBTI:探索你的性格类型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…