龙书(附录A):一个完整的编译器前端(学习记录)

2023-11-03

(龙书)完整的编译器前端下载地址:ps:我设置的不要下载积分,如果还是不能下载的话请评论区留言。

https://download.csdn.net/download/Zheng_lan/16779204

百度网盘下载:
链接:https://pan.baidu.com/s/1ZT1jqte-_2DQstf4oCl91g
提取码:iz0k
复制这段内容后打开百度网盘手机App,操作更方便哦

解压代码,用idea打开即可直接运行、
在这里插入图片描述

这个翻译器的Java代码由五个包组成:main, lexer, symbol, parser 和 inter。
下面让我们来分别对它们进行一个了解。

A. 1 源语言

这个语言的一个程序由一个块组成,该块中包含可选的声明和语句。语法符号basic表示基本类型。

A. 2 Main

程序的执行从类main的方法开始,方法main创建了一个词法分析器和一个语法分析器,然后调用语法分析器中的方法program。
在这里插入图片描述

A. 3 词法分析器

包lexer中就是包含词法分析器的代码,类tag定义了各个词法单元对应的常量。如下:
在这里插入图片描述
注:其中的三个常量INDEX、MINUS、和TEMP不是词法单元,它们将在抽象语法树当中使用。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

A. 4 符号表和类型

包symbols实现了符号表和类型。
类Env实质上和上述lexer包的代码一样,将字符串映射为字,类Env把字符串词法单元映射成类id的对象。类id和其他的对应于表达式和语句的类一起都在包inter当中定义。
在这里插入图片描述
在这里插入图片描述
函数numeric和max可用于类型转换。

在这里插入图片描述

A. 5 表达式的中间代码

包inter包含了Node的类层次结构。Node有两个子类;对应于表达式节点的Expr和对应于语句节点的Stmt。
抽象语法树中的节点被实现为类Node的对象。为了报告错误,字段lexline保存了本节点对应的构造在源程序中的行号。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

A. 6 布尔表达式的跳转代码

布尔表达式B的跳转代码由方法jumping生成。这个方法的参数是两个标号t和f,它们分别为表达式B的true出口和false出口。如果真,就调true,否则就跳false出口。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

A. 7 语句的中间代码

每个语句构造被实现为Stmt的一个子类。一个构造的组成部分对应的字段是相应子类的对象。下面的Stml.null表示的是一个空的语句序列,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

A. 8 语法分析器

简单来说,语法分析器读入一个由词法单元组成的流,并调用适当在A.5 - A.7当中提到过的构造函数,构建出一棵抽象语法树。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
语法分析器主要就是针对每个词法单元的一些处理,

A. 9 创建前端

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

