本课程为计算机专业的核心课程《编译原理》设计,通过构建C0语言编译器的实际项目,旨在帮助学生深入理解词法分析、语法分析及代码生成等关键技术。报告详细记录了实验过程和心得体会。
题目:C0编译器的设计与实现(10周)
**C0语言的语法结构定义如下**
<程序>->[<变量定义部分>] {<自定义函数定义部分>} <主函数>
<变量定义部分>-> int id {, id};
<自定义函数定义部分>-> (int id | void id) () <分程序>
<主函数>->void main() <分程序>
<分程序>->{ [<变量定义部分>] <语句序列> }
<语句序列>-><语句>{<语句>}
<语句>->
- <条件语句>
- <循环语句>
- {<语句序列>}
- <自定义函数调用语句>
- <赋值语句>
- <返回语句>
- <读语句>
- <写语句> | ;
<条件语句>-if (<表达式>) <语句>[else <语句>]
<循环语句>-while ( <表达式>) <语句>
<自定义函数调用语句>-<自定义函数调用>;
<赋值语句>-id = <表达式>;
<返回语句>-return [(<表达式>] ;
<读语句>-scanf(id);
<写语句>-printf([<表达式>]);
<表达式>-[+|-] <项>{(+|-) <项>}
<项>-> <因子>{(*|/) <因子>}
<因子> -> id|( <表达式>) | num | <自定义函数调用>
其中,id代表标识符,num代表整数。C0源程序中的变量需先定义后使用,其作用域与生存期与C语言相一致;自定义函数可超前使用(即调用在前、定义在后)。
**根据上述给定的C0文法及其说明和下列假想栈式指令系统,按递归下降分析法设计并实现该C0语言的编译器。生成目标代码为栈式指令,并编写解释执行程序以输出目标代码的结果**
### **假想的栈式指令系统表**
- LIT 0 a: 将常数值取到栈顶(a是常数值)
- LOD t a: 取变量值至栈顶,其中a代表相对地址,t为层差
- STO t a:将栈顶内容送入某变量单元中,a为相对地址,t为层差
- CAL 0 a:调用函数(a是函数地址)
- INT 0 a: 在运行栈中分配给被调用的过程开辟a个单元的数据区
- JMP 0 a: 无条件跳转至指定的指令位置(a)
- JPC 0 a: 条件跳转,若栈顶值为零则转向执行地址a处指令;否则顺序执行下一条指令
- ADD 0 0:次栈顶与栈顶相加后退两个元素并将结果放回栈中
- SUB 0 0:次栈顶减去栈顶(同样操作)
- MUL 0 0: 次栈顶乘以栈顶,然后弹出两数并放入计算后的值到堆栈顶部。
- DIV 0 0: 栈中的两个元素相除后退下两个元素并将结果放回
- RED 0 a:从命令行读入一个输入置于栈顶(a为标识符)
- WRT 0 a: 输出当前的栈顶内容至屏幕并换行。
- RET 0 a:函数调用结束后,返回到调用点,并退栈。