实验1--词法分析实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验1词法分析实验报告一、实验目的调试并完成一个词法分析程序,加深对词法分析原理的理解。二、实验要求1、待分析的简单语言的词法(1)关键字:beginifthenwhiledoend所有关键字都是小写。(2)运算符和界符::=+–*/===;()#(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:ID=letter(letter|digit)*NUM=digitdigit*(4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。2、各种单词符号对应的种别码单词符号种别码单词符号种别码begin1:17if2:=18then320while421do5=22end623letter(letter|digit)*10=24digitdigit*11=25*13;26/14(27+15)28-16#03、词法分析程序的功能输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。三、源程序代码:#includestdio.h#includestring.h#includeiostream.hcharprog[80],token[8];charch;intsyn,p,m=0,n,row,sum=0;char*rwtab[6]={begin,if,then,while,do,end};voidscaner(){for(n=0;n8;n++)token[n]=NULL;ch=prog[p++];while(ch==''){ch=prog[p];p++;}if((ch='a'&&ch='z')||(ch='A'&&ch='Z')){m=0;while((ch='0'&&ch='9')||(ch='a'&&ch='z')||(ch='A'&&ch='Z')){token[m++]=ch;ch=prog[p++];}token[m++]='\0';p--;syn=10;for(n=0;n6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}elseif((ch='0'&&ch='9')){{sum=0;while((ch='0'&&ch='9')){sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=11;if(sum32767)syn=-1;}elseswitch(ch){case'':m=0;token[m++]=ch;ch=prog[p++];if(ch==''){syn=21;token[m++]=ch;}elseif(ch=='='){syn=22;token[m++]=ch;}else{syn=23;p--;}break;case'':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=20;p--;}break;case':':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=18;token[m++]=ch;}else{syn=17;p--;}break;case'*':syn=13;token[0]=ch;break;case'/':syn=14;token[0]=ch;break;case'+':syn=15;token[0]=ch;break;case'-':syn=16;token[0]=ch;break;case'=':syn=25;token[0]=ch;break;case';':syn=26;token[0]=ch;break;case'(':syn=27;token[0]=ch;break;case')':syn=28;token[0]=ch;break;case'#':syn=0;token[0]=ch;break;case'\n':syn=-2;break;default:syn=-1;break;}}voidmain(){p=0;row=1;coutPleaseinputstring:endl;do{cin.get(ch);prog[p++]=ch;}while(ch!='#');p=0;do{scaner();switch(syn){case11:cout(syn,sum)endl;break;case-1:coutErrorinrowrow!endl;break;case-2:row=row++;break;default:cout(syn,token)endl;break;}}while(syn!=0);}四、结果验证1、给定源程序beginx:=9;ifx0thenx:=2*x+1/3;end#输出结果2、源程序(包括上式未有的while、do以及判断错误语句):beginx=$;whilea0dob9-x;end#输出结果五、收获(体会)与建议通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。比如:main()函数中,用cinch;语句得到ch值的话,给定源程序的结果第一行得到的是(10,beginx),因为得到的字符串中省略了空格,改用cin.get(ch);问题便解决了。另外,我在程序中加入了row变量,以便能够准确得到错误所在。实验二时发现怎么出结果都会出现一个缺:=错误,便回头检查代码才发现实验一时的scaner()函数最后的:和:=的种别码互相写错了,所以回过头来重新修正了代码和实验结果图。

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功