这次的实验是编制一个词法分析程序,要求,输入:源程序的字符串,输出:二元组(种别,单词符号本身)。只要根据字符串的不同性质分组,代入到不同的种别码,然后可以输出了
#include <stdio.h> #include <stdlib.h> #include <string.h> char sum[100],ch,token[100]; int a=0,zbm,n,i; char *keyword[18]={"begin","and","const","long","float","double","void","main","if","else","then","break","int","char","include","for","while","printf"}; void scaner(); void main() { printf("请输入一段你想测试的单词符号, 以‘#’号作为结束符号 !\n"); do { ch=getchar();//输入字符 sum[a++]=ch;//把字符存到数组里 }while(ch!='#');//以#为循环条件 a=0; do { scaner(); printf("<%d,%s>\n",zbm,token); }while(zbm!=0); printf("感谢使用该系统\n"); getchar(); } void scaner() { for(n=0;n<100;n++) {token[n]='\0';} n=0; ch=sum[a++];//全局变量p=0 while(ch==' '){ch=sum[a++];}//有空格就继续(判断标识符前是否存在空格) if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { do{ token[n++]=ch; ch=sum[a++]; }while((ch>='a'&&ch<='z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')); zbm=21; for(n=0;n<18;n++) { if(strcmp(token,keyword[n])==0)//判断英文是否和关键字完全一样 { zbm=n+1; } } a--; } else if(ch>='0'&&ch<='9') { a--; do { token[n++]=sum[a++]; ch=sum[a]; }while(ch>='0'&&ch<='9'); zbm=22; return; } else { switch(ch) { case '+':zbm=24;token[0]=ch;break; case '-':zbm=25;token[0]=ch;break; case '*':zbm=26;token[0]=ch;break; case '/':zbm=27;token[0]=ch;break; case ':':zbm=28;token[0]=ch; ch=sum[a++]; if(ch=='='){token[1]=ch;zbm++;} else a--; break; case '<':zbm=30;token[0]=ch; ch=sum[a++]; if(ch=='='){token[1]=ch;zbm++;} else if(ch=='>'){token[1]=ch;zbm=zbm+2;} else a--; break; case '>':zbm=33;token[0]=ch; ch=sum[a++]; if(ch=='='){token[1]=ch;zbm++;} else a--; break; case '=':zbm=35;token[0]=ch;break; case ';':zbm=36;token[0]=ch;break; case '(':zbm=37;token[0]=ch;break; case ')':zbm=38;token[0]=ch;break; case '{':zbm=39;token[0]=ch;break; case '}':zbm=40;token[0]=ch;break; case '!':zbm=41;token[0]=ch;break; case '@':zbm=42;token[0]=ch;break; case '$':zbm=43;token[0]=ch;break; case '%':zbm=44;token[0]=ch;break; case '^':zbm=45;token[0]=ch;break; case '&':zbm=46;token[0]=ch;break; case '#':zbm=0;token[0]=ch;break; default: printf("词法分析出错! 请检查是否输入非法字符\n");zbm=-1;break; } } }
以下为源代码编译结果
以下为我编写的种别码