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

news2024/11/26 5:51:21

用指针加速

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.coloradmin.cn/o/1833799.html

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

相关文章

Vue58-组件的自定义事件_总结

一、需求 父组件App收到子组件student传过来的数据,要在页面上呈现! name是App的子组件student,通过自定义事件传过来的。 计算属性,得有原数据才能计算!计算的属性要是已经存在的:data里面有的、props里面…

【CSS in Depth2精译】1.1.1 样式表来源

您添加到网页的样式表并非浏览器呈现样式的唯一来源。样式表有三种不同的类型或来源。您添加到页面的样式称为 作者样式(author styles);此外还有 用户样式(user styles),即终端用户设置的自定义样式&#…

font-spider按需生成字体文件

font-spider可以全局安装,也可以单个项目内安装,使用npm run xxxx的形式 npm i font-spider "dev": "font-spider ./*.html" <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&…

树莓派pico入坑笔记,快捷键键盘制作

使用usb_hid功能制作快捷键小键盘&#xff0c;定义了6个键&#xff0c;分别是 ctrlz ctrlv ctrlc ctrla ctrlw ctrln 对应引脚 board.GP4, board.GP8, board.GP13 board.GP28, board.GP20, board.GP17 需要用到的库&#xff0c;记得复制进单片机存储里面 然后是main主程…

《STM32 HAL库》RCC 相关系列函数详尽解析—— HAL_RCC_OscConfig()

观前提示&#xff1a;函数完整代码在文末&#xff0c;本文梳理了函数HAL_RCC_OscConfig()的主要逻辑和实现方法f105时钟树详解图 HAL_RCC_OscConfig() 函数介绍&#xff1a; 此函数是一个用于初始化RCC&#xff08;Reset and Clock Control&#xff09;振荡器&#xff08;Osc…

java8实战1(让方法参数具备行为能力)

客户需求是查出颜色为green的苹果 客户需求变成查出颜色为red的苹果 假设现在客户需求又变了,找出黄色的呢?你想查什么颜色直接做为参数输入 让调用者输入颜色参数 问题是现在客户想把重量做为条件,来筛选苹果集合 这就为难了,客户需求随时会变 观察以上例子,发现有个共同…

云计算 | (四)基本云安全

