编译原理大作业设计..doc
《编译原理大作业设计..doc》由会员分享,可在线阅读,更多相关《编译原理大作业设计..doc(19页珍藏版)》请在冰豆网上搜索。
塔里木大学课程设计
2017届课程设计
C语言编译器的设计与实现
学生姓名:
库尔班江.阿瓦克日
学号:
5011212524
所属学院:
信息工程学院
专业:
计算机科学与技术
班级:
计算机17-1班
塔里木大学教务处制
不要删除行尾的分节符,此行不会被打印
编译原理大作业
目录
第1章编译器概述 2
1.1编译器概述 2
第2章编译器设计 4
2.1词法分析设计 4
2.1语法分析设计 6
2.1中间代码生成 9
2.1语法翻译实现方法 11
第3章数据结构说明 12
3.1数据结构说明 12
第4章编译程序运行测试 15
4.1编译程序运行测试 15
参考文献 18
第1章编译器概述黄金分割的哈工大回归热大【】个阿訇妇孺诶航天拖后腿航天皇太后
1.1编译器概述
编译器的任务是:
输入*.asm源程序文件,输出*.obj目标代码文件和*.lst列表文件——对输入的源程序进行扫描,找出所有词法和语法的错误,然后生成有待重定位的目标代码(中间文件)和提供查看信息的列表文件。
中间文件后缀名为obj,是连接器的输入文件。
一个编译器的整个工作流程是划分成一个一个阶段进行的,每个阶段都将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密联结在一起的。
这几个阶段是:
词法分析、语法分析、语义分析、中间代码生成。
另外两个重要的工作:
符号表格的管理和出错处理贯穿以上的所有阶段。
编译过程中源程序的各种信息被保留在种种不同的表格里。
编译时自始至终涉及到表格的构造、查找和更新。
如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些地方编译器还能自动校正错误,这些工作称之为出错处理。
词法分析
自左至右扫描源程序的字符串,并识别出一个个的单词(也称单词符号)。
这里所谓的单词是指逻辑上紧密相连的按词的组成规则结合起来的一组字符,它们具有一定的意义。
把每个单词的ASCII码序列替换成所谓的机内表示——Token形式。
这时还需要检查词法错误。
词法分析阶段不依靠语法关系。
语法分析
扫描对象可能是源程序的ASCII码序列,也可能是词法分析后的Token序列。
前者情形,词法分析程序作为语法分析程序的子程序。
语法分析的主要任务是检查源程序的形式语法错误。
每当发现错误时将输出有关信息。
很多编译程序在进行语法分析时同时完成其他工作,但要注意,如果语法有错误,那么其他工作也就白做。
语义分析
扫描的对象通常是语法分析后的结果。
这时候,源程序的Token序列已经变换成没有错误的符合语法的Token生成树。
对于编译器来说,它的任务是收集符号信息,登记在符号表格里,对伪指令的语义进行解释,完成相应的动作。
伪指令的功能是改变编译器的状态并将一些必要的信息(如段定义,变量声明)加入到目标文件中去。
另外,表达式的求值,段的选择,地址计数器的计数,指令长度的计算等都在这个阶段中完成。
语义分析阶段同样进行着对错误的处理。
目标代码生成
这时候的Token流在形式上已经比较一致,符号信息都已经登记在各种表格里。
这个阶段的任务是根据助记符的各种寻址方式决定它的目标代码。
这一部分的工作与目标机的指令系统紧密相关。
目标代码生成之后,还要根据obj文件的格式把目标代码写入文件。
最后还要产生列表文件,为用户提供源码与目标码的对照。
第2章编译器设计
2.1词法分析设计
由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。
词法分析器的功能是输入源程序,输出单词符号。
我们规定输出的单词符号格式为如下的二元式:
(单词种别,单词自身的值)
#defineACC-2
#definesyl_if0
#definesyl_else1
#definesyl_while2
#definesyl_begin3
#definesyl_end4
#definea5
#definesemicolon6
#definee7
#definejinghao8
#defines9
#defineL10
#definetempsy11
#defineEA12
#defineEO13
#defineplus14
#definetimes15
#definebecomes16
#defineop_and17
#defineop_or18
#defineop_not19
#definerop20
#definelparent21
#definerparent22
#defineident23
#defineintconst24
函数说明
1.读取函数readline()、readch()
词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件”in.txt”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行readch()从输入缓冲区获得的;若缓冲区已被读空,则再执行readline()从in.txt中读取下一行至输入缓冲区。
2.扫描函数scan()
扫描函数scan()的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。
3.变量处理find()
变量处理中首先把以字母开头的字母数字串存到spelling[]数组中,然后进行识别。
识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让它与变量名表中的变量进行匹配(变量匹配函数find()),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量(值填为该变量在变量名表中的位置),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。
4.数字识别number()
数字识别将识别出的数字填入二元式结果缓存数组。
5.显示函数disp()
显示函数的功能在屏幕上输出词法分析的结果(即二元式序列程序),同时给出二元式个数及源程序行数统计。
2.2语法分析设计
语法分析器的核心是三张SLR分析表以及针对这三张SLR分析表进行语义加工的语义动作。
编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过SLR分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。
在处理if和while语句时,需要进行真值或假值的拉链和返填工作,以便转移目标的正确填入。
1.控制语句的SLR分析表1设计如下:
将扩展文法G’
0) S’àS
1) SàifeSelseS
2) SàwhileeS
3) Sà{L}
4) Sàa;
5) LàS
6) LàSL
staticintaction[20][11]=
/*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,-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*/ {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},
/*15*/ {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值;0~16表示17个移进状态(即Si);-1表示出错;ACC表示分析成功;而100~106对应7个归约产生式:
100S’àS
101SàifeSelseS
102SàwhileeS
103Sà{L}
104Sàa;
105LàS
106LàSL
2.算术表达式的LR分析表2设计如下:
0) S’àE
1) EàE+E
2) EàE*E
3) Eà(E)
4) Eài
staticintaction1[10][7]=
/*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