Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/lc044/minic
MiniC语言编译器前端,生成抽象语法树,产生线性IR,生成控制流图
https://github.com/lc044/minic
ast complier ir
Last synced: 3 months ago
JSON representation
MiniC语言编译器前端,生成抽象语法树,产生线性IR,生成控制流图
- Host: GitHub
- URL: https://github.com/lc044/minic
- Owner: LC044
- License: gpl-3.0
- Created: 2023-05-24T08:25:48.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-03-25T13:46:31.000Z (9 months ago)
- Last Synced: 2024-03-26T13:06:22.126Z (9 months ago)
- Topics: ast, complier, ir
- Language: C++
- Homepage:
- Size: 87.6 MB
- Stars: 6
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
[![stars](https://img.shields.io/github/stars/LC044/MiniC.svg)](https://github.com/LC044/MiniC/stargazers)
[![文档](https://img.shields.io/badge/文档-brightgreen.svg)](./doc/readme.md)
[![LICENSE](https://img.shields.io/badge/license-GPL3.0-blue.svg)](LICENSE)- [西北工业大学编译原理实验课](#西北工业大学编译原理实验课)
- [要求与目标](#要求与目标)
- [实验目标:](#实验目标)
- [实验要求:](#实验要求)
- [总体完成情况](#总体完成情况)
- [minic](#minic)
- [功能](#功能)
- [功能示例](#功能示例)
- [具体功能](#具体功能)
- [词法分析](#词法分析)
- [语法分析](#语法分析)
- [语义分析](#语义分析)
- [代码优化](#代码优化)
- [源代码构成](#源代码构成)
- [各模块之间的关系](#各模块之间的关系)
- [详细设计](#详细设计)# 西北工业大学编译原理实验课
2023.06.28
## 要求与目标
### 实验目标:
1. 理解并掌握词法分析、语法分析、语义分析、中间代码生成功能
2. 理解并掌握非线性 IR:抽象语法树
3. 理解并掌握线性 IR:三地址语句或四元式### 实验要求:
1. 识别程序是否符合MiniC的语法要求
2. 输入MiniC的源文件
3. 输出程序的中间IR表示
4. 输出抽象语法树,通过Graphviz显示
5. 输出控制流图,通过Graphviz显示## 总体完成情况
![alt text](./doc/image/image.png)
# minic
## 功能
1. ✅选项-a可产生抽象语法树AST
cmake-build-debug\minic.exe -a -o test.jpg test.c2. ✅选项-r可产生线性IR
cmake-build-debug\minic.exe -i -o test.ir test.c3. ✅选项-c可产生控制流图
cmake-build-debug\minic.exe -c main -o test_main_cfg.png test.c## 功能示例
1. [028_if_test1.c](/doc/image/028_if_test1_ast.jpg) 抽象语法树
抽象语法树
2. [028_if_test1.c](/doc/image/028_if_test1_ast.jpg) 线性ir
```bash
define i32 @ifElse() {
declare i32 %l0 ; variable: return
declare i32 %l1 ; variable: a
declare i32 %t2
declare i1 %t3
declare i32 %t4
declare i32 %t5
declare i32 %t6
declare i32 %t7
entry
%l1 = 5
%t2 = %l1
%t3 = cmp eq %t2, 5
bc %t3, label .L3, label .L4
.L3:
%l1 = 25
br label .L5
.L4:
%t4 = %l1
%t5 = mul %t4, 2
%l1 = %t5
br label .L5
.L5:
%t6 = %l1
%l0 = %t6
%t7 = %l0
exit %t7
}
define i32 @main() {
declare i32 %l0 ; variable: return
declare i32 %t1
declare i32 %t2
entry
%t1 = call i32 @ifElse()
%l0 = %t1
%t2 = %l0
exit %t2
}
```3. [028_if_test1.c](/doc/image/028_if_test1_ast.jpg) 控制流图
控制流图
## 具体功能
### 词法分析
1. 词法分析使用flex实现
2. 识别MiniC文法的所有终结符(标识符、关键字、十进制、八进制、十六进制整数)
3. C语言的注释识别支持
4. 提供文法识别错误的行号定位信息### 语法分析
1. 语法分析使用bison实现
2. 支持int和void类型,变量只允许int,函数返回值可以使用void和int
3. 变量定义(含全局变量、局部变量)与使用
4. 表达式语句、空语句支持
5. if语句、while语句和赋值语句支持
6. 语句块支持
7. 表达式支持算术运算、关系运算、逻辑运算;满足C语言的优先级、结合性等要求
8. 支持函数定义、声明与函数调用
9. 支持一维数组和多维数组定义与使用
10. 简单变量定义时初始化支持(语法支持,语义暂不支持)
11. 支持for循环
12. 支持自增与自减运算
13. 语法分析错误检查与定位(暂只支持错误定位,不支持错误类型判断)### 语义分析
1. 采用语法制导翻译,生成抽象语法树
2. 遍历抽象语法树产生中间IR
3. 变量分层管理支持,支持变量的作用域,特别是变量的重名
4. 变量或函数要先声明后使用,否则语义错误
5. 逻辑运算支持短路求值
6. 具备简单的语义错误检查定位和输出
7. 中间IR表达采用实验定义IR### 代码优化
1. 基本块划分与控制流图生成
2. 控制流图图形化显示(使用graphviz的API产生控制流图)
3. 控制流的优化
1. 删除不可达基本块
2. 删除多余Label指令
4. IR的优化
1. 常量折叠(a = 2+3等价于a=5)
2. 没有了## 源代码构成
| 文件名 | 作用 |
| ------------------------ | --------------------------- |
| minic.l | 借助flex工具实现的词法分析器脚本源代码 |
| minic_lex.cpp | 借助flex工具实现的词法分析器自动生成C语言源文件 |
| minic_lex.h | 借助flex工具实现的词法分析器自动生成C语言头文件 |
| minic.y | 借助bison工具实现的语法分析器脚本源代码 |
| minic_yacc.cpp | 借助bison工具实现的语法分析器自动生成C语言源文件 |
| minic_yacc.h | 借助bison工具实现的语法分析器自动生成C语言头文件 |
| ast.cpp | 抽象语法树创建所需要的函数 |
| ast.h | ast.cpp对应的头文件 |
| parser.h | flex和bison工具用到的节点属性定义 |
| graph.cpp | 遍历抽象语法树利用graphviz生成图片 |
| graph.h | graph.cpp对应的头文件 |
| symbol.cpp | 符号表管理 |
| symbol.h | symbol.cpp对应的头文件 |
| genSymbol.cpp | 产生符号表并进行语义检查 |
| genIR.cpp | 线性IR指令类的实现 |
| IRInst.h | 线性IR指令类的头文件 |
| IRCode.cpp | 线性IR管理类的实现 |
| cfg.h,.cfg.cpp | 控制流图的头文件及其实现 |
| Basic_block_division.cpp | 实现基本块划分 |
| common.cpp,common.h | 一些通用函数的定义与实现 |
| test.c | 测试用例 |
| main.cpp | 计算器程序的主函数 |## 各模块之间的关系
![alt text](./doc/image/img5.png)
## 详细设计
[参考文档](./doc/readme.md)
打个广告
[MemoTrace——一款强大的微信聊天记录管理工具](https://memotrace.cn/)
> 我深信有意义的不是微信,而是隐藏在对话框背后的一个个深刻故事。未来,每个人都能拥有AI的陪伴,而你的数据能够赋予它有关于你过去的珍贵记忆。我希望每个人都有将自己的生活痕迹👨👩👦👚🥗🏠️🚴🧋⛹️🛌🛀留存的权利,而不是遗忘💀。
![](https://memotrace.cn/img/pdfdemo.png)