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