编译原理:代替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(注意…

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

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

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…

BetterZip 5软件安装包下载

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

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

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

Vue55-TodoList案例-本地存储

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

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;算法专题 ⏰诗词歌…

网络知识:这些特殊的IP地址,具体的用途你都知道吗

目录 一、0.0.0.0 二、255.255.255.255 限制广播地址 三、127.0.0.1 本机地址 四、224.0.0.1 组播地址 五、169.254.x.x 六、10.x.x.x、172.16。x。x&#xff5e;172.31。x。x、192.168。x。x 私有地址 对于计算机网络来说&#xff0c;IP地址是非常重要的概念&#xff0c…

胡说八道(24.6.10)——数电与STM32

至此&#xff0c;信号与系统的简单笔记已经全部都写完了。其实&#xff0c;信号与系统的知识远远不只这些&#xff0c;总之&#xff0c;我的老师没讲完。其真实的原因是不在考试大纲里面。今天&#xff0c;看到一个短视频——学习的意义。其中有句话说&#xff0c;“因为考试不…

IEEE802.11a中的同步

目录 1.前言2.IEEE802.11a中的同步3.分组检测4.分组检测常用算法 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 最近有其他很多事情要做&#xff0c;接收机这部分本身内容也更难&#xff0c;涉及很多理论知识&#xff0c;本来之前对于随机信号和假设检验就没怎么学习透…

请详细列出获取商品详情接口的实现过程,包括从请求处理、数据接收、结果返回等各个环节的详细步骤。

当实现一个获取商品详情接口时&#xff0c;通常可以遵循以下详细步骤来确保接口的稳定性、可维护性和性能。 1. 需求分析 明确接口功能&#xff1a;确定API接口需要返回哪些商品详情信息&#xff0c;如商品名称、价格、库存、描述、图片链接等。接口调用者&#xff1a;确定哪些…

100V宽电压H62410A恒压芯片 24V降压5V 24V降压12V电源IC

H62410A是一款宽电压100V 内置MOS管的降压恒压芯片&#xff0c;适用于24V降压至5V或12V的应用场景。其内置100V耐压MOS和宽压8V-90V的输入范围&#xff0c;使得它能够在多种电压条件下稳定工作。同时&#xff0c;支持输出电压可调至3.3V&#xff0c;为不同设备提供了灵活的电源…

centos7.9部署k8s的几种方式

文章目录 一、常见的k8s部署方式1、使用kubeadm工具部署2、基于二进制文件的部署方式3、云服务提供商的托管 Kubernetes 服务4、使用容器镜像部署或自动化部署工具 二、使用kubeadm工具部署1、硬件准备&#xff08;虚拟主机&#xff09;2、环境准备2.1、所有机器关闭防火墙2.2、…

Vue49-props属性

一、当同一个组件标签被使用多次 因为data属性写的是函数形式&#xff01; 二、需求&#xff1a;老王也想用<Student>组件&#xff0c;但是需要动态把老王想要的值传进来。 2-1、使用props属性接收参数 使用props属性&#xff0c;接收的这三个参数&#xff0c;是被保存在…

软件概要设计书(Word原件项目直接套用)

1引言 1.1编写目的 1.2项目背景 1.3参考资料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4运行环境设计 2.5设计目标 3系统功能模块设计 3.1个人办公 4性能设计 4.1响应时间 4.2并发用户数 5接口设计 5.1接口设计原则 5.2接口实现方式 6运行设计 6.1运行模块…

JetLinks开源物联网平台社区版部署教程

1.上github搜素jetlinks 2.找到源代码,并且下载到本地。 3.项目下载完成之后,还需要另外下载三个核心依赖模块。在github找到jetlinks。 4.点击进去下载,下载完成之后,你会发现里面有三个文件夹是空白的,先不用理会,把它复制到jetlinks-commnity目录下,并且在pom.xml添加…