龙书(附录A):一个完整的编译器前端(学习记录) 的相关文章

  • 无法在 Android 10 中创建目录

    我无法在 android 10 中创建目录 它可以在 android Oreo 之前的设备上运行 我尝试了两种创建文件夹的方法 Using File mkdir File f new File Environment getExternal
  • 具有更高可见性的重写方法是良好的实践吗?

    回答这个问题 如何使用 GUI 使用 PaintComponent 初始化 GUI 然后添加基于鼠标的 GUI https stackoverflow com questions 21336141 how to gui using pain
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • C# 的算数运算符,关系运算符,逻辑运算符,位运算符,赋值运算符,其他运算符(学习心得 8)

    内置数学 逻辑运算符分类 算数运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 超级小白友好 讲解C 基础 每集5分钟轻松学习 拒绝从入门到放弃 超级小白友好 讲解C 基础 每集5分钟轻松学习 拒绝从入门到放弃 文章目录 一
  • USB学习系列之二——USB设备的插入检测

    1 USB的插入检测机制 USB端口的D 和D 均用一个15k的电阻接地 当无设备接入时 均处于低电平 在设备端在D 表示高速设备或者全速设备 或者D 表示低速设备 接了一个1 5k的上拉电阻到 3 3v 一旦将设备接入 USB端口的D 或
  • 基于redis实现分布式锁

    目录 基本实现 编辑防死锁 防误删 使用lua保证删除原子性 可重入锁 加锁脚本 解锁脚本 代码实现 使用及测试 自动续期 总结 基本实现 借助于redis中的命令setnx key value key不存在就新增 存在就什么都不做 同时有
  • 2023最新信息安全专业毕设题目推荐汇总

    0 简介 毕业季马上就要开始了 不少同学询问学长网安专业选题以及开题相关的问题 今天跟大家分享信息安全毕设选题 最新的信息安全 网络安全 专业毕设选题 难度适中 适合作为毕业设计 大家参考 学长整理的题目标准 相对容易 工作量达标 题目新颖
  • vue中调取支付宝支付接口,后台返回form表单前端处理

    前言 在项目中 支付功能是一个常见的功能 调用支付宝时 后段给我们的是一个form的富文本内容 分享下使用方法 方法 this api abc then res gt res data data默认是我们拿到的form代码 const di
  • AD设置板框内布线禁止区

    这个功能还可用于整体板框扩大 缩小
  • qwt6.0.0交叉编译,在mini2440完美运行

    qwt6 0 0交叉编译 在mini2440完美运行 QWT简介 QWT 全称是Qt Widgets for Technical Applications 是一个基于LGPL版权协议的开源项目 可生成各种统计图 它为具有技术专业背景的程序提
  • Python3 获取本机所有IP地址

    版权声明 更多最新原创文章请访问 最新原创主页 更多最全原创文章请访问 更多原创主页 先上代码 coding utf 8 Time 2018 2 10 18 24 Author 蛇崽 Email 643435675 QQ com File
  • vue2下npm安装国际化i18n包报错

    如题 我项目是vue2 在terminal控制台输入以下指令安装时报错 npm install vue i18n save 原因 在vue2环境下 默认安装 npm install vue i18n 的版本是 vue i18n 9 2 2
  • 【OpenCV图像处理】1.22 像素值映射

    相关理论 什么是像素重映射 简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去 形成一张新的图像 g x y
  • 电子商务计算机考试,电子商务师考试电子商务训练试题

    电子商务师考试电子商务训练试题 导语 电子商务师是指利用计算机技术 网络技术 通过专业的网络商务平台等现代信息技术 帮助商家与顾客或商家与商家之间从事各类商务活动或相关工作的人员 跟着小编一起来看看相关试题吧 1 确定事物之间异同的形式逻辑
  • Ingress配置跨域(服务包含websocket)

    nginx ingress默认是支持websocket 不需要添加配置 如果websocket的端口与当前服务不一致 则需要在rules中配置对应的路径 具体本文不体现 跨域主要配置有 nginx ingress kubernetes io
  • 【Java】maven-shaded-plugin超详细详解

    一 总体介绍 maven shaded plugin提供了两大基本功能 将依赖的jar包打包到当前jar包 常规打包是不会将所依赖的jar包打进来的 对依赖的jar包进行重命名 用于类的隔离 创建一个Shaded JAR maven sha
  • Opencv 入门(三)

    文章目录 图像梯度 Sobel算子 Scharr 算子 Laplacian算子 Canny边缘检测 图像金字塔 高斯金字塔 拉普拉斯金字塔 轮廓检测 画图函数 轮廓特征 面积 周长 轮廓近似 多边形 边界矩形 外接圆 图像梯度 Sobel算
  • 来做一个麦克纳姆轮吧!!

    想玩全向小车么 想搭建一个移动底盘么 想满足中二病的创造欲么 想 那么为什么不自己做一个麦克纳姆轮呢 自己动手丰衣足食 0 准备材料 3D打印机一台 打印耗材 直径2mm 长度60mm的铁轴 这种玩具模型里用的小铁轴刚好可以用来当麦克纳姆轮
  • 03-雾化

    const fog new THREE Fog color near far color 颜色 用于设置雾的颜色 以十六进制表示 near 近平面 处于这个距离之内的物体将被完全雾化 far 远平面 处于这个距离之外的物体将不受雾化影响
  • Java枚举类常量写法

    在写代码的过程中我们常常需要定义一些常量 以下代码是使用枚举类型定义常量的实例 有需要大家可以进行参考 public class MyConstant public enum StatusEnum CREATED 0 状态0 ASSIGNE
  • python趣味编程-盒子追逐者游戏

    在上一期我们用Python实现了一个奥赛罗游戏的游戏 这一期我们继续使用Python实现一个简单的盒子追逐追逐者游戏 让我们开始今天的旅程吧 在Python自由源代码中使用Turtle的盒子追逐者游戏 在Python中使用Turtle的盒子
  • 我使用Java one longin组件进行ADFS连接,但是logout endpoint有问题

    很抱歉 看起来你遇到了使用 Java OneLogin 组件连接 ADFS 时的注销端点问题 这可能是由于 ADFS 设置不正确或 Java OneLogin 组件的配置问题造成的 建议您检查相关文档 并确保 ADFS 和 Java One
  • 龙书(附录A):一个完整的编译器前端(学习记录)

    龙书 完整的编译器前端下载地址 ps 我设置的不要下载积分 如果还是不能下载的话请评论区留言 https download csdn net download Zheng lan 16779204 百度网盘下载 链接 https pan b