版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理C语言词法分析器一、实验题目编制并调试C词法分析程序。a.txt源代码:?main()intsum=0,it=1;/*Variabledeclaration*/if(sum=1)it+;elseit=it+2;?设计其词法分析程序,能识别出所有的关键字、标识符、常数、运算符(包括复合运算符,如+)、界符;能过滤掉源程序中的注释、空格、制表符、换行符;并且能够对一些词法规则的错误进行必要的处理,如:标识符只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。实验要求:要给出所分析语言的词法说明,相应的状态转换图,单词的种别编码方案,词法分析程序的主要算法思想等。二、实验目的1、理
2、解词法分析在编译程序中的作用;2、掌握词法分析程序的实现方法和技术;3、加深对有穷自动机模型的理解。三、主要函数voidload()voidchar_search(char*word)voidmain()voidintb_search(char*word)voidscan()voidc_search(char*word)voidinta_search(char*word)voidcc_search(char*word)四、设计1.主函数voidmain()2.初始化函数voidload()通过文件指针建立相关文件函数结束3.保留字及标识符判断函数voidchar_search(char*wor
3、d)写入输出文件4 .整数类型判断函数voidinta_search(char*word)接收数据5 .浮点类型判断函数voidintb_search(char*word)6 .字符串常量判断函数voidcc_search(char*word)7 .字符常量判断函数voidc_search(char*word)同4、5函数图8 .主扫描函数voidscan()函数开始五、关键代码#include #include #include char*key0口=”,auto,break,case,char,const,continue,default,do,double,else,enum,exter
4、n,float,for,goto,if,int,long,register,return,short,signed,sizeof,static,struct,switch,typedef,_Complex,_Imaginary,union,unsigned,void,volatile,while;/*保留字表*/char*key1=,(,),;,;/*分隔符表*/*key2=nchar+-*/%=!=!&|人&=.-+-,.,*=,/=;/*运算符表*/intxx035,xx110,xx231;inttemp_key3=0,temp_c40=0,temp_c41=0,temp_c42=0,te
5、mp_c43=0;/*初始化函数*/voidload()intmm;for(mm=0;mm=34;mm+)xx0mm=0;for(mm=0;mm=9;mm+)xx1mm=0;for(mm=0;mm=30;mm+)xx2mm=0;FILE*floading;if(floading=fopen(,w)=NULL)printf(Error!Cantcreatefile:);return;fclose(floading);/*建立保留字表文件:*/if(floading=fopen(,w)=NULL)printf(Error!Cantcreatefile:);return;/*建立分隔符表文件:*/i
6、f(floading=fopen(,w)=NULL)printf(Error!Cantcreatefile:);return;fclose(floading);/*建立运算符表文件:*/if(floading=fopen(,w)=NULL)printf(Error!Cantcreatefile:);return;fclose(floading);/*建立标识符表文件:*/if(floading=fopen(,w)=NULL)printf(Error!Cantcreatefile:);return;fclose(floading);/*建立整数类型常量表文件:*/if(floading=fope
7、n(,w)=NULL)printf(Error!Cantcreatefile:);return;fclose(floading);/*建立浮点类型常量表文件:*/if(floading=fopen(,w)=NULL)printf(Error!Cantcreatefile:);return;fclose(floading);/*建立字符类型常量表文件:*/if(floading=fopen(,w)=NULL)printf(Error!Cantcreatefile:);return;fclose(floading);/*建立字符串类型常量表文件:*/if(floading=fopen(,w)=NU
8、LL)printf(Error!Cantcreatefile:);return;fclose(floading);/*建立注释文件:*/if(floading=fopen(,w)=NULL)printf(Error!Cantcreatefile:);return;fclose(floading);/*建立内部码文件:*/if(floading=fopen(temp_key1,w)=NULL)printf(Error!Cantcreatefile:temp_key1);return;fclose(floading);/*建立保留字临时表文件:temp_key1*/if(floading=fope
9、n(temp_key3,w)=NULL)printf(Error!Cantcreatefile:temp_key3);return;fclose(floading);/*建立标识符临时文件:temp_key3*/if(floading=fopen(temp_c40,w)=NULL)printf(Error!Cantcreatefile:temp_c40);return;fclose(floading);/*建立整数类型常量临时文件:temp_c40*/if(floading=fopen(temp_c41,w)=NULL)printf(Error!Cantcreatefile:temp_c41)
10、;return;fclose(floading);/*建立浮点类型常量临时文件:temp_c41*/if(floading=fopen(temp_c42,w)=NULL)printf(Error!Cantcreatefile:temp_c42);return;fclose(floading);/*建立字符类型常量临时文件:temp_c42*/if(floading=fopen(temp_c43,w)=NULL)printf(Error!Cantcreatefile:temp_c43);return;fclose(floading);/*建立字符串类型常量临时文件:temp_c43*/*保留字及
11、标识符判断函数*/voidchar_search(char*word)intm,line=0,csi=0;intvalue=0;intvalue2=0;charc,cs100;FILE*foutput,*finput;for(m=1;m)chin=fgetc(fin);/*chin=fgetc(fin);*/*对空格符、水平制表符进行处理*/elseif(chin=)|(chin=t);/*对回车符进行处理*/elseif(chin=n);/*对单引号内的字符常量进行处理*/elseif(chin=target0)if(xx19=0)fout=fopen(,a);fprintf(fout,1t
12、9tt%cn,target0);fclose(fout);xx19=1;temp0=chin;chin=fgetc(fin);temp1=chin;chin=fgetc(fin);if (chin!=target0)temp2=chin;chin=fgetc(fin);temp3=chin;temp4=0;elsetemp2=chin;temp3=0;c_search(temp);/*对双引号内的字符串常量进行处理*/elseif(chin=)inti=0;tempi+=;chin=fgetc(fin);while(chin!=)tempi+=chin;chin=fgetc(fin);temp
13、i=;tempi+1=0;cc_search(temp);/*对保留字、标识符进行处理*/elseif(chin=A)&(chin=a)&(chin=A)&(chin=a)&(chin=0)&(chin=0)&(chin=0)&(chin=9)|(chin=.)(if(chin=.)dotcount+;if(dotcount=2)break;tempi+=chin;chin=fgetc(fin);if(dotcount=1)intb_search(temp);elseinta_search(temp);if(chin!=EOF)fseek(fin,-1L,SEEK_CUR);/*对注释进行处理
14、*/elseif(chin=/)chin=fgetc(fin);if(chin=)fout=fopen(,a);fprintf(fout,2t30tt/=n);fclose(fout);elseif(chin!=*)fout=fopen(,a);fprintf(fout,2t4tt/n);fclose(fout);fseek(fin,-1L,SEEK_CUR);elseif(chin=*)count=0;chin=fgetc(fin);fout=fopen(,a);fprintf(fout,/*);while(count!=2)count=0;while(chin!=*)fprintf(fou
15、t,%c,chin);chin=fgetc(fin);count+;fprintf(fout,%c,chin);chin=fgetc(fin);if(chin=/)count+;fprintf(fout,%cn,chin);elsefprintf(fout,%c,chin);chin=fgetc(fin);/*对运算符、分隔符进行处理*/elseinttime=0;intfirstblood=0;temp0=chin;chin=fgetc(fin);if(chin!=EOF)temp1=chin;temp2=0;for(time=1;time=30;time+)if(strcmp(temp,k
16、ey2time)=0)firstblood=1;if(xx2time=0)fout=fopen(,a);fprintf(fout,2t%dtt%sn,time,temp);fclose(fout);xx2time=1;fout=fopen(,a);fprintf(fout,2t%dtt%sn,time,temp);fclose(fout);break;if(firstblood!=1)fseek(fin,-1L,SEEK_CUR);for(time=1;time=9;time+)if(strcmp(temp,key1time)=0)if(xx1time=0)fout=fopen(,a);fpr
17、intf(fout,1t%dtt%sn,time,temp);fclose(fout);xx1time=1;fout=fopen(,a);fprintf(fout,1t%dtt%sn,time,temp);fclose(fout);break;for(time=1;time查看保留字表文件*n);printf(*1-查看分隔符表文件*n);printf(*2-查看运算符表文件*n);printf(*3-查看标识符表文件*n);printf(*4-查看整数类型常量表*n);printf(*5-查看浮点类型常量表*n);printf(*6-查看字符类型常量表*n);printf(*7-查看字符串类
18、型常量表*n);printf(*8-查看注释文件*n);printf(*9-查看内部码文件*n);printf(*n);printf(*Q-退出*n);printf(”*n);printf(n);load();scan();printf(n);printf(分析完成!n);getchar();printf(n);printf(请输入命令:);command=getchar();while(command!=Q)&(command!=q)switch(command)case0:printf(*printf(n);fread=fopen(,r);charin=fgetc(fread);while
19、(charin!=EOF)putchar(charin);charin=fgetc(fread);printf(n);printf(”*n);printf(n);printf(请输入命令:);break;case 1:printf(”*n);printf(n);fread=fopen(,r);charin=fgetc(fread);while(charin!=EOF)putchar(charin);charin=fgetc(fread);printf(n);printf(”*n);case 2:printf(n);printf(请输入命令:);break;printf(”*n);printf(
20、n);fread=fopen(,r);charin=fgetc(fread);while(charin!=EOF)putchar(charin);charin=fgetc(fread);printf(n);printf(”*n);printf(n);printf(请输入命令:);break;case 3:printf(”*n);printf(n);fread=fopen(,r);charin=fgetc(fread);while(charin!=EOF)putchar(charin);charin=fgetc(fread);printf(n);printf(n);printf(请输入命令:);
21、break;case 4:printf(”*n);printf(n);fread=fopen(,r);charin=fgetc(fread);while(charin!=EOF)putchar(charin);charin=fgetc(fread);printf(n);printf(”*n);printf(n);printf(请输入命令:);break;case 5:printf(”*n);printf(n);fread=fopen(,r);charin=fgetc(fread);while(charin!=EOF)putchar(charin);charin=fgetc(fread);printf(n);printf(”*n);printf(n);printf(请输入命令:);break;case 6:printf(”*n);printf(n);fread=fopen(,r);charin=fgetc(fread);while(charin!=EOF)putchar(charin);cha
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 博物馆文创 IP 运营师考试试卷及答案
- 患者满意度导向的康复服务优化
- DB31∕T 1693-2026 水产养殖尾水监测技术规范
- T∕AOPA 0010-2026 轻小型民用航空器驾驶员头盔安全技术规范
- 河南省许昌市2026年高三适应性练习(一)化学试题试卷含解析
- 2026届山西省太原市重点中学高三第二次质量考评化学试题试卷含解析
- 检验数据技术在临床诊疗中的未来趋势
- 2025~2026学年浙江省湖州第五中学上学期九年级英语模考试卷
- 2026监理证考试题及答案
- 2026护士考试昨天考试题及答案
- 2025年贵州省委党校在职研究生招生考试(政治经济学原理)历年参考题库含答案详解(5卷)
- 心理健康接纳自己课件
- 癫痫共患偏头痛诊断治疗
- 江西省农发种业有限公司招聘考试真题2024
- 储备土地巡查管理办法
- JJG 688-2025汽车排放气体测试仪检定规程
- 【15万吨日供水量水厂设计中反应沉淀池设计计算过程案例2300字】
- 《铁路线路养护与维修》课件 2.1.5垫板修正作业
- T/CNCA 014-2022改性镁渣基胶凝材料
- 2025年安徽铜陵港航投资建设有限责任公司招聘笔试参考题库附带答案详解
- 1完整版本.5kw机器人专用谐波减速器设计
评论
0/150
提交评论