编译技术课程设计报告.docx
- 文档编号:4693658
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:47
- 大小:109.85KB
编译技术课程设计报告.docx
《编译技术课程设计报告.docx》由会员分享,可在线阅读,更多相关《编译技术课程设计报告.docx(47页珍藏版)》请在冰豆网上搜索。
编译技术课程设计报告
编译技术课程设计
班级计算机0802
学号3080602051
姓名龚科
指导老师朱玉全
二零一一年七月
一、目的
<<编译技术>>是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。
从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。
二、任务及要求
基本要求:
1.词法分析器产生下述小语言的单词序列
这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表:
单词符号
种别编码
助记符
内码值
DIM
IF
DO
STOP
END
标识符
常数(整)
=
+
*
**
,
(
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$DIM
$IF
$DO
$STOP
$END
$ID
$INT
$ASSIGN
$PLUS
$STAR
$POWER
$COMMA
$LPAR
$RPAR
-
-
-
-
-
-
内部字符串
标准二进形式
-
-
-
-
-
-
对于这个小语言,有几点重要的限制:
首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。
所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。
例如,下面的写法是绝对禁止的:
IF(5)=x
其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。
也就是说,对于关键字不专设对应的转换图。
但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。
当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。
再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。
例如,一个条件语句应写为
IFi>0i=1;
而绝对不要写成
IFi>0i=1;
因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。
这个小语言的单词符号的状态转换图,如下图:
2.语法分析器能识别由加+减-乘*除/乘方^括号()操作数所组成的算术表达式,其文法如下:
E→E+T|E-T|T
T→T*F|T/F|F
F→P^F|P
p→(E)|i
使用的算法可以是:
预测分析法;递归下降分析法;算符优先分析法;LR分析法等。
3.中间代码生成器产生上述算术表达式的中间代码(四元式序列)
较高要求:
1.扩充上述小语言的单词;
2.增加语法分析器的功能,能识别条件语句和循环语句等;
3.增加中间代码生成器的功能,能产生条件语句和循环语句等的中间代码(四元式序列)
4.增加报错功能;
5.将中间代码翻译成汇编语言。
三、实现过程说明
数据定义清单:
#defineACC-2
/************种别编码************/
#definesy_if0
#definesy_then1
#definesy_else2
#definesy_while3
#definesy_begin4
#definesy_do5
#definesy_end6
#definea7
#definesemicolon8
#definee9
#definejinghao10
#defineS11
#defineL12
#definetempsy15
#defineEA18/*Eand*/
#defineE019/*Eor*/
#defineplus34
#definetimes36
#definebecomes38
#defineop_and39
#defineop_or40
#defineop_not41
#definerop42
#definelparent48
#definerparent49
#defineident56
#defineintconst57
#defineminus58
#definediv59
#definechengfang60
/*********************************/
charch='\0';/*从字符缓冲区读取当前字符*/
intcount=0;/*词法分析结果缓冲区计数器*/
staticcharspelling[10]={""};/*存放识别的字*/
staticcharline[81]={""};/*一行字符缓冲区,最多80个字符*/
char*pline;/*字符缓冲区指针*/
staticcharntab1[100][10];/*变量名表,共100项,每项长度10*/
structntab
{
inttc;/*真值*/
intfc;/*假值*/
}ntab2[200];/*在布尔表达式E中保存有关布尔变量的真、假值*/
intlabel=0;/*指向ntab2的指针*/
structrwords{/*存放临时变量的表的定义*/
charsp[10];
intsy;
};
/*(保留字表)匹配表的结构,用来与输入缓冲区中的单词进行匹配*/
/*匹配表初始化,大小为10*/
structrwordsreswords[10]={{"if",sy_if},
{"do",sy_do},
{"else",sy_else},
{"while",sy_while},
{"then",sy_then},
{"begin",sy_begin},
{"end",sy_end},
{"and",op_and},
{"or",op_or},
{"not",op_not}};
structaa{
intsy1;/*存放名字*/
intpos;/*存放名字所对应的地址*/
}buf[1000],/*词法分析结果缓冲区*/
n,/*读取二元式的当前字符*/
n1,/*当前表达式中的字符*/
E,/*非终结符*/
sstack[100],/*算术或布尔表达式加工处理使用的符号栈*/
ibuf[100],/*算术或布尔表达式使用的缓冲区*/
stack[1000];/*语法分析加工处理使用的符号栈*/
structaaoth;/*四元式中空白位置*/
structfourexp{
charop[10];
structaaarg1;
structaaarg2;
intresult;
}fexp[200];/*四元式的结构定义*/
intssp=0;/*指向sstack栈指针*/
structaa*pbuf=buf;/*指向词法分析缓冲区的指针*/
intnlength=0;/*词法分析中记录单词的长度*/
intlnum=0;/*源程序行数记数,源程序长度*/
inttt1=0;/*变量名表指针*/
FILE*cfile;/*源程序文件,~为结束符*/
intnewt=0;/*临时变量计数器*/
intnxq=100;/*nxq指向下一个形成的四元式的地址*/
/*每次执行gen()时,地址自动增1*/
intlr;/*扫描LR分析表1过程中保存的当前状态值*/
intlr1;/*扫描LR分析表2或表3所保存的当前状态值*/
intsp=0;/*查找LR分析表时状态栈的栈顶指针*/
intstack1[100];/*状态栈1的定义*/
intsp1=0;/*状态栈1的栈顶指针*/
intnum=0;/*算术或布尔表达式缓冲区指针*/
structll{
intnxq1;/*记录下一条四元式的地址*/
inttc1;/*真值链*/
intfc1;/*假值链*/
}labelmark[10];/*记录语句嵌套层次的数组,*/
/*即记录嵌套中每层的布尔表达式E的首地址*/
intlabeltemp[10];/*记录语句嵌套层次的数组,*/
/*即记录每层else之前的四元式地址*/
intpointmark=-1,/*labelmark数组指针*/
pointtemp=-1;/*labeltemp数组指针*/
intsign=0;/*sign=1,为赋值语句;sign=2,为布尔表达式。
*/
/**************程序语句LR分析表*********************/
staticintaction[19][13]=
/*0*/{{2,-1,-1,3,4,-1,-1,5,-1,-1,-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,-1,-1,6,-1,-1,-1},
/*3*/{-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1},
/*4*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,8},
/*5*/{-1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1,},
/*6*/{-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
/*7*/{-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1},
/*8*/{-1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1},
/*9*/{-1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1},
/*10*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1},
/*11*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,15,-1},
/*12*/{-1,-1,103,-1,-1,-1,103,-1,103,-1,103,-1,-1},
/*13*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,16},
/*14*/{-1,-1,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
/*15*/{-1,-1,102,-1,-1,-1,102,-1,102,-1,102,-1,-1},
/*16*/{-1,-1,-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1},
/*17*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,18,-1},
/*18*/{-1,-1,101,-1,-1,-1,101,-1,101,-1,101,-1,-1}};
/**************算术表示式的LR分析表************************/
staticintaction1[16][10]=
/*0*/{{12,-1,-1,-1,-1,-1,14,-1,-1,1},
/*1*/{-1,2,3,4,5,6,-1,-1,ACC,-1},
/*2*/{12,-1,-1,-1,-1,-1,13,-1,-1,7},
/*3*/{12,-1,-1,-1,-1,-1,13,-1,-1,8},
/*4*/{12,-1,-1,-1,-1,-1,13,-1,-1,9},
/*5*/{12,-1,-1,-1,-1,-1,13,-1,-1,10},
/*6*/{12,-1,-1,-1,-1,-1,13,-1,-1,11},
/*7*/{-1,101,101,4,5,6,-1,101,101,-1},
/*8*/{-1,102,102,4,5,6,-1,102,102,-1},
/*9*/{-1,103,103,103,103,6,-1,103,103,-1},
/*10*/{-1,104,104,104,104,6,-1,104,104,-1},
/*11*/{-1,105,105,105,105,105,-1,105,105,-1},
/*12*/{-1,107,107,107,107,107,-1,107,107,-1},
/*13*/{12,-1,-1,-1,-1,-1,13,-1,-1,-14},
/*14*/{-1,2,3,4,5,6,-1,15,-1,-1},
/*15*/{-1,106,106,106,106,106,-1,106,106,-1}};
/*************布尔表示式的LR分析表********************/
staticintaction2[16][11]=
/*0*/{{1,-1,4,-1,5,-1,-1,-1,13,7,8},
/*1*/{-1,2,-1,101,-1,101,101,101,-1,-1,-1},
/*2*/{3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
/*3*/{-1,-1,-1,102,-1,102,102,102,-1,-1,-1},
/*4*/{1,-1,4,-1,5,-1,-1,-1,11,7,8},
/*5*/{1,-1,4,-1,5,-1,-1,-1,6,7,8},
/*6*/{-1,-1,-1,104,-1,9,10,104,-1,-1,-1},
/*7*/{1,-1,4,-1,5,-1,-1,-1,14,7,8},
/*8*/{1,-1,4,-1,5,-1,-1,-1,15,7,8},
/*9*/{105,-1,105,-1,105,-1,-1,-1,-1,-1,-1},
/*10*/{107,-1,107,-1,107,-1,-1,-1,-1,-1,-1},
/*11*/{-1,-1,-1,12,-1,9,10,-1,-1,-1,-1},
/*12*/{-1,-1,-1,103,-1,103,103,103,-1,-1,-1},
/*13*/{-1,-1,-1,-1,-1,9,10,ACC,-1,-1,-1},
/*14*/{-1,-1,-1,106,-1,9,10,106,-1,-1,-1},
/*15*/{-1,-1,-1,108,-1,9,10,108,-1,-1,-1}};
函数清单:
voidmain();/*主程序*/
voidreadline();/*从文件读一行到缓冲区*/
voidreadch();/*从缓冲区读取一个字符*/
intfind(charspel[]);/*标识符和关键字的识别*/
voididentifier();/*字符串的识别*/
voidnumber();/*数字的识别*/
voidscan();/*扫描主函数*/
voidreadnu();/*读取二元式的一个字符*/
intnewtemp();/*中间变量的生成*/
intgen(charop1[],structaaarg11,structaaarg22,intresult1);/*生成四元式*/
intmerg(intp1,intp2);/*布尔表示式的匹配*/
voidlrparse1(intnum);/*赋值语句的分析*/
intlrparse2(intnum);/*布尔表达式的分析*/
inttest(intvalue);/*测试字符是否为表达式中的值(不包括";")*/
intlrparse();/*程序语句处理*/
voiddisp1();/*显示词法分析结果*/
voiddisp2();/*四元式分析结果*/
voiddisp3();/*变量名表显示*/
主要函数流程图:
主函数:
四、源程序清单
//ht.cpp:
定义控制台应用程序的入口点。
//
//小型编译程序:
高级语言到四元式的编译
#include"stdio.h"/*如果使用TC的话,需要配置头文件路径*/
#include"string.h"
#defineACC-2
/************************/
#definesy_if0
#definesy_then1
#definesy_else2
#definesy_while3
#definesy_begin4
#definesy_do5
#definesy_end6
#definea7
#definesemicolon8
#definee9
#definejinghao10
#defineS11
#defineL12
#definetempsy15
#defineEA18/*Eand*/
#defineE019/*Eor*/
#defineplus34
#definetimes36
#definebecomes38
#defineop_and39
#defineop_or40
#defineop_not41
#definerop42
#definelparent48
#definerparent49
#defineident56
#defineintconst57
#defineminus58
#definediv59
#definechengfang60
/*********************************/
charch='\0';/*从字符缓冲区读取当前字符*/
intcount=0;/*词法分析结果缓冲区计数器*/
staticcharspelling[10]={""};/*存放识别的字*/
staticcharline[81]={""};/*一行字符缓冲区,最多80个字符*/
char*pline;/*字符缓冲区指针*/
staticcharntab1[100][10];/*变量名表,共100项,每项长度10*/
structntab
{
inttc;/*真值*/
intfc;/*假值*/
}ntab2[200];/*在布尔表达式E中保存有关布尔变量的真、假值*/
intlabel=0;/*指向ntab2的指针*/
structrwords{/*存放临时变量的表的定义*/
charsp[10];
intsy;
};
/*(保留字表)匹配表的结构,用来与输入缓冲区中的单词进行匹配*/
/*匹配表初始化,大小为10*/
structrwordsreswords[10]={{"if",sy_if},
{"do",sy_do},
{"else",sy_else},
{"while",sy_while},
{"then",sy_then},
{"begin",sy_begin},
{"end",sy_end},
{"and",op_and},
{"or",op_or},
{"not",op_not}};
structaa{
intsy1;/*存放名字*/
intpos;/*存放名字所对应的地址*/
}buf[1000],/*词法分析结果缓冲区*/
n,/*读取二元式的当前字符*/
n1,/*当前表达式中的字符*/
E,/*非终结符*/
sstack[100],/*算术或布尔表达式加工处理使用的符号栈*/
ibuf[100],/*算术或布尔表达式使用的缓冲区*/
stack[1000];/*语法分析加工处理使用的符号栈*/
structaaoth;/*四元式中空白位置*/
structfourexp{
charop[10];
structaaarg1;
structaaarg2;
intresult;
}fexp[200];/*四元式的结构定义*/
intssp=0;/*指向sstack栈指针*/
structaa*pbuf=buf;/*指向词法分析缓冲区的指针*/
intnlength=0;/*词法分析中记录单词的长度*/
intlnum=0;/*源程序行数记数,源程序长度*/
inttt1=0;/*变量名表指针*/
FILE*cfile;/*源程序文件,~为结束符*/
/*FILE*mfile;*/
intnewt=0;/*临时变量计数器*/
intnxq=100;/*nxq指向下一个形成的四元式的地址*/
/*每次执行gen()时,地址自动增1*/
intlr;/*扫描LR分析表1过程中保存的当前状态值*/
intlr1;/*扫描LR分析表2或表3所保存的当前状态值*/
intsp=0;/*查找LR分析表时状态栈的栈顶指针*/
intstack1[100];/*状态栈1的定义*/
intsp1=0;/*状态栈1的栈顶指针*/
intnum=0;/*算术或布尔表达式缓冲区指针*/
structll{
intnxq1;/*记录下一条四元式的地址*/
inttc1;/*真值链*/
intfc1;/*假值链*/
}labelmark[10];/*记录语句嵌套层次的数组,*/
/*即记录嵌套中每层的布尔表达式E的首地址*/
intlabeltemp[10];/*记录语句嵌套层次的数组,*/
/*即记录每层else之前的四元式地址*/
intpointmark=-1,/*labelmark数组指针*/
pointtemp=-1;/*labeltemp数组指针*/
intsign=0;/*sign=1,为赋值语句;sign=2,为布尔表达式。
*/
/**************程序语句LR分析表*********************/
staticintaction[19][13]=
/*0*/{{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,-1,-1},
/*1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 技术 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)