文章目录 📚基本云安全🐇云安全背景🐇基本术语和概念⭐️风险(risk)⭐️安全需求🐇威胁作用者⭐️威胁作用者(threat agent)⭐️匿名攻击者(anonymous attacker)⭐️恶意服务作用者(malicious service agent)⭐️授信的攻击者(trusted attacker)⭐️恶意的内部人员(mal…

电子竞赛2——波形发生器

设计要求&#xff1a;输入—12v电压&#xff0c;产生5v&#xff0c;1khz的正弦波&#xff0c;方波&#xff0c;三角波&#xff0c;锯齿波&#xff0c;并通过按键依次切换。 设计思想&#xff1a;用放大器组成振荡器电路&#xff0c;生成1KHZ的方波和三角波&#xff0c;通过调整…

ChatGPT提效:告别CRUD

前言 随着AIGC的发展以及大语言模型的成熟&#xff0c;各种AI应用眼花缭乱&#xff0c;以至于我们看到各种新奇的应用都会产生焦虑&#xff0c;我有一天会不会被淘汰&#xff1f;且看后文分析。AIGC的发展与逐渐成熟已经是无可逆转的局势&#xff0c;既然我们打不过为何不加入…

MinIO Enterprise Cache:实现超性能的分布式 DRAM 缓存

随着计算世界的发展和 DRAM 价格的暴跌&#xff0c;我们发现服务器配置通常配备 500GB 或更多的 DRAM。当您处理大型部署时&#xff0c;即使是那些具有超高密度 NVMe 驱动器的部署&#xff0c;这些服务器上的服务器数量乘以 DRAM 也会迅速增加&#xff0c;通常达到几 TB。该 DR…

IO系列(十) -TCP 滑动窗口原理介绍(上)

一、摘要 之前在上分享网络编程知识文章的时候&#xff0c;有网友写下一条留言&#xff1a;“可以写写一篇关于 TCP 滑动窗口原理的文章吗&#xff1f;”。 当时没有立即回复&#xff0c;经过查询多方资料&#xff0c;发现这个 TCP 真的非常非常的复杂&#xff0c;就像一个清…

3D Gaussian Splatting Windows安装

1.下载源码 git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive 2.安装cuda NVIDIA GPU Computing Toolkit CUDA Toolkit Archive | NVIDIA Developer 3.安装COLMAP https://github.com/colmap/colmap/releases/tag/3.9.1 下载完成需要添加环…

pycharm git配置

PyCharm 是一个强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它内置了 Git 集成&#xff0c;使得版本控制变得非常方便。以下是 PyCharm 中配置 Git 的基本步骤&#xff1a; 安装Git: 在开始之前&#xff0c;请确保已经在您的系统上安装了 Git。您可以通过官方网…

小规模自建 Elasticsearch 的部署及优化

本文将详细介绍如何在 CentOS 7 操作系统上部署并优化 Elasticsearch 5.3.0,以承载千万级后端服务的数据采集。要使用Elasticsearch至少需要三台独立的服务器,本文所用服务器配置为4核8G的ECS云服务器,其中一台作为 master + data 节点、一台作为 client + data 节点、最后一…

绕过网页的阻止复制

绕过网页的阻止复制 一、问题的提出二、绕过技巧一三、绕过技巧二四、绕过技巧三五、总结说明 一、问题的提出 也是很久没有写文章了&#xff0c;今天突发奇想写一篇文章。首先你有没有被网页中的一些阻止你复制的页面所困扰。就是那种&#xff0c;你突然找到一篇文章&#xf…

mac如何检测硬盘损坏 常用mac硬盘检测坏道工具推荐

mac有时候也出现一些问题&#xff0c;比如硬盘损坏。硬盘损坏会导致数据丢失、系统崩溃、性能下降等严重的后果&#xff0c;所以及时检测和修复硬盘损坏是非常必要的。那么&#xff0c;mac如何检测硬盘损坏呢&#xff1f;有哪些常用的mac硬盘检测坏道工具呢&#xff1f; 一、m…

Redis常见数据类型及其常用命令详解

文章目录 一、Redis概述二、Redis常用命令1.通用命令1.1 KEYS&#xff1a;查看符合模板的所有 key1.2 DEL&#xff1a;删除一个指定的 key1.3 EXISTS&#xff1a;判断 key 是否存在1.4 EXPIRE&#xff1a;给一个 key 设置有效期&#xff0c;有效期到期时该 key 会被自动删除1.5…

触控MCU芯片(1):英飞凌PSoC第6代第7代

前言: 说到触摸MCU芯片,这个历史也是很久了,比如日常经常接触到的洗衣机、电冰箱、小家电,隔着一层玻璃,轻轻一按就能识别按键,感觉比过去纯机械式的按键更高级更美观,不仅白电,现在很多汽车也都在进行触摸按键的改版,不再使用笨重的机械按键,比如空调调温按键、档位…

SpringBoot3整合SpringDoc实现在线接口文档

写在前面 在现目前项目开发中&#xff0c;一般都是前后端分离项目。前端小姐姐负责开发前端&#xff0c;苦逼的我们负责后端开发 事实是一个人全干&#xff0c;在这过程中编写接口文档就显得尤为重要了。然而作为一个程序员&#xff0c;最怕的莫过于自己写文档和别人不写文档…

ES 8.14 向量搜索优化

参考&#xff1a;https://blog.csdn.net/UbuntuTouch/article/details/139502650 检索器&#xff08;standard、kNN 和 RRF&#xff09; 检索器&#xff08;retrievers&#xff09;是搜索 API 中的一种新抽象概念&#xff0c;用于描述如何检索一组顶级文档。检索器被设计为可以…