编译原理实验一词法分析识别简单语言的单词符号实验内容:识别简单语言的基本字、标识符、无符号整数、运算符和界符。词法分析实验一词法分析一.题目设计、编制、调试一个识别一简单语言单词的词法分析程序。二.要求1.给出一简单语言单词符号的种别编码实验一词法分析单词符号begin1if2then3while4do5end6l(l|d)*10dd*11种别编码实验一词法分析+13–14*15/16:17:=182021=22单词符号种别编码实验一词法分析23=24=25;26(27)28#0单词符号种别编码实验一词法分析输入是源程序字符串,以‘#’结束。2.词法分析程序的功能输出是单词符号的二元组(单词种别码,单词自身字符串)即(syn,token或sum)单词的种别单词自身字符串整型常数单词实验一词法分析例如输入:beginx:=9;ifx0thenx:=2*x+1/3;end#输出:(1begin)(10x)(18:=)(119)(26;)(2if)……(10x)beginx:=9;ifx0…实验一词法分析例如输入for#输出(10,for)begin1if2then3while4do5end6实验一词法分析说明:●基本字作为一类特殊的标识符来处理;识别出标识符,查基本字表,给出相应种别码。●识别无符号整数是将数字串转换为无符号整数例如:数字串345#转换为整数(3*10+4)*10+5=345送到sum中实验一词法分析算法思想:●主程序:结束Y调用扫描子程序输出单词二元组Syn=0置初值N实验一词法分析置初值:(1)基本字表置初值:char*rwtab[6]={“begin”,“if”,“then”,“while”,“do”,“end”};(2)输入源程序字符串缓冲区prog中;其它字符Syn=n+1扫描子程序算法思想:当前字符=?token=‘‘getch()跳过空格字符拼标识符查基本字表Syn=10拼数Syn=11拼界符Syn=13~29Syn=0error字母字符数字字符界符#YN实验一词法分析#includestdio.h部分程序:#includestring.h定义I/O库所用的某些宏和变量定义字符串库函数charprog[80],token[8];charch;intsyn,p,m,n,sum;char*rwtab[6]={“begin”,“if”,“then”,“while”,“do”,“end”};main(){p=0;printf(“\npleaseinputstring:\n”);do{ch=getchar();prog[p++]=ch;}while(ch!=‘#’);实验一词法分析P=0;do{scaner();switch(syn){case11:printf(“(%2d,%8d)\n”,syn,sum);break;case–1:printf(“inputerror\n”);break;default:printf(“(%2d,%8s)\n”,syn,token);}while(syn!=0);}scaner(){for(n=0;n8;n++)token[n]=NULL;ch=prog[p++];while(ch==‘‘)ch=prog[p++];实验一词法分析if(ch是字母字符){whilech为字母字符或数字字符{ch=token;读下一个字符;}token[m++]=‘\0’;p--;syn=10;for(n=0;n6;n++)if(strcmp(token,rwtab[n])==0){给出syn值;break;}}elsecase'':m=0;token[m++]=ch;ch=prog[p++];if(ch==''){syn=21;token[m++]=ch;}elseif(ch=='='){syn=22;token[m++]=ch;}else{syn=20;p--;}break;if(ch是数字字符){whilech为数字字符{sum=sum*10+ch-’0’;读下一个字符;}p--;syn=11;}elseswitch(ch){case':':ch=token;读下一个字符;if(ch=='='){将:=的种别码=syn;ch=token;}else{将:的种别码=syn;p--;}break;case‘':ch=token;读下一个字符;if(ch=='='){将=的种别码=syn;ch=token;}else{将的种别码=syn;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=0;token[0]=ch;break;default:syn=-1;}}