# compiler-panda **Repository Path**: lixiang_98/compiler-panda ## Basic Information - **Project Name**: compiler-panda - **Description**: 毕设,编译器 - **Primary Language**: C++ - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-17 - **Last Updated**: 2023-07-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # compiler-panda #### 介绍 该项目为本人本科阶段计算机科学与技术专业的毕设。 本次研发最主要的目的就是设计一套面向对象的编程语言Panda并实现配套的编译器 Pandac。该语言的语法设计借鉴了Java,但仅包含”封装、继承、多态“中的封装部分。 #### 关键字、基本数据类型、运算符 | 项目 | 内容 | | ---------- | ------------------------------------------------------------ | | 关键字 | class this entry public private main
bool true false
int8 int16 int32 uint8 uint16 uint32
if else while break continue return | | 访问修饰符 | public private | | 基本类型 | bool int8 int16 int32 uint8 uint16 uint32 | | 运算符 | 算数运算符: +, -, *, /, =
位运算符:&, \|, ~, ^
逻辑运算符:&&, \|\|, !
比较运算符:<, <=, ==, !=, >=, > | #### 语法规则表 | 项目 | 规则 | 示例 | | ------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | 标识符 | 标识符可有下划线、字母、数字组成,但第一个字符不可为数字 | _panda
panda123
panda_123
_123 | | 单行注释 | 以#开头,后面的字符将被视为注释,直至行尾 | # 这是一条单行注释 | | import语句 | import 包名,必须是单独一行 | import hello | | 定义局部变量 | 类型 标识符; | int32 panda;
uint32 pd; | | if-else语句 | 使用方式同C语言,但{}不可省略 | | | while循环语句 | while(表达式)
{
......
} | while(i > 0)
{
i = i - 1;
} | | 定义成员变量 | 访问修饰符 类型 标识符; | public int32 panda;
private uint32 pd; | | 定义成员函数 | 访问修饰符 类型 标识符([参数, ......]){
......
} | public int32 pd(int32 a){
return a;
} | | 自定义类类型 | class 标识符{
[定义成员变量, ......]
[定义成员函数, ......]
} | class person{
private int32 age;
public getAge(){
return age;
}
} | #### 软件架构 ![架构](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/架构.png) #### 语法高亮插件 为了方便编程人员的使用并提高开发效率,在本项目中配套开发了Visual Studio Code平台相应的语法高亮插件,插件以及插件的源码已发布在网站**https://gitee.com/lixiang_98/panda-syntax_highlight** ##### 插件安装前 ![语法高亮插件安装前](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/语法高亮插件安装前.png) ##### 插件安装后 ![语法高亮插件安装后](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/语法高亮插件安装后.png) #### 使用说明 ##### 查看帮助 ![查看帮助](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/查看帮助.png) ##### 预处理功能 主要处理import语句(类似于C语言中的#include),将被导入的库文件、源代码文件集中写入临时文件panda.src。 ![预处理功能](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/预处理功能.png) ##### 词法分析功能 如果只希望编译器预处理阶段时,例如在本例中,在命令行中输入“./panda –p demo”即可,之后便可看到编译器在词法分析阶段的工作状态,词法分析阶段编译器会将根据词法规则识别出Token,该阶段结束后可看到编译器把识别到的Token序列写入了文件panda.src。 ![词法分析功能](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/词法分析功能.png) ##### 语法分析功能 语法分析阶段只会给出语法分析的结果,即语法分析是否成功。为了展示的方便,这里的例子比较简短。 1. **语法分析失败的例子** ![语法分析失败的例子](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/语法分析失败的例子.png) 2. **语法分析成功的例子**![语法分析成功的例子](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/语法分析成功的例子.png) ##### 语义分析功能 在前文【软件架构】及【使用说明——查看帮助】部分都体现了该编译器的语义分析有三个阶段。各个阶段完成的主要功能如下: 1. 第一阶段:遍历Token序列获取到的类型、成员变量等相关信息。 2. 第二阶段:再次遍历Token序列获取到的成员函数等相关信息。 3. 第三阶段:第三次遍历Token序列获取到抽象语法树。 ###### 第一阶段语义分析 在命令行中输入“./panda –g1 demo”即可看到其第一次遍历Token序列获取到的类型、成员变量等相关信息。如下图,可以看到,它以表格的形式展示了类yyy的信息,并且输出了其成员变量是否为static、访问修饰符、类型、变量名、变量大小、相对类yyy的偏移量等。 ![第一阶段语义分析](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/第一阶段语义分析.png) ###### 第二阶段语义分析 在命令行中输入“./panda –g2 demo”即可看到其第二次遍历Token序列获取到的成员函数等相关信息。如下图,可以看到,它以表格的形式展示了类yyy成员函数的信息,信息内容包括是否为static、访问修饰符、返回值类型、函数名、参数类型等。 ![第二阶段语义分析](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/第二阶段语义分析.png) ###### 第三阶段语义分析 在命令行中输入“./panda –g3 demo”即可看到其第三次遍历Token序列获取到的抽象语法树。如下图,可以看到,它以凹入表示法的方式展示抽象语法树的结构,对于树上的每一个节点,都展示了其节点类型、类作用域、函数作用域等信息。 ![第三阶段语义分析](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/第三阶段语义分析.png) ##### 生成汇编代码 生成汇编代码是该编译器工作的最后一个阶段,在命令行中输入“./panda –g2 demo”后,可看到它的工作状态,如当前正在编译哪一个类型节点,当前正在申请或释放哪一个寄存器等。在一切工作都完成后,可以看到它将汇编语句都写进了panda.asm,在该例子中截取了部分生成的汇编语句。如下图所示。 ![生成汇编代码阶段工作效果](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/生成汇编代码阶段工作效果.png) ![生成汇编代码阶段的文件](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/生成汇编代码阶段的文件.png) ##### 生成可执行二进制文件 该编译器的工作,其实到代码生成阶段就已经结束了。但为了能够看到程序的运行效果,这里将借助其他工具将汇编代码转换为机器语言。具体方法如下,在命令行中输入“./pandac demo”,编译器将一次完成所有的阶段,并且工作中所生成的文件将全部显示出来。之后,在命令行中输入“nasm –f elf –g panda.asm”,汇编器nasm将会扫描汇编文件panda.asm并生成目标文件panda.o。接着,在命令行中输入“gcc –m32 –g –o a.out panda.o”,这里仅使用了编译器GCC的链接功能,接收目标文件panda.o并生成了Linux平台下32位的可执行文件a.out。在命令行中输入“./a.out”即可看到程序的运行效果。如下图所示。 ![生成可执行二进制文件的步骤](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/生成可执行二进制文件的步骤.png) ![二进制文件执行效果](https://gitee.com/lixiang_98/compiler-panda/raw/master/images/二进制文件执行效果.png)