#include #include #include #include
#define MAX 18 //分析表的最大容量 #define MAXBUF 255 char ch =@# @#; // 存放读入当前的输入字符 int lineno;
struct reserve //关键字 { char lexptr[MAXBUF]; int token; };
struct reserve symtable[MAX]; char * str[]={"program","input","output","begin","end","var","integer","real","for","to","if","then","else","do","while","write","array","proceure" };
void init() //对符号表进行初始化 { for( int j=0; j<18; j++) { strcpy(symtable[j].lexptr,str[j]); symtable[j].token=j+3; } }
int search(char *temp) { for(int i=0; i { if(!strcmp(symtable[i].lexptr ,temp)) { return symtable[i].token; } } return 0; }
void analyse(FILE *fpin,FILE *fpout) //分析程序 { char arr[MAXBUF]; int i=0; int j=0; while((ch=fgetc(fpin))!=EOF) //读入字符判断,空格、字母、数字、界符 { if(ch==@# @#||ch==@#\t@#) { } else if(ch==@#\n@#) //如果是换行符,则行号加1 { lineno++; } else if(isdigit(ch)) //如果是数字 { while(isdigit(ch)) //判断和读取数字 { arr[j]=ch; j++; ch=fgetc(fpin); } arr[j]=@#\0@#; j=0; fseek(fpin,-1L,SEEK_CUR); fprintf(fpout,"%s\t%d\n",arr,2) ; } else if (isalpha(ch)) //如果是字母 { while(isalpha(ch)||isdigit(ch)) { arr[j]=ch; j++; ch=fgetc(fpin); } fseek(fpin,-1L,SEEK_CUR); arr[j]=@#\0@#; j=0; if (search(arr)) //如果是关键字 { fprintf(fpout,"%s\t%d\n",arr,search(arr)); } else fprintf(fpout,"%s\t%d\n",arr,1); //普通标志符 } else if(ch==@#:@#) { ch=fgetc(fpin); if(ch==@#=@#) { fprintf(fpout,"%s\t%d\n",":=",29); //如果是 := } else { fprintf(fpout,"%s\t%d\n",":",30); //如果是 : fseek(fpin,-1L,SEEK_CUR); } } else if (ch==@#>@#) { ch=fgetc(fpin); if(ch==@#=@#) //如果是 >= { fprintf(fpout,"%s\t%d\n",">=",32); } else { fprintf(fpout,"%s\t%d\n",">",31); //如果是 > fseek(fpin,-1L,SEEK_CUR); } } else if(ch==@#<@#) { ch=fgetc(fpin); if(ch==@#>@#) { fprintf(fpout,"%s\t%d\n","<>",35); // 如果是 <> } else if(ch==@#=@#) { fprintf(fpout,"%s\t%d\n","<=",34); //如果是 <= } else { fprintf(fpout,"%s\t%d\n","<",33); //如果是 < fseek(fpin,-1L,SEEK_CUR); } } else if(ch==@#/@#) { ch=fgetc(fpin); if(ch==@#*@#) { ch=fgetc(fpin); s: while(ch!=@#*@#) { ch=fgetc(fpin); } while(ch==@#*@#) { ch=fgetc(fpin); while(ch!=@#/@#) { goto s; //如果是注释 /* */ } } } else if(ch==@#/@#) { ch=fgetc(fpin); while(ch!=@#\n@#) { ch=fgetc(fpin); //如果是注释 // } } else { fprintf(fpout,"%s\t%d\n","/",24); fseek(fpin,-1L,SEEK_CUR); } } else if(ch==@#+@#) { fprintf(fpout,"%s\t%d\n","+",21); } else if(ch==@#-@#) { fprintf(fpout,"%s\t%d\n","-",22); } else if(ch==@#*@#) { fprintf(fpout,"%s\t%d\n","*",23); } else if(ch==@#(@#) { fprintf(fpout,"%s\t%d\n","(",25); } else if(ch==@#)@#) { fprintf(fpout,"%s\t%d\n",")",26); } else if(ch==@#[@#) { fprintf(fpout,"%s\t%d\n","[",27); } else if(ch==@#]@#) { fprintf(fpout,"%s\t%d\n","]",28); } else if(ch==@#.@#) { fprintf(fpout,"%s\t%d\n",".",39); } else if(ch==@#;@#) { fprintf(fpout,"%s\t%d\n",";",36); } else if(ch==@#=@#) { fprintf(fpout,"%s\t%d\n","=",38); } else if(ch==@#,@#) { fprintf(fpout,"%s\t%d\n",",",40); } else fprintf(fpout,"无法识别的字符 %c\n",ch) ; } }
void main() { printf("***************************词法分析器*************************\n\n\n"); printf("直接输入源代码请按1,从文件中读入源代码请按2 \n") ; char filenamein[10]; char filenameout[10]; printf("请输入源文件名:\n"); scanf("%s",filenamein); printf("请输入保存词法分析结果的文件名:\n"); scanf("%s",filenameout); FILE* fpin=fopen(filenamein,"r"); FILE* fpout=fopen(filenameout,"w"); init(); analyse(fpin,fpout); fclose(fpin); fclose(fpout); _getch(); }
|