实验报告单1一、实验目的1、通过设计、开发一个高级语言的词法分析程序,加深对课堂教学内容(包括正规文法、正规表达式、有限自动机、NFA到DFA的转换、DFA的最小化)的理解,提高词法分析方法的实践能力。2、编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。从左到右逐个字符对构成源程序的字符串进行扫描,依据词法规则,识别出一个一个的标记(token),把源程序变为等价的标记串序列。执行词法分析的程序称为词法分析器,也称为扫描器。二、实验环境(仪器设备、软件等)电脑一台VC三、实验原理(或要求)1、深入理解、掌握有限自动机及其应用;2、掌握根据语言的词法规则构造识别其单词的有限自动机的方法;3、掌握NFA到DFA的等价变换方法、DFA最小化的方法;4、掌握设计、编码、调试词法分析程序的技术与方法,具体实现S语言的词法分析程序。院(系)计算机学院专业计算机科学与技术班级姓名学号同组人无实验室S4305组号日期课程编译原理指导教师成绩实验项目编号实验项目名词法分析2四、实验步骤待分析的简单的词法(1)关键字:beginifthenwhiledoend所有的关键字都是小写。(2)运算符和界符::=+-*/===;()#(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID=letter(letter|digit)*NUM=digitdigit*(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。2.2各种单词符号对应的种别码表2.1各种单词符号对应的种别码单词符号种别码单词符号种别码begin1:17if2:=18then320while421do5=22end623letter(letter|digit)*10=24digitdigit*11=25+13;26-14(27*15)28/16#0词法分析程序的C语言程序源代码#includestdio.h#includestdlib.h#includestring.hcharprog[100],ch,token[8];intp=0,syn,n,i;char*keyword[6]={begin,then,if,while,do,end};voidscaner();voidIrparse();voidstatement();voidexpression_r();3voidterm();voidfactor();voidmain(){intselect=-1;p=0;printf(pleaseinputsentence,endof'#'!\n);do{ch=getchar();prog[p++]=ch;}while(ch!='#');p=0;printf(请输入1或2\n1.词法分析\n2.语法分析\n);scanf(%d,&select);if(select==1){do{scaner();switch(syn){case-1:printf(词法分析出错\n);break;default:printf(%d,%s\n,syn,token);break;}}while(syn!=0);printf(词法分析成功\n);}elseif(select==2){scaner();if(syn==1){Irparse();}//beginelse{printf(语法分析出错!请检查begin关键字\n);return;}if(syn==6)//end{scaner();if(syn==0){4printf(恭喜语法分析成功\n);}else{printf(语法分析出错!请检查是否缺少'#'\n);}}else{printf(语法分析出错!请检查是否缺少'end'\n);}}getchar();}voidscaner(){for(n=0;n8;n++){token[n]='\0';}n=0;ch=prog[p++];while(ch==''){ch=prog[p++];}if((ch='a'&&ch='z')||(ch='A'&&ch='Z')){do{token[n++]=ch;ch=prog[p++];}while((ch='a'&&ch='z')||(ch='a'&&ch='z')||(ch='0'&&ch='9'));syn=10;for(n=0;n6;n++){if(strcmp(token,keyword[n])==0){syn=n+1;}}p--;//return;}elseif(ch='0'&&ch='9'){p--;do5{token[n++]=prog[p++];ch=prog[p];}while(ch='0'&&ch='9');syn=11;return;}else{//ch=prog[p++];switch(ch){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=17;token[0]=ch;ch=prog[p++];if(ch=='='){token[1]=ch;syn++;}elsep--;break;case'':syn=20;token[0]=ch;ch=prog[p++];if(ch==''){token[1]=ch;syn++;}elseif(ch=='='){token[1]=ch;syn=syn+2;}elsep--;break;case'':syn=23;token[0]=ch;ch=prog[p++];if(ch=='='){token[1]=ch;syn++;}elsep--;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;default:printf(词法分析出错!请检查是否输入非法字符\n);syn=-1;break;}6//return;}}voidIrparse(){scaner();statement();while(syn==26)//;{scaner();statement();}}voidstatement(){if(syn==10){scaner();if(syn==18){scaner();expression_r();}else{printf(语法分析出错!请检查表达式是否正确\n);return;}}else{printf(语法分析出错!请检查语句是否正确\n);return;}}voidexpression_r(){term();while(syn==13||syn==14)//+-{7scaner();term();}}voidterm(){factor();while(syn==15||syn==16)//*/{scaner();factor();}}voidfactor(){if(syn==10||syn==11){scaner();}elseif(syn==27){scaner();expression_r();if(syn==28){scaner();}else{printf(语法分析出错!请检查是否缺少')'\n);return;}}else{printf(语法分析出错!请检查是否输入非法字符\n);return;}}五、记录与处理(实验数据、误差分析、结果分析)算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。(1)关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char*rwtab[6]={“begin”,“if”,“then”,“while”,“do”,“end”,};8程序中需要用到的主要变量为syn,token和sum扫描子程序的算法思想首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。9输入beginx:=9:ifx9thenx:=2*x+1/3;end#后经词法分析输出如下序列:(begin1)(x10)(:17)(=18)(911)(;26)(if2)„„10六、实验小结通过编译原理的这次程序实验,在自已动手体验的情况下,更加透彻地理解了词法分析的过程,以及该算法。对于以后由模型向程序代码的转化能力上,有了很大的锻炼。以后我会更加专心的研究计算机知识,不断将现实中遇到的实际问题,向程序方面转变,做到灵活运用所学知识。