ReadMe.txt
上传用户:qdzhkyjx
上传日期:2013-04-04
资源大小:43k
文件大小:4k
- 主要的代码如下(这里给出的是命令行代码,稍加修改就可以做成源码中国演示图片的界面了)
-
- #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]=' ';
- j=0;
- fseek(fpin,-1L,SEEK_CUR);
- fprintf(fpout,"%st%dn",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]=' ';
- j=0;
- if (search(arr)) //如果是关键字
- {
- fprintf(fpout,"%st%dn",arr,search(arr));
- }
- else
- fprintf(fpout,"%st%dn",arr,1); //普通标志符
- }
- else if(ch==':')
- {
- ch=fgetc(fpin);
- if(ch=='=')
- {
- fprintf(fpout,"%st%dn",":=",29); //如果是 :=
- }
- else
- {
- fprintf(fpout,"%st%dn",":",30); //如果是 :
- fseek(fpin,-1L,SEEK_CUR);
- }
- }
- else if (ch=='>')
- {
- ch=fgetc(fpin);
- if(ch=='=') //如果是 >=
- {
- fprintf(fpout,"%st%dn",">=",32);
- }
- else
- {
- fprintf(fpout,"%st%dn",">",31); //如果是 >
- fseek(fpin,-1L,SEEK_CUR);
- }
- }
- else if(ch=='<')
- {
- ch=fgetc(fpin);
- if(ch=='>')
- {
- fprintf(fpout,"%st%dn","<>",35); // 如果是 <>
- }
- else if(ch=='=')
- {
- fprintf(fpout,"%st%dn","<=",34); //如果是 <=
- }
- else
- {
- fprintf(fpout,"%st%dn","<",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,"%st%dn","/",24);
- fseek(fpin,-1L,SEEK_CUR);
- }
- }
- else if(ch=='+')
- {
- fprintf(fpout,"%st%dn","+",21);
- }
- else if(ch=='-')
- {
- fprintf(fpout,"%st%dn","-",22);
- }
- else if(ch=='*')
- {
- fprintf(fpout,"%st%dn","*",23);
- }
- else if(ch=='(')
- {
- fprintf(fpout,"%st%dn","(",25);
- }
- else if(ch==')')
- {
- fprintf(fpout,"%st%dn",")",26);
- }
- else if(ch=='[')
- {
- fprintf(fpout,"%st%dn","[",27);
- }
- else if(ch==']')
- {
- fprintf(fpout,"%st%dn","]",28);
- }
- else if(ch=='.')
- {
- fprintf(fpout,"%st%dn",".",39);
- }
- else if(ch==';')
- {
- fprintf(fpout,"%st%dn",";",36);
- }
- else if(ch=='=')
- {
- fprintf(fpout,"%st%dn","=",38);
- }
- else if(ch==',')
- {
- fprintf(fpout,"%st%dn",",",40);
- }
- else fprintf(fpout,"无法识别的字符 %cn",ch) ;
- }
- }
- void main()
- {
- printf("***************************词法分析器*************************nnn");
- 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();
- }
-