1、塔里木大学课程设计2017届课程设计C语言编译器的设计与实现 学生姓名: 库尔班江.阿瓦克日 学 号: 5011212524 所属学院: 信息工程学院 专 业: 计算机科学与技术 班 级: 计算机17-1班 塔里木大学教务处制不要删除行尾的分节符,此行不会被打印编译原理大作业目录第1章 编译器概述21.1编译器概述2第2章 编译器设计42.1词法分析设计42.1语法分析设计62.1中间代码生成92.1语法翻译实现方法11第3章 数据结构说明123.1数据结构说明12第4章 编译程序运行测试154.1编译程序运行测试15参考文献18第1章 编译器概述黄金分割的 哈工大回归热大 【】个阿訇 妇孺诶
2、航天拖后腿航天皇太后 1.1 编译器概述编译器的任务是:输入 *.asm 源程序文件,输出 *.obj 目标代码文件和 *.lst 列表文件对输入的源程序进行扫描,找出所有词法和语法的错误,然后生成有待重定位的目标代码(中间文件)和提供查看信息的列表文件。中间文件后缀名为obj,是连接器的输入文件。一个编译器的整个工作流程是划分成一个一个阶段进行的,每个阶段都将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密联结在一起的。这几个阶段是:词法分析、语法分析、语义分析、中间代码生成。另外两个重要的工作:符号表格的管理和出错处理贯穿以上的所有阶段。编译过程中源程序的各种信息
3、被保留在种种不同的表格里。编译时自始至终涉及到表格的构造、查找和更新。如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些地方编译器还能自动校正错误,这些工作称之为出错处理。词法分析自左至右扫描源程序的字符串,并识别出一个个的单词(也称单词符号)。这里所谓的单词是指逻辑上紧密相连的按词的组成规则结合起来的一组字符,它们具有一定的意义。把每个单词的ASCII 码序列替换成所谓的机内表示Token 形式。这时还需要检查词法错误。词法分析阶段不依靠语法关系。语法分析扫描对象可能是源程序的AS
4、CII 码序列,也可能是词法分析后的Token 序列。前者情形,词法分析程序作为语法分析程序的子程序。语法分析的主要任务是检查源程序的形式语法错误。每当发现错误时将输出有关信息。很多编译程序在进行语法分析时同时完成其他工作,但要注意,如果语法有错误,那么其他工作也就白做。语义分析扫描的对象通常是语法分析后的结果。这时候,源程序的Token 序列已经变换成没有错误的符合语法的Token 生成树。对于编译器来说,它的任务是收集符号信息,登记在符号表格里,对伪指令的语义进行解释,完成相应的动作。伪指令的功能是改变编译器的状态并将一些必要的信息(如段定义,变量声明)加入到目标文件中去。另外,表达式的求
5、值,段的选择,地址计数器的计数,指令长度的计算等都在这个阶段中完成。语义分析阶段同样进行着对错误的处理。目标代码生成这时候的Token 流在形式上已经比较一致,符号信息都已经登记在各种表格里。这个阶段的任务是根据助记符的各种寻址方式决定它的目标代码。这一部分的工作与目标机的指令系统紧密相关。目标代码生成之后,还要根据obj 文件的格式把目标代码写入文件。最后还要产生列表文件,为用户提供源码与目标码的对照。第2章 编译器设计2.1 词法分析设计由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出
6、单词符号。我们规定输出的单词符号格式为如下的二元式: (单词种别,单词自身的值)#define ACC -2#define syl_if 0#define syl_else 1#define syl_while 2#define syl_begin 3#define syl_end 4#define a 5#define semicolon 6#define e 7#define jinghao 8#define s 9#define L 10#define tempsy 11#define EA 12#define EO 13#define plus 14#define times 15#d
7、efine becomes 16#define op_and 17#define op_or 18#define op_not 19#define rop 20#define lparent 21#define rparent 22#define ident 23#define intconst 24函数说明 1 读取函数 readline( )、readch( )词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件” in.txt ”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行 readch( )从输入缓冲区获得的;若缓冲
8、区已被读空,则再执行readline( )从 in.txt 中读取下一行至输入缓冲区。2 扫描函数 scan( ) 扫描函数 scan( )的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。3 变量处理 find( )变量处理中首先把以字母开头的字母数字串存到 spelling 数组中,然后进行识别。识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让它与变量名表中的变量进行匹配(变量匹配函数find( ),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变
9、量(值填为该变量在变量名表中的位置),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。4 数字识别 number( ) 数字识别将识别出的数字填入二元式结果缓存数组。5 显示函数 disp( )显示函数的功能在屏幕上输出词法分析的结果(即二元式序列程序),同时给出二元式个数及源程序行数统计。2.2 语法分析设计语法分析器的核心是三张 SLR 分析表以及针对这三张 SLR 分析表进行语义加工的语义动作。编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过 SLR 分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。在
10、处理 if 和 while 语句时,需要进行真值或假值的拉链和返填工作,以便转移目标的正确填入。1. 控制语句的 SLR 分析表1 设计如下:将扩展文法G0)S S1)S if e S else S2)S while e S3)S L 4)S a;5)L S6)L SLstatic int action2011=/* 0 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 1, -1,/* 1 */ -1, -1, -1, -1, -1, -1, -1, -1,ACC, -1, -1,/* 2 */ -1, -1, -1, -1, -1, -1, -1, 6, -1, -1,
11、 -1,/* 3 */ -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1,/* 4 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 9, 8,/* 5 */ -1, -1, -1, -1, -1, -1, 10, -1, -1, -1, -1,/* 6 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 11, -1,/* 7 */ 2, -1, 3, 4, -1, 5, -1, -1, -1, 12, -1,/* 8 */ -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1,/* 9
12、*/ 2, -1, 3, 4,105, 5, -1, -1, -1, 9, 14,/* 10*/ -1,104, -1, -1,104, -1, -1, -1,104, -1, -1,/* 11*/ -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,/* 12*/ -1,102, -1, -1,102, -1, -1, -1,102, -1, -1,/* 13*/ -1,103, -1, -1,103, -1, -1, -1,103, -1, -1,/* 14*/ -1, -1, -1, -1,106, -1, -1, -1, -1, -1, -1,/* 1
13、5*/ 2, -1, 3, 4, -1, 5, -1, -1, -1, 16, -1,/* 16*/ -1,101, -1, -1,101, -1, -1, -1,101, -1, -1;其中,前 9 列为 action 值,后 2 列为 goto 值;016 表示 17 个移进状态( 即 Si);-1表示出错;ACC 表示分析成功;而 100106 对应 7 个归约产生式:100 S S101 S if e S else S102 S while e S103 S L 104 S a;105 L S106 L SL2. 算术表达式的 LR 分析表 2 设计如下:0)S E1)E E+E2)E
14、 E*E3)E (E)4)E i static int action1107=/* 0 */ 3, -1, -1, 2, -1, -1, 1,/* 1 */ -1, 4, 5, -1, -1,ACC, -1,/* 2 */ 3, -1, -1, 2, -1, -1, 6,/* 3 */ -1,104,104, -1,104,104, -1,/* 4 */ 3, -1, -1, 2, -1, -1, 7,/* 5 */ 3, -1, -1, 2, -1, -1, 8,/* 6 */ -1, 4, 5, -1, 9, -1, -1,/* 7 */ -1,101, 5, -1,101,101, -1,/* 8 */ -1,102,102, -1,102,102, -1,/* 9 */ -1,103,103, -1,10
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1