C语言词法分析器实验报告汇总_第1页
C语言词法分析器实验报告汇总_第2页
C语言词法分析器实验报告汇总_第3页
C语言词法分析器实验报告汇总_第4页
C语言词法分析器实验报告汇总_第5页
免费预览已结束,剩余24页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机科学与工程系编译原理课程设计实验报告姓名: * 学号 * 年级专业及班级08计算机科学与技术 成绩实验名称词法分析程序设计与实现完成日期2011/4/12指导教师*实验目的:能够米用C编程谛言实现简单的词法分析程序;设计、编制并调试一个词法分析程序,加深对词法 分析原理的理解实验要求:1.对单词的构词规则有明确的定义;2 .编写的分析程序能够止确识别源程序中的单词符号;3 .识别出的单词以 <单词符号,种别码 >的形式保存在符号表中(链表);4.词法分析中源程序的输入以.c格式,分析后的符号表,将二元组保存在.txt文件中。实验内容:选择高级谛言(C谛言),编制它的词法分析程

2、序。词法分析程序的实现可以采用任何一种编程工具实验原理:1、算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号;2、其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。实验分析:(1)关键字:if else while do case int break等所有的关键字都是小写。(2)运算符和界符:=+ - * / < <= <> > >=;()等(3)其他单词是标识符(ID)和整型常数(SUM ,通过以下正规式定义:ID = _ | letter (letter | digit)*NUM = digit digit*(4)空

3、格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM运算符、界符和关键字,词法分析阶段通常被忽略。(5)注释被忽略(6)各种单词符号对应的种别码(如下):单词符号种别码单词符号种别码auto1double2int3struct4break5else6long7switch8case9enum10register11typedef12char13extern14return15union16const17float18short19unsigned20continue21for22signed23void24default25goto26sizeof27volatile28do29whil

4、e30static31if32a33b34f35n36t37v3839?40,4142043ddd44 xhh45数字46标识符47#48(49)50-29 -5152535455*56:5758%59八60+61?62=63I64&65!66<67>68>=69=70>>71!=72<<73&&74<=75II76+77?=78-79-80->8182%A (A 可为 d's'c)83;8485/868788899091其他类别99实验流程图(由于流程图过大因此各部分分开写)整体:扫描注释:扫描数字

5、:判别为减号预读ch预读ch预读ch判别为负号回退3Ch»数字或-'嬴+="I数Chs*,认为数字结束以由勺形式输出chi回退1位返回到p处扫描引号:扫描单词:3门山uh领读一位rh是否:t.tT '': 照关忘字的广 程序并调用诙W或散字或否是*Lh是否为h判断为一般类别,输出种别码回返1判断为头文 件,输出种别 码否是返M关铺字种 别码并输出该 关键字字否为关返回一眼类刎 种别码实验步骤:1、准备:用TC、VC+等开发工具;2、对本实验的任务进行分析,确定实现功能的函数;3、写好程序,仔细修改函数;4、上机操作:输入源程序,修改、调试,运行。5、

6、写好试验报告。实验调试过程及测试结果/*源代码 */#include<stdio.h> #include<stdlib.h> #include <ctype.h> #include<string.h> void main()FILE *fp,*fp1;int hanjsq=1;行计数器,保存行号int guanjz(char ch1);关键字和标识符判断定义输入和输出文件名scanf("%s",infile);输入需要扫描的文件名char ch,infile15,oufile15;printf("*Enter the

7、 infile name*n");printf("*Enter the outfile name*n");scanf("%s",outfile);输入需要另存为的文件名打开需要扫描的文件打开需要存入的文件if(fp = fopen(infile,"r") = NULL)/printf("cannot open filen");exit(0);if(fp1 = fopen(outfile,"w") = NULL)/printf("cannot open filen")

8、;exit(0);printf("n*printf("* »开始进行词法分析«*n");printf(printf("行号种别码n");”*printf("n*printf( "*fprintf(fp1,"*fprintf(fp1," 行号种别码n");fprintf(fp1,"* while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/*扫描头文件单词及保留字*/if(isalpha(ch) | ch='_')/

9、如果第一个字符为字母或下划线则判断为标识符int i=0;char ch130;/假定每个标识符最长为ch1i+=ch;/ 将ch保存到ch10中并使i自加1while(!feof(fp) ch=fgetc(fp);if(ch=10)hanjsq+;/ 如果ch为换行符,则行计数器自加1if(isalpha(ch) | isdigit(ch) | ch='')/如果ch为字母、数字或下划线就把ch放到ch1i中并使i自加1ch1i+=ch; if(ch='.') 如果ch为小数点则判断是否为头文件 if(ch=fgetc(fp)='h')如果小数

10、点后一位为h则判定其为头文件 if(ch=10)hanjsq+; ch1i+尸.'; ch1i+='h' ch1i尸0'/把结束标志放到 ch1i中作为单词结束标志printf("line %d:%s83n",hanjsq,ch1);/以字符串形式输出chifprintf(fp1,"line %d:%s83n",hanjsq,ch1);break; else/如果小数点后一位不是h则判定其为标识符 fseek(fp,-1,1);/fp 回退 1 ch1i尸0'/把结束标志放到 ch1i中作为单词结束标志printf

11、("line %d:%s%dn",hanjsq,ch1,guanjz(ch1);/以字符串形式输出chi fprintf(fp1,"line %d:%s%dn",hanjsq,ch1,guanjz(ch1);break; if(!isalpha(ch) && !isdigit(ch) && ch!='_' && ch!='.') /如果ch不为字母、数字、下划线和点时判断其为标识符 ch1i='0' printf("line %d:%s%dn&quo

12、t;,hanjsq,ch1,guanjz(ch1);fprintf(fpi,"line %d:%s%dn”,hanjsq,chi,guanjz(chi);/*break;扫描数字 */if(isdigit(ch) | ch='-')如果ch为数字或'-'if(isdigit(ch)如果ch为数字printf("line %d:%c",hanjsq,ch);fprintf(fp1,"line %d:%c",hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/预读一位如果ch为数字和点则循

13、环输出if(isdigit(ch) | ch='.')printf("%c",ch);fprintf(fp1,"%c",ch);else/否则视为数字结束printf("46'n");fprintf(fp1,"46n");fseek(fp,-1,1);/ 回退一位ch='0'/ 置ch为0,以免影响下面误判并顺利退出扫描数字 break;if(ch='-')如果 ch 为'-'ch=fgetc(fp);预读一位if(ch='_'

14、)如果ch还是为'-'则判断为自减符'-'printf("line %d:-80n",hanjsq);fprintf(fp1,"line %d:-80n",hanjsq);if(ch='>,)/ 如果ch为'>',则判断为结构体运算符'->'81n",hanjsq);81n",hanjsq);printf("line %d:->fprintf(fp1,"line %d:->if(isdigit(ch)/ 如果ch为

15、数字则可能为减号或负号fseek(fp,-3,1);/回退 3 为判断ch=fgetc(fp);if(isdigit(ch)/如果ch为数字则判断-'为减号ch=fgetc(fp);printf("line %d:%c79n",hanjsq,ch);fprintf(fp1,"line %d:%c79n",hanjsq,ch);ch=fgetc(fp);printf("line %d:fprintf(fp1,"line %d: while(!feof(fp)ch=fgetc(fp);else /否则判断'-'为负

16、号%c",hanjsq,ch);%c",hanjsq,ch);预读一位如果ch为数字和点则循环输出if(isdigit(ch) | ch='.')printf("%c",ch);fprintf(fp1,"%c",ch);else/否则视为数字结束printf("46'n");fprintf(fp1,"46n");fseek(fp,-1,1);/ 回退 1 break;/*扫描注释*/if(ch='/') 如果ch为'/'则可能为注释ch=f

17、getc(fp);/ 读下一个字符if(ch=10)hanjsq+;if(Ch='/')如果该字符也为'/'则判断为注释一行while(fgetc(fp)!=10);if(ch=10)hanjsq+;/直到遇到换行符出现才认为注释结束if(ch='*')如果该字符为'*'则判断为注释多行/直到出现*/'才认为注释结束while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;if(ch='*')出现'*'/且接着出现/'if(ch=fgetc(fp)=&

18、#39;/')break;else/否则原样输出'/'printf("line %d:fprintf(fp1,"line %d:83n",hanjsq);83n",hanjsq);fseek(fp,-1,1);/回退1break;/*扫描引号*/if(ch="")出现引号int i=0;printf("line %d:%cfprintf(fp1,"line %d:%c82n",hanjsq,ch);82n",hanjsq,ch);printf("line %d:

19、",hanjsq);fprintf(fp1,"line %d:”,hanjsq);while(!feof(fp)/先整体输出引号内所有字符并定为第99类ch=fgetc(fp);i+;用于积累回退长度if(ch=10)hanjsq+;if(ch!='"')if(ch!=32)printf("%c",ch);fprintf(fp1,"%c",ch);else break;printf("99'n");fprintf(fp1,"99n");fseek(fp,-i,1

20、);/回退到引号开始for(;i>0;i-)ch=fgetc(fp);if(ch=92)/ 如果ch为''则可能为转义字符char ch513="abfntv?'"0" /转义字符集ch=fgetc(fp);/预读一位for(int k=0;k<12;k+)/如果为转义字符则输出if(ch=ch5k)%dn",hanjsq,ch,k+33);printf(" line %d:%cfprintf(fp1,line %d:%c%dn",hanjsq,ch,k+33);if(ch='d'

21、&& isdigit(fgetc(fp) && isdigit(fgetc(fp)/fseek(fp,-2,1);printf(" line %d:%c%cfprintf(fp1," line %d:%c%cif(ch='x' && isdigit(fgetc(fp) && isdigit(fgetc(fp)/fseek(fp,-2,1);printf(" line %d:%c%cfprintf(fp1," line %d:%c%cif(ch='%')/ 如果

22、为'%'则可能为 s%c%dch=fgetc(fp);char bfh4="dcs"for(i=0;i<3;i+)if(bfhi=ch)printf(" line %d:%cfprintf(fp1," line %d:%c任意字符转换为三位八进制44n",hanjsq,fgetc(fp),fgetc(fp);44n",hanjsq,fgetc(fp),fgetc(fp);任意字符转换为二位十六进制45'n",hanjsq,fgetc(fp),fgetc(fp);45'n",ha

23、njsq,fgetc(fp),fgetc(fp);83n",hanjsq,ch);83n",hanjsq,ch);/*扫描其他符号*/定义部分单符号集定义部分单符号或双符号(前半部分)集char ch49="+=|&="定义部分双符号(后半部分)if(!isdigit(ch) && !isalpha(ch) && ch!='_' && ch!='"' && ch!='/')char ch214="#()'*:

24、%A" char ch39="+?=|&!<>"for(int i=0;i<13;i+)/判断单个符号if(ch=ch2i) printf("line %d:%c%dn",hanjsq,ch,i+48);fprintf(fp1,"line %d:%c%dn",hanjsq,ch,i+48);for(int j=0;j<8;j+)/判断双符号if(ch=ch3j)/如果ch与ch3中第j个字符匹配ch=fgetc(fp);/预读一位if(ch=10)hanjsq+;if(ch=ch4j)连起来为

25、一个双符号%dn",hanjsq,ch3j,ch4j,i+69);%dn",hanjsq,ch3j,ch4j,i+69);/且ch与ch4第j个匹配,则表示 ch3j与ch4jprintf("line %d:%c%cfprintf(fp1,"line %d:%c%cif(ch='<' && ch3j='<')判断'<<'符printf("line %d:fprintf(fp1,"line %d:if(ch='>' &&

26、amp; ch3j='>')printf("line %d:fprintf(fp1,"line %d:else/否则表示ch3jprintf("line %d:fprintf(fp1,"line %d:<<<<判断'>>'符>>>>为单符号,不是双符号的%c%c77'n",hanjsq);77'n",hanjsq);78n",hanjsq);78n",hanjsq);部分%dn",hanjsq

27、,ch3j,j+61);%dn",hanjsq,ch3j,j+61)fseek(fp,-1,1);/*/printf(”*n");printf("*»词法分析结束printf("* »分析结果保存在文件$中printf("*»欢迎下次使用,谢谢!«*n");«*n",outfile);«*n");printf(”*n");fprintf(fp1,”*n");fprintf(fp1,"* »词法分析结束fprintf(

28、fp1,"* 欢迎下次使用,谢谢!« *n");*n");fprintf(fp1,”*n");int guanjz(char chi口)关键字和标识符判断char ch2329="auto","double","int","struct","break","else","long","switch","case","enum",register&q

29、uot;,"typedef","char","extern","return","union","const","float","short",定义关键字集unsigned","continue","for","signed","void","default","goto","sizeof"

30、;, "volatile","do","while","static","if'for(int i=0;i<32;i+)/逐个比对如果为关键字则返回类别i+1if(!strcmp(ch1,ch2i)return i+1;return 47;/否则返回一般标识符类inITane1”开始进行词法分析line1墉48line1include47line1<67line1s tdiu.h83line1>GSline248line2include47line:-!<67line2at

31、dlib.hline2>G8line3void24line3maiiri47line3(49line3>50line353line5PILE47line5密56line5fp47test,txtMM M MK M M M M HMMJlFn ft (- f fc 口 U.匕 f J _= Fl O.|T|e M * X M * M M M M K MUMcf f seq; &trxtline 1: 1旅1;line 1:line 1:line 1:line 2: line 2;line 2;line 2: line 2; line S;line 3:line 5: line

32、 3: line 3: line 5: line 5;Jine 5:includes:dio,hincludeTdlihhvoidnainF:LEXpi1" fl户 1 test<tMt-M M-WW1F-M4* ¥ WWW F-M-aF WMWEn 16 P* 1rhy aat:fFfed.cf fw-txtn Hi fieM M HX ar 看脏:K HM: * M M*W* M * M M瞄* K X if * M It MM,X *“祝 M 开力处行司法分析M * Xi U HX if 片 M1KmK*KMKMM*KMMMJti>tKKKKM>X>M<KM1MM4tMWtKMHKM*M*KM*tM>XMrMKKM1KMhKKKMK*line L :M48line 1 -iviL-lude加line ItKb7li

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论