# 混元形译:A C-like-compiler
同济大学CS《编译原理》课程设计: 类C语言编译器TongJi University CS compiler theory assignment
## 概述
本项目是为2021年同济大学计算机系编译原理课程设计。实现了类C语言编译为MIPS的汇编器。
![image-20230518205135098](README.assets/image-20230518205135098.png)
### 程序功能
1. 程序具有图形界面,包含简单的编辑器,可以让用户非常方便地编辑类C语言文件。编辑器还具备一定的辅助功能,具体包括:显示代码行号、高亮关键字、高亮变量名、区分注释内容以及一定的自动补全功能。编辑器还支持全选、复制、粘贴、撤销、重做等常见的编辑操作。
2. 程序具有较为完善的文件操作。可以让用户新建文件、打开本地文件、将修改后的文件保存或者另存为。当用户在编辑器内对文件进行修改且文件尚未保存时,程序会在标题栏内用 * 号提示文件尚未保存,此时用户关闭程序或者打开新文件时,程序会弹出文件尚未保存的提示,以免用户误操作。除此以外,程序的大部分操作功能都有快捷键对应,提高了使用效率。
3. 程序可以对类C语言代码编译,支持函数过程调用和数组。编译完成后会在原文件路径下生成汇编语言代码文件并在运行日志中输出对应的编译信息或者发生编译错误时的错误提示信息。此时用户可以查看详细的编译过程和结果。具体包括:词法分析阶段的单词符号串和符号表;语法分析阶段生成的LR(1)分析表、语法分析过程和生成的语法树;语义分析阶段的符号地址表和生成的中间代码;优化阶段的基本块划分和优化后的中间代码;目标代码生成阶段的待用活跃信息表、寄存器分配过程以及最终的MIPS汇编程序。
4. 程序的编译功能较为完备,除了支持最基本的C语言文法外还支持函数过程调用、支持多维数组。支持编译常见的C语言算法,例如递归算法、动态规划算法等。此外本程序还使用DAG图实现了局部优化,取得了明显的优化效果。
### 程序输入
1. 文法文件:该文件是程序的配置文件,与可执行程序在同一目录下,具有只读属性。
2. 类C语言代码文件:程序接收的被编译文件,该文件可由程序中的编辑器创建并保存。
### 程序输出
1. 程序运行日志:显示程序相关信息、程序编辑的过程信息或者编译出错的提示信息、目标代码文件的保存路径。
2. 程序编译过程展示:通过表格、图形、文字详细展示编译每一步中的工作过程和工作结果。
3. 目标代码文件:编译完成的MIPS汇编代码,可在MARS汇编器上运行。
## 备注:star:
本学期最费劲的大作业,从开学开始做,整个三月把后端搞定,之后又花了小一个礼拜搞定了前端。
如果本仓库有帮助到你,就送我一颗star吧🤗
如果有问题也可以在issue提出,方便其他人参考或一起讨论😋
## 设计
### 项目结构
![image-20230518203242995](README.assets/image-20230518203242995.png)
### 文法设计
#### 约定
所有非终结符用尖括号<>包含,所有终结符用单引号’’包含,产生式箭头用::=表示,文法中的第一个产生式的左部为文法的开始符号。
#### 文法符号
| 文法终结符 | AND | ASSIGN | DEL | ELSE |
| ---------- | ---------- | ------ | ----- | ------- |
| 含义 | && | = | ; | else |
| 文法终结符 | ID | IF | INT | LB |
| 含义 | ID | if | int | { |
| 文法终结符 | LP | LS | NOT | NUM |
| 含义 | ( | [ | ! | num |
| 文法终结符 | OP1 | OP2 | OR | RB |
| 含义 | +-&\|^ | */ | \|\| | } |
| 文法终结符 | RELOP | RETURN | RP | RS |
| 含义 | 比较运算符 | return | ) | ] |
| 文法终结符 | SEP | VOID | WHILE | epsilon |
| 含义 | , | void | while | |
| 文法终结符 | # | | | |
| 含义 | 终止符 | | | |
| 文法非终结符 | ACTUALPARAM | ACTUALPARAMLIST | ARRAY |
| ------------ | -------------- | --------------- | --------------- |
| 含义 | 实参 | 实参列表 | 数组 |
| 文法非终结符 | ARRAYASSERTION | ASSERTION | ASSERTIONS |
| 含义 | 数组声明 | 声明 | 声明组 |
| 文法非终结符 | ASSERTIONTYPE | ASSIGNMENT | B |
| 含义 | 声明类型 | 赋值语句 | 辅助语义分析 |
| 文法非终结符 | BOOLAND | BOOLNOT | CALL |
| 含义 | 与操作表达式 | 非操作表达式 | 函数调用 |
| 文法非终结符 | COMP | CTRL | EXPRESSION |
| 含义 | 比较运算表达式 | 布尔表达式 | 表达式 |
| 文法非终结符 | FACTOR | FORMALPARAM | FORMALPARAMLIST |
| 含义 | 因子 | 形参声明 | 形参列表 |
| 文法非终结符 | FUNCASSERTION | IFSEN | INNERASSERTION |
| 含义 | 函数声明 | 条件语句 | 内部声明 |
| 文法非终结符 | INNERVARIDER | M | N |
| 含义 | 内部变量声明 | 辅助语义分析 | 辅助语义分析 |
| 文法非终结符 | PLUSEX | PROGRAM | RETURNSEN |
| 含义 | 加法表达式 | 程序开始 | 返回语句 |
| 文法非终结符 | SENBLOCK | SENSEQ | SENTENCE |
| 含义 | 语句块 | 语句串 | 语句 |
| 文法非终结符 | T | TERM | WHILESEN |
| 含义 | 辅助语义分析 | 项 | 循环语句 |
#### LR(1)文法
```
<PROGRAM>::=<M><ASSERTIONS>
<M>::='epsilon'
<ASSERTIONS>::=<ASSERTION>|<ASSERTION><ASSERTIONS>
<ASSERTION>::='INT''ID'<ASSERTIONTYPE>'DEL'|<FUNCASSERTION><SENBLOCK>
<ASSERTIONTYPE>::='epsilon'|<ARRAYASSERTION>
<FUNCASSERTION>::='VOID''ID'<M>'LP'<FORMALPARAM>'RP'|'INT''ID'<M>'LP'<FORMALPARAM>'RP'
<ARRAYASSERTION>::='LS''NUM''RS'|'LS''NUM''RS'<ARRAYASSERTION>
<FORMALPARAM>::=<FORMALPARAMLIST>|'VOID'|'epsilon'
<FORMALPARAMLIST>::='INT''ID'|'INT''ID''SEP'<FORMALPARAMLIST>
<SENBLOCK>::='LB'<INNERASSERTION><SENSEQ>'RB'
<INNERASSERTION>::=<INNERVARIDEF>'DEL'<INNERASSERTION>|'epsilon'
<INNERVARIDEF>::='INT''ID'|'INT''ID'<ARRAYASSERTION>
<SENSEQ>::=<SENTENCE>|<SENTENCE><SENSEQ>
<SENTENCE>::=<IFSEN>|<WHILESEN>|<RETURNSEN>'DEL'|<ASSIGNMENT>'DEL'
<ASSIGNMENT>::='ID''ASSIGN'<EXPRESSION>|<ARRAY>'ASSIGN'<EXPRESSION>
<RETURNSEN>::='RETURN'<EXPRESSION>|'RETURN'
<WHILESEN>::=<B>'WHILE''LP'<CTRL>'RP'<T><SENBLOCK>
<B>::='epsilon'
<IFSEN>::='IF''LP'<CTRL>'RP'<T><SENBLOCK>|'IF''LP'<CTRL>'RP'<T><SENBLOCK>'ELSE'<N><SENBLOCK>
<CTRL>::=<EXPRESSION>
<T>::='epsilon'
<N>::='epsilon'
<EXPRESSION>::=<BOOLAND>|<BOOLAND>'OR'<EXPRESSION>
<BOOLAND>::=<BOOLNOT>|<BOOLNOT>'AND'<BOOLAND>
<BOOLNOT>::=<COMP>|'NOT'<COMP>
<COMP>::=<PLUSEX>|<PLUSEX>'RELOP'<COMP>
<PLUSEX>::=<TERM>|<TERM>'OP1'<PLUSEX>
<TERM>::=<FACTOR>|<FACTOR>'OP2'<TERM>
<FACTOR>::='NUM'|'LP'<EXPRESSION>'RP'|'ID'|<ARRAY>|'ID'<CALL>|'LP'<ASSIGNMENT>'RP'
<CALL>::='LP'<ACTUALPARAM>'RP'
<ARRAY>::='ID''LS'<EXPRESSION>'RS'|<ARRAY>'LS'<EXPRESSION>'RS'
<ACTUALPARAM>::=<ACTUALPARAMLIST>|'epsilon'
<ACTUALPARAMLIST>::=<EXPRESSION>|<EXPRESSION>'SEP'<ACTUALPARAMLIST>
```
### 详细设计
#### 词法分析器
词法分析器使用while和switch结构实现了一个状态机。首先把整个类C语言代码以�
机智的程序员zero
- 粉丝: 2459
- 资源: 4741
最新资源
- Git 分布式版本控制系统常见操作指南
- 电力市场出清程序 IEEE14节点考虑输电阻塞,求解机组边际电价和节点边际电价 采用拉格朗日乘子进行分析计算,目标函数为发电成本最小 运用matlab中的linprog()函数实现此程序,均为m
- 电力电子、电机驱动、数字滤波器matlab simulink仿真模型实现及相关算法的C代码实现 配置C2000 DSP ADC DAC PWM定时器 中断等模块,提供simulink与DSP的联合仿
- 双层优化 大型电动汽车 时空调度 测试环境:MATLAB 关键词:双层优化,电动汽车,时空调度,配电网 考虑电动汽车有序充放电的机组组合和最优趋势,机组组合采用相同的线性化方法,采用二阶锥松弛的
- 基于MATLAB的四旋翼无人机PID控制
- 堆垛机-西门子PLC程序+输送线程序+触摸屏程序 物流仓储 涵盖通信,算法,运动控制,屏幕程序 实际项目程序 西门子S7-1200+G120+ET200S+劳易测激光测距 博途编程 采用用
- 分析储能接入对新能源消纳能力影响 目标函数:系统经济性最优包括燃料成本和弃风惩罚成本 约束:功率平衡,储能约束,机组出力上下限,机组爬坡约束,风电出力约束
- (matlab)三相并网逆变器svpwm控制+PI电流环控制(有参考文献) (1)符合入网电流谐波标准 (2)并网电流和电压同相 (3)采用锁相环PLL
- 三菱PlC程序大型项目QCPU+QD77MS16 项目说明如下: 1.包含一套完整的电气开发系统资料(包含plc程序,触摸屏程序,伺服模块设置程序,程序开发地址规划表) 2.这套开发程序是用一套完
- 基于遗传算法的配电网优化配置 软件:Matlab 介绍:分布式电源、无功补偿装置接入配电网,考虑配电网经济性、环境成本和电能质量为目标函数,使用遗传算法进行优化配置,在IEEE33节点系统进行了仿真验
- 遗传算法求解微电网日前调度 测试环境:MATLAB 用遗传算法求解电力系统简单日前调度问题,考虑微网发电成本的经济性,以微型燃气轮机发电成本、 储能运行维护成本和微网与主网之间买、卖电的交互成本为系统
- 直驱永磁风力发电机,基于Simulink建立了包括风力机、传 动系统、永磁同步发电机、整流逆变、电网等模块的永磁直驱风力发电机控制系统模型 附带文件说明
- 西门子modbus通讯 读取或写入仪表
- 三菱Q程序程序(某集团设备程序) 用三菱Q系列和威纶触摸屏编写 此程序已经实际设备上批量应用,程序成熟可靠,借鉴价值高,程序有注释 由于程序代码可复制发后不可 此款为宏指令未加密
- 考虑降解成本的具有混合储能的微电网两层能源管理系统,采用了模型预测控制的方法
- 综合能源系统仿真,冷热电三联供仿真,simulink仿真
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页