当前位置:首页 > 编译原理课设
课 程 实 验 报 告
课程名称: 编
译 原 理
C语言汇编器的实现
专业班级: 学 号: 姓 名: 指导教师: 报告日期:
计算机科学与技术学院
一 实验内容
实现一个C语言的编译器。
二 概述
编译器可划分为词法分析器,语法分析器,语义分析器,四元组生成以及汇编代码生成。
本编译器除了实现上述几个基本模块外还实现了四元组的优化,汇编代码的优化和头文件的包含,由于时间缘故并没有对宏进行进一步的实现。 编译器支持的数据类型为:int, char, float(理论上对于所有数据类型均可识别,但不支持翻译)。 编译器支持的语法结构为:赋值语句(不支持”(“和”)”运算),do-while循环语句,if-else条件语句(if和else后面的语句块必须符合语法标准及被”{“和”}”包含),不支持函数调用。 四元组优化为:重复子元组的优化,如(+,a,c,b)……(+,a,c,d),若这两个四元组之间a和c的值没有发生改变,那么后一个四元组会被优化为(=,b,-,d)。 汇编代码的优化详细见后文。 (代码在答辩后对于老师的建议做了一定的修正,包括文件名输入,四元组的修正,以及新加入的汇编代码的优化) 使用说明:
1. 首先输入待编译文件名,然后选择是否需要优化汇编代码。若编译正确,则会产生
两个新的文件.o文件和.asm文件,分别对应待编译文件的中间代码和目标代码。 2. 本编译器仅支持全局变量 3. 本编译器不支持函数
4. If-else以及do-while后面的语句块必须符合定义的语法标准,即被“{”和“}”包
含。
三 实验方案
1. 词法分析器
C语言中有6中词法元素:标识符(identifiers),关键字(keywords),常量(constants),字符串文字(string literals),空白字符(white space)(包括注释)。而实际上还存在一些其他非空白符(如?{?、?}?、?;?)。因此稍作整合和简化,就有标识符,关键字,常量(包括整形常量,浮点常量,字符常量),字符串文字,操作符,其他非空白符六种,分别编号为1~6。在计数时,将sizeof归入关键字,以免重复计数。
1) 单词符号及种别表: 单词符号 变量 种别编码 1 2 2 2 2 2 2 2 2 2 标号 1 2 3 4 5 6 7 8 9 10 main int float double char if else do while 常量 字符串 = + - * / ( ) > >= < <= == != , { } ;
2) 算法的流程图
3 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 开始 读入字符串S S为空? Y N 提取关键字token 结束 识别token词法属性 输出关键字token及其词法属性 可以看出,提取token和识别token便成为了本次实验的重难点。 3) 文法
首先以字符串方式读入程序,假定所有读入的字符串间都由间隔符分开,这用C语言的标准输入scanf便可以轻松实现。对于每一个字符串,根据经验假定是文法G[S]的句子。
其中G[S]为:
**S?N10PN10EN10GAPS (10进制整形常量)
**S?0N8PN8EN8GAPS(8进制常量) **S?0SXN16PN16EN16GAPS (16进制常量)
S?'ANY'GAPS (字符常量) S?\ANY\GAPS (字符串) S?OPANYGAPS (操作符)
共分享92篇相关文档