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

(龙书)完整的编译器前端下载地址: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 创建前端

在这里插入图片描述

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

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村头卖假发的小郑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值