您好,欢迎访问三七文档
第1页一、实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。二、基本知识1、正则表达式2、正则表达式到有限自动机的转换3、有限自动机的确定化与最小化三、实验环境1、Windows操作系统2、C/C++/Java语言四、实验要求1、做好实验预习,掌握并熟悉本实验中所使用的编程、测试环境及相应的软件2、写出实验报告五、实验内容1、待分析的C语言子集的词法1)关键字mainifelseintreturnvoidwhile(都是小写)2)专用符号=+—*/====!=;:,{}[]()3)其他标记STRING::=[^]*1ID::=letter(letter|digit)*INT::=digitdigit*letter::=a|…|z|A|…|Zdigit::=0|…|94)空格由空白、制表符和换行符组成空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。第2页2、部分单词符号对应的种别码单词符号种别码单词符号种别码main1:17int2:=18reture320if421else5=22end623lettet(letter|digit)*10=24dightdight*11=25+13;26—14(27{15)28}16#03、词法分析程序的功能输入:所给文法的源程序字符串输出:二元组(syn,token或sum)构成的序列。其中syn为单词种别码;token为存放的单词自身字符串;sum为整型常量(作为常量的值)。实现时,可将单词的二元组用结构进行处理设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。4程序源代码#includestdio.h#includestring.hcharprog[80],token[8],ch;intsyn,p,m,n,sum;char*rwtab[6]={main,int,return,if,else,end};voidscaner();main(){p=0;printf(\npleaseinputastring(endwith'#'):/n);do{第3页scanf(%c,&ch);prog[p++]=ch;}while(ch!='#');p=0;do{scaner();switch(syn){case11:printf((%-10d%5d)\n,sum,syn);break;case-1:printf(youhaveinputawrongstring\n);return0;default:printf((%-10s%5d)\n,token,syn);break;}}while(syn!=0);return0;}//扫描查找函数voidscaner(){sum=0;for(m=0;m8;m++)token[m++]=NULL;ch=prog[p++];m=0;while((ch=='')||(ch=='\n'))ch=prog[p++];if(((ch='z')&&(ch='a'))||((ch='Z')&&(ch='A'))){while(((ch='z')&&(ch='a'))||((ch='Z')&&(ch='A'))||((ch='0')&&(ch='9'))){token[m++]=ch;ch=prog[p++];第4页}p--;syn=10;for(n=0;n6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}elseif((ch='0')&&(ch='9')){while((ch='0')&&(ch='9')){sum=sum*10+ch-'0';ch=prog[p++];}p--;syn=11;}elseswitch(ch){case'':token[m++]=ch;ch=prog[p++];if(ch=='='){syn=22;token[m++]=ch;}else{syn=20;p--;}break;case'':token[m++]=ch;ch=prog[p++];if(ch=='=')第5页{syn=24;token[m++]=ch;}else{syn=23;p--;}break;case'+':token[m++]=ch;ch=prog[p++];if(ch=='+'){syn=17;token[m++]=ch;}else{syn=22;p--;}break;case'-':token[m++]=ch;ch=prog[p++];if(ch=='-'){syn=29;token[m++]=ch;}else{syn=23;p--;}break;case'!':ch=prog[p++];if(ch=='=')第6页{syn=21;token[m++]=ch;}else{syn=31;p--;}break;case'=':token[m++]=ch;ch=prog[p++];if(ch=='='){syn=25;token[m++]=ch;}else{syn=18;p--;}break;case'{':syn=15;token[m++]=ch;break;case'}':syn=16;token[m++]=ch;break;case'(':syn=27;token[m++]=ch;break;case')':syn=28;token[m++]=ch;break;case';':syn=26;token[m++]=ch;第7页break;case'\':syn=30;token[m++]=ch;break;case'#':syn=0;token[m++]=ch;break;case':':syn=17;token[m++]=ch;break;default:syn=-1;break;}token[m++]='\0';}测试代码:main(){if(x2+3)returnx;elsereturn5;intx=10;}end#测试结果截图:第8页分析结果:输出结果有点小瑕疵,关键字int被判断为其他字母而不是关键字。输出的种别码应该是2而不是10,自己找不到原因。第9页六.总结通过本次试验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(如C++语言)直接编写词法分析程序。另外,也让我从新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。
本文标题:编译原理实验一
链接地址:https://www.777doc.com/doc-2068894 .html