# 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;
}
} |
#### 软件架构

#### 语法高亮插件
为了方便编程人员的使用并提高开发效率,在本项目中配套开发了Visual Studio Code平台相应的语法高亮插件,插件以及插件的源码已发布在网站**https://gitee.com/lixiang_98/panda-syntax_highlight**
##### 插件安装前

##### 插件安装后

#### 使用说明
##### 查看帮助

##### 预处理功能
主要处理import语句(类似于C语言中的#include),将被导入的库文件、源代码文件集中写入临时文件panda.src。

##### 词法分析功能
如果只希望编译器预处理阶段时,例如在本例中,在命令行中输入“./panda –p demo”即可,之后便可看到编译器在词法分析阶段的工作状态,词法分析阶段编译器会将根据词法规则识别出Token,该阶段结束后可看到编译器把识别到的Token序列写入了文件panda.src。

##### 语法分析功能
语法分析阶段只会给出语法分析的结果,即语法分析是否成功。为了展示的方便,这里的例子比较简短。
1. **语法分析失败的例子**

2. **语法分析成功的例子**
##### 语义分析功能
在前文【软件架构】及【使用说明——查看帮助】部分都体现了该编译器的语义分析有三个阶段。各个阶段完成的主要功能如下:
1. 第一阶段:遍历Token序列获取到的类型、成员变量等相关信息。
2. 第二阶段:再次遍历Token序列获取到的成员函数等相关信息。
3. 第三阶段:第三次遍历Token序列获取到抽象语法树。
###### 第一阶段语义分析
在命令行中输入“./panda –g1 demo”即可看到其第一次遍历Token序列获取到的类型、成员变量等相关信息。如下图,可以看到,它以表格的形式展示了类yyy的信息,并且输出了其成员变量是否为static、访问修饰符、类型、变量名、变量大小、相对类yyy的偏移量等。

###### 第二阶段语义分析
在命令行中输入“./panda –g2 demo”即可看到其第二次遍历Token序列获取到的成员函数等相关信息。如下图,可以看到,它以表格的形式展示了类yyy成员函数的信息,信息内容包括是否为static、访问修饰符、返回值类型、函数名、参数类型等。

###### 第三阶段语义分析
在命令行中输入“./panda –g3 demo”即可看到其第三次遍历Token序列获取到的抽象语法树。如下图,可以看到,它以凹入表示法的方式展示抽象语法树的结构,对于树上的每一个节点,都展示了其节点类型、类作用域、函数作用域等信息。

##### 生成汇编代码
生成汇编代码是该编译器工作的最后一个阶段,在命令行中输入“./panda –g2 demo”后,可看到它的工作状态,如当前正在编译哪一个类型节点,当前正在申请或释放哪一个寄存器等。在一切工作都完成后,可以看到它将汇编语句都写进了panda.asm,在该例子中截取了部分生成的汇编语句。如下图所示。


##### 生成可执行二进制文件
该编译器的工作,其实到代码生成阶段就已经结束了。但为了能够看到程序的运行效果,这里将借助其他工具将汇编代码转换为机器语言。具体方法如下,在命令行中输入“./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”即可看到程序的运行效果。如下图所示。

