《编译原理》实验报告实验题目:词法分析专业:计算机科学与技术班级:计科142班姓名:学号:20140902243二○一八年一月二日目录一、实验目的:...............................................................................................................................1二、实验要求:...............................................................................................................................1三、词法分析程序的算法思想:...................................................................................................2四、程序代码:...............................................................................................................................3五、结果分析:...............................................................................................................................7六、总结:.......................................................................................................................................81一、实验目的:根据词法分析器的基本原理,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。二、实验要求:2.1词法分析器:逐个读入源程序字符并按照构词规则切分成一系列单词。单词是语言中具有独立意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。词法分析是编译过程中的一个阶段,在语法分析前进行。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。要求:通过词法分析器能够实现以下五种类型如单词等的识别。(1)关键字begin,end,if,then,else,while,write,read等,do,call,const,char,until,procedure,repeat等(2)运算符:+,-,*,/,=等(3)界符:{,},[,],;,,,.,(,),:等(4)标识符(其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID=letter(letter|digit)*NUM=digitdigit*(5)常量如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。空格由空白、制表符和换行符组成。2.2各种单词符号对应的种别码:单词符号种别码单词符号种别码begin1:17If2:=18Then320while421do5=22end623lettet(letter|digit)*10=24dightdight*11=25+13;26—14(27*15)282/16#02.3词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。例如:对源程序beginx:=9:ifx9thenx:=2*x+1/3;end#的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……三、词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。3.1主程序示意图:主程序示意图如图所示。其中初始包括以下两个方面:⑴关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char*rwtab[6]={“begin”,“if”,“then”,“while”,“do”,“end”,};3(2)程序中需要用到的主要变量为syn,token和sum3.2扫描子程序的算法思想:首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。扫描子程序主要部分流程如图所示四、程序代码:#includestdio.h#includestring.h#includeconio.h#includeprocess.hcharprog[80],token[8],ch;intsyn,p,m,n,sum;char*rwtab[6]={begin,if,then,while,do,end};scaner();main(){p=0;4printf(\npleaseinputastring(endwith'#'):/n);do{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);getch();exit(0);default:printf((%-10s%5d)\n,token,syn);break;}}while(syn!=0);getch();}scaner(){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++];}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++];5}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=='='){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=13;p--;}break;case'-':token[m++]=ch;ch=prog[p++];if(ch=='-'){syn=29;token[m++]=ch;6}else{syn=14;p--;}break;case'!':ch=prog[p++];if(ch=='='){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=5;token[m++]=ch;break;7case'}':syn=6;token[m++]=ch;break;case';':syn=26;token[m++]=ch;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';}五、结果分析:输入beginy:=8:ifx=8thenx:=2*(1+1/3);end#经词法分析输出如下序列:(begin1)(y10)(:17)(=18)(811)(;26)(if2)……如图所示:8六、总结:通过此次实验,觉得做词法分析器还是比较有趣的。首先编写程序之前应该要有一个整体的规划,然后在考虑细节问题,不断地发现问题,修改程序,使之精益求精。本次实验加深了对词法分析的理解,能够较好的掌握其基本要领。再者我觉得应该培养自己良好的程序设计风格。