编译原理设计c语言的词法分析器.docx
- 文档编号:30499771
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:16
- 大小:79.95KB
编译原理设计c语言的词法分析器.docx
《编译原理设计c语言的词法分析器.docx》由会员分享,可在线阅读,更多相关《编译原理设计c语言的词法分析器.docx(16页珍藏版)》请在冰豆网上搜索。
编译原理设计c语言的词法分析器
编译原理课程设计报告
题目:
学院:
教师:
姓名:
学号:
班级:
评分:
签字:
编译原理课程设计一:
设计c语言的词法分析器
一、实验目的
了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。
二、实验要求
了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。
三、实验设计
.单词分类及表示
C语言的子集分类
(1)标识符:
以字母开头的字母数字串
(2)整数或浮点型。
(3)保留字:
for,while,do,else,if,static,int,sizeof,break,continue
(4)运算符:
+,-,*,/,%,>,<,=,!
=,==,<=,>=,!
&,&&,||;
(5)界符:
"(",")",",",":
",";","{","}"
单词二元组(单词分类号、单词自身值)
单词
分类号
标识符
1
整数或浮点型
2
保留字
3
运算符
4
界符
5
词法分析器的设计
算法设计
概要设计
从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应类别进行查找,输出单元二次组至另一文件夹。
状态图设计
输入输出设计
输入:
通过文件指针从文件中一个一个读取字符
输出:
输出单词二元组至文件。
格式为(种别码,值)
主要函数
voidGetchar(FILE*fp)//读入一个字符
voidGetBC(FILE*fp)//读入一个非空字符
voidcontacat()//连接字符
intletter()//判断是否为字母
intdigit()//判断是否为字母
voidretract(FILE*fp,char*c)//回退
intreserve(char**k)//处理保留字
intsysmbol(identifier*id)//处理标识符,查找符号表并存放位置若没有则添加
intconstant(constnumber*con)//存入常数表,并返回它在常数表中的位置
voidTofile(intnum,intval,identifier*id,constnumber*con,FILE*fw)//写到文件
voidWordAnalyze(char**k,char*c,char**CODE,identifier*id,constnumber*con,FILE*fp,FILE*fw)//词法分析函数
四、结果测试
文件输入
intmain()
{
inta=1,b=3;
if(a>1)
b=b-2;
}
输出结果:
结论:
程序输出结果与期望输出结果相符。
四、收获与感想
通过我本次课程设计掌握了词法分析器设计的基本方法与相关知识。
词法分析的关键是明确各类字符的状态转换过程。
同时辅助标识符、常量结构体与保留字表用于查找返回值。
同时我也对分析问题解决问题有了更深入全面的认识与理解。
面对一个大的问题,需要理清解决的步骤再将其分解成小的模块逐个解决最后再串联在一起,问题就会变得更容易,思路也会更加清晰。
五、实验代码
#include
usingnamespacestd;
#defineLENGTH10
charch;
char*CODE[]={"identifier","constant","keyword"/*保留字*/,"+","-","*","/","<","<=",">",">=","!
=","==","=","(",")",",",":
",";","{","}"};
char*k[]={"for","while","do","else","if","static","int","sizeof","break","continue"};//保留字
chartoken[16];//存放处理后的字符串
//标识符结构体
typedefstruct
{
char*I[256];
intlen;
}identifier;
typedefstruct
{
intcont[300];
intlen;
}constnumber;
//读入一个字符
voidGetchar(FILE*fp)
{
if((ch=getc(fp))==EOF)
exit
(1);
}
//读入一个非空字符
voidGetBC(FILE*fp)
{
while(ch==''||ch=='\n'||ch==9)
Getchar(fp);
}
//连接字符
voidcontacat()
{
char*cht=&(ch);
strcat_s(token,cht);
}
//判断是否为字母
intletter()
{
returnisalpha(ch);
}
intdigit()
{
returnisdigit(ch);
}
//回退
voidretract(FILE*fp,char*c)
{
inta=ftell(fp);
fseek(fp,0,SEEK_SET);
fprintf_s(fp,"%c",ch);
ch='';
fseek(fp,a,SEEK_SET);
}
//处理保留字
intreserve(char**k)
{
inti;
for(i=0;i { if(strcmp(token,k[i])==0) return(i+1); } return0; } //处理标识符,查找符号表并存放位置若没有则添加 intsysmbol(identifier*id) { inti; for(i=0;i if(strcmp(token,id->I[i])==0) returni+1; if(id->len>256) { cout<<"error"; } id->I[id->len]=token; id->len++; returnid->len; } //数字字符串转化为整数 intstr_to_num() { inti=0; intk=token[i]-'0'; for(i=1;token[i]! ='\0';i++) { k=k*10+token[i]-'0'; } returnk; } //存入常数表,并返回它在常数表中的位置 intconstant(constnumber*con) { con->cont[con->len]=str_to_num(); con->len++;returncon->len; } //写到文件 voidTofile(intnum,intval,identifier*id,constnumber*con,FILE*fw) { intnum_=num; fprintf_s(fw,"(%d,",num); if(num>=4) fprintf_s(fw,"%s",CODE[num-1]); if(num<4) { switch(num) { case1: fprintf_s(fw,"%s",id->I[val-1]);break; case2: fprintf_s(fw,"%d",con->cont[val-1]);break; case3: fprintf_s(fw,"%s",k[val-1]);break; } } fprintf_s(fw,")\n"); } voiderror(FILE*fw) { cout<<"(Error,"< fprintf_s(fw,"(Error,%c\n)",ch); } //词法分析函数 voidWordAnalyze(char**k,char*c,char**CODE,identifier*id,constnumber*con,FILE*fp,FILE*fw) { intnum,val; strcpy_s(token,"");//初始化为空字符串 Getchar(fp); GetBC(fp); if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))//分析标识符和保留字 { //若字符为A~Z或0~9,则继续读取 while(letter()||digit()) { contacat(); Getchar(fp); } retract(fp,c); num=reserve(k); if(num! =0) Tofile(3,num,id,con,fw); else { val=sysmbol(id); Tofile(1,val,id,con,fw); } } elseif(digit())//处理常数 { while(digit()) { contacat(); Getchar(fp); } retract(fp,c); val=constant(con); Tofile(2,val,id,con,fw); } else//分析符号 { switch(ch) { case'<': Getchar(fp); if(ch=='=') Tofile(9,0,id,con,fw); else { retract(fp,c); Tofile(8,0,id,con,fw); } break; case'>': Getchar(fp); if(ch=='=') Tofile(11,0,id,con,fw); else { retract(fp,c); Tofile(10,0,id,con,fw); } break; case'=': Getchar(fp); if(ch=='=') Tofile(13,0,id,con,fw); else { retract(fp,c); Tofile(14,0,id,con,fw); } break; case'! ': Getchar(fp); if(ch=='=') Tofile(12,0,id,con,fw); else error(fw); break; case'+': Tofile(4,0,id,con,fw); break; case'-': Tofile(5,0,id,con,fw); break; case'*': Tofile(6,0,id,con,fw); break; case'/': Tofile(7,0,id,con,fw); break; case'(': Tofile(15,0,id,con,fw); break; case')': Tofile(16,0,id,con,fw); break; case',': Tofile(17,0,id,con,fw); break; case': ': Tofile(18,0,id,con,fw); break; case';': Tofile(19,0,id,con,fw); break; case'{': Tofile(20,0,id,con,fw); break; case'}': Tofile(21,0,id,con,fw); break; default: error(fw); } } } intmain() { charc[100]=""; FILE*fp,*fw; errno_terr; err=fopen_s(&fp,c,"r"); if(err! =0) { printf("Thefilewasnotopened\n"); exit(0); } errno_terr1; err1=fopen_s(&fw,"","w"); if(err1! =0) { printf("Thefilewasnotopened\n"); exit(0); } identifier*id=(identifier*)malloc(sizeof(identifier));id->len=0; constnumber*con=(constnumber*)malloc(sizeof(constnumber));con->len=0; WordAnalyze(k,c,CODE,id,con,fp,fw); while (1) { WordAnalyze(k,c,CODE,id,con,fp,fw); if(feof(fp))break; } fclose(fw); fclose(fp); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 设计 语言 词法 分析器