当前位置:文档之家› 简单编译器的设计与实现1

简单编译器的设计与实现1

简单编译器的设计与实现1
一、课程设计的目的
二、课程设计的任务
(1)设计符号表
确定符号表的组织,通常包括名称列和信息列,其中名称列用作关键字。

考虑能够存
储关于名称的信息,并有效地完成以下操作:
a.查找:根据给定的名字,在符号表中查找其信息。

如果该名字在符号表中不存在,
则将其加入到符号表中,否则返回指向该名字的指针;
b、删除:从符号表中删除具有给定名称的表项。

(2)词法分析器的设计
设计各单词的状态转换图,并为不同的单词设计种别码。

将词法分析器设计成供语法
分析器调用的子程序。

功能包括:
a、具有预处理功能。

首先过滤掉未翻译的注释和其他符号,只保留要翻译的符号字
符串,即需要设计一个由认罪分析调用的预处理子程序;b、能够拼写语言中的每个单词;
c、将拼写的标识符填入符号表;
d、返回(类型代码、属性值)。

(3)解析器
要求用预测分析法、递归下降分析法、算符优先分析法、slr分析法(几种方法任选),实现对表达式、各种说明语句、控制语句进行语法分析。

(4)目标代码生成器
当指定数量的寄存器可以完成时,将中间代码程序段翻译成汇编语言目标代码(汇编
指令应包括加法、减法、乘法和除法)。

当需要的指令数量最少时,请尝试
1
使用寄存器尽可能少地访问内存,以实现较高的操作效率。

三、课程设计要求
示例语言是C语言,它实现了一个简单的编译器。

基本语句必须执行,其余的可以根
据实际情况选择。

解释并理解主要代码。

每个功能和过程应有简要说明,包括功能说明、
进入和退出参数说明。

四、简单编译器的实现流程图表格管理词法分析器源程序出错处理语法分析器单词符
号语法单位语义分析与中间代码产生器中间代码优化器中间代码目标代码生成器目标代码
五、实施环境
windowsxp操作系统、win-tc运行环境

六、课程设计的详细过程
(1)词法分析器的设计思想:
要求:1.对单词的构词规则有明确的定义;
2.分析程序能正确识别源程序中的单词和符号;
3.识别出的单词以符号的形式保存在
符号表中;
4.词法分析中源程序的输入以.c格式,分析后的符号表保存在.txt文件中。

5.对于
源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整
个源程序的词法分析;
6.输入:由符合指定词类结构的各种单词组成的源程序。

实施方法:
根据加入语义过程的状态转换图直接编写词法分析程序。

根据每一组状态转换关系
(标识符)组织程序结构,并将所有公共处理过程分别实现即可。

在扫描源程序字符串时,一旦识别出关键字、运算符、标识符、无符号常数中之一,即以二元式形式(类别编码,值)输出单词。

每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词。


现过程及主要代码:定义主要函数:
1.charscanin[100],scanout[100];//用于接收输入和输出文件名file*fin,
*fout//指向输入/输出文件的指针
2.//下面定义保留,为简化程序,使用字符指针数组保存所有保留字。

//如果想增加
保留字,可继续添加,并修改保留字数目#definekeywordsum8char
*关键字[keywordsum]={\rite\
3.//下面定义纯单分界符,如需要可添加charsingleword[50]=\
4.//下面定义双分界符的首字符chardoubleword[10]=\
5.scanf(\
Printf(\请输入词法分析的输出文件名(包括路径):\scanf(\
6.if((fin=fopen(scanin,\判断输入文件名是否正确{printf(\打开词法分析输入文
件出错!\\n\return(1);//输入文件出错返回错误代码1}
如果((fout=fopen(scanout),\判断输出文件名是否正确{printf(\创建词法分
析输出文件时出错!\\n\return(2);//输出文件中出错返回错误代码2}
3
7.ch=getc(fin);//读取文件8 Isalpha(CH)//字母判断函数isalnum(CH))//数字判断函数中的一个字符
strcmp(token,keyword[n])//串比较fprintf(fout,\//输出标识符符号到fout指定的文件strchr(singleword,ch)//声明:char*strchr(constchar*string,intc);实现函数代码:初始化函数:init()
{char*键[]={\
\char*limit[]={\\file*fp;inti;charc;fp=fopen(\for(i=1;i<=12;i++)
fprintf(fp,\fclose(fp);/*初始化关键字*/FP=fopen(\for(I=1;I<=17;
I++)
fprintf(fp,\fprintf(fp,\
fclose(fp);/*初始化操作,仪表表*/FP=fopen(\
fclose(fp);/*初始化标识符表*/fp=fopen(\
fclose(fp);/*初始化常数表*/FP=fopen(\
fclose(fp);/*初始化输出文件*/}
根据不同的命令执行表格查找或表格创建功能:
{intnumber=0;file*fp;charc;chartemp[30];inti=0;switch(type){case1:fp=fopen(\ca se2:fp=fopen(\
案例3:fp=fopen(\case4:fp=fopen(\}
c=fgetc(fp);while(c!=eof){while(c!='\\n')
{temp[i++]=c;c=fgetc(fp);}温度[i]='\\0';i=0;
number++;

if(strcmp(temp,buf)==0){fclose(fp);
返回(编号);/*如果找到,请在相应的表中返回序列号*/}else
c=fgetc(fp);}
返回(0);/*找不到。

当只需要查找表时,返回0,否则需要创建表*/}
switch(type)
{case1:fp=fopen(\case2:fp=fopen)(\
case3:fp=fopen(\case4:fp=fopen(\}
fprintf(fp),\fclose(fp);
return(number+1);/*造表时,将字符串添加到表尾并返回序号值*/}
字符串处理功能:
voidcs_manage(char*buffer){file*fp;
字符*指针;
intresult;
结果=查找(缓冲区,3,2);/*首先检查常量表。

如果找不到,则创建常量表并返回序列号值*/FP=fopen(\
fprintf(fp,\fclose(fp);/*写入输出文件
*/}voidch_manage(char*buffer){file*fp;intresult;
结果=查找(缓冲区,1,1);/*首先检查关键字表*/FP=fopen(\
if(result!=0)
Fprintf(FP,\n如果找到,则写入输出文件*/else
{result=find(buffer,2,2);/*若找不到,则非关键字,查标识符表,还找不到则造入标识符表*/
Fprintf(FP,\}/*写入输出文件*/Fclose(FP);}
5。

相关主题