⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanner.cpp

📁 这几天做编译的课程设计,只做了词法分析部分,感觉很不错!
💻 CPP
字号:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<stdarg.h>
#include<math.h>


#define MAXBUF 20
#define MAX 300
char arr[100];//识别字的缓冲数组
char ch;
int  string_char_num=0,error_num=0;

struct token
{
	char keyword[MAXBUF];
	int tokennum;
};
//关键字结构
struct token keywords[MAX]=
{
	{"and",1},{"array",2},{"begin",3},{"bool",4},{"call",5},{"case",6},
	{"char",7},{"constant",8},{"do",9},{"else",10},{"end",11},{"false",12},
	{"for",13},{"if",14},{"input",15},{"integer",16},{"not",17},{"of",18},
	{"or",19},{"output",20},{"proceduce",21},{"program",22},{"read",23},{"real",24},
	{"repeat",25},{"set",26},{"then",27},{"to",28},{"true",29},{"until",30},
	{"var",31},{"while",32},{"write",33},{"stringsign",34},{"intnum",35},{"trunum",36},
	{"charnum",37},{"'",38},{"(",39},{")",40},{"*",41},{"*/",42},
        {"+",43},{",",44},{"-",45},{".",46},{"..",47},{"/",48},
	{"/*",49},{":",50},{":=",51},{";",52},{"<",53},{"<=",54},
	{"<>",55},{"=",56},{">",57},{">=",58},{"[",59},{"]",60},
};

//判断给的字符串是否在字符号表中
int judgekeyword(const char *keywordstring)
{
	int loop;
	for(loop=0;loop<=32;loop++)
	{
		if(strcmp(keywords[loop].keyword,keywordstring)==0)
			return keywords[loop].tokennum;
	}
	return 0;
}
//字符变量打印
void outprintchar(int tokenno)
{
	FILE *fpout;
	fpout=fopen("token.txt","a");
    fprintf(fpout,"(%d,%c)\n",tokenno,ch) ;
	fclose(fpout);
	string_char_num++;
	return;
}
//字符串变量和关键字打印
void outprintstring(int tokenno)
{
	FILE *fpout;
	fpout=fopen("token.txt","a");
    fprintf(fpout,"(%d,%s)\n",tokenno,arr) ;
	fclose(fpout);
	string_char_num++;
	return;
}
//错误报告打印
void outprinterror(int lineno,int lieno)
{
	FILE *fpout;
	int i;
	i=strlen(arr);
	if(i==1)
	{  
	   fpout=fopen("error.txt","a");
       fprintf(fpout,"无法识别的字符  %s\t   error  \t%d\t%d  \n",arr,lineno,lieno);
	   fclose(fpout);
	}
	else
	{
	   fpout=fopen("error.txt","a");
       fprintf(fpout,"变量错误  \t%s\t   error  \t%d\t%d  \n",arr,lineno,lieno);
	   fclose(fpout);
	}
	error_num++;
	return;
}

//行列值打印
void outprintline(int lineno,int lieno)
{
    FILE *fpout;
	fpout=fopen("line.txt","a");
    fprintf(fpout,"%d\t%d\n",lineno,lieno);
	fclose(fpout);
	return;
}


//扫瞄器主体部分
void scanner()
{
    FILE *fpin, *fpout;
  //  char infilename[20],outfilename[20];
    int lineno=1,lieno=1;
    
/* printf("\nthe input file name:");
    scanf("%s",infilename);
    printf("\nthe output file name:");
    scanf("%s",outfilename);
*/
    if((fpin=fopen("program.txt","r"))==NULL)
    {
        printf("cannot open file");
        return;
    }
	int j=0;
    fpout=fopen("token.txt","w");  //将文件清空
	fclose(fpout);
	fpout=fopen("error.txt","w");  //将文件清空
	fclose(fpout);
	fpout=fopen("line.txt","w");   //将文件清空
	fclose(fpout);	
	while((ch=fgetc(fpin))!=EOF)  		//读入字符判断,空格、字母、数字、界符
	{   
		if(ch==' '||ch=='\t')
		{
			;
		}
		else if(ch=='\n')				//如果是换行符,则行号加1,列号为初值1
		{  
			lineno++;
			lieno=1;
		}
		else if(isdigit(ch))			//如果是数字
		{ 
			arr[j++]=ch;
			ch=fgetc(fpin);
			while(isdigit(ch))			//判断和读取数字
			{ 
				arr[j++]=ch;
				ch=fgetc(fpin);
			}
			if(ch=='.')
			{	
				arr[j++]=ch;
				ch=fgetc(fpin);
				if(isalpha(ch)||ch=='_')
					goto error;
				if(isdigit(ch))
				{
					while(isdigit(ch))
					{
					   arr[j++]=ch;
				       ch=fgetc(fpin);
					}
error:     		   if(isalpha(ch)||ch=='_')
				   {
					    arr[j++]=ch;
				        ch=fgetc(fpin);
					    while(isalpha(ch)||ch=='_'||isdigit(ch))
						{
                            arr[j++]=ch;
						    ch=fgetc(fpin);
						}
                        arr[j]='\0';
						fseek(fpin,-1L,SEEK_CUR);
						outprinterror(lineno,lieno);
						outprintline(lineno,lieno);
						lieno=lieno+j;
						j=0;
				   }
				   else
				   {
				       arr[j]='\0';					   
			           fseek(fpin,-1L,SEEK_CUR);
					   outprintstring(36);
					   outprintline(lineno,lieno);
					   lieno=lieno+j;
			           j=0;
				   }
				}
			}
			else if(isalpha(ch)||ch=='_')//是字母或是_
			{
				arr[j++]=ch;
				ch=fgetc(fpin);
			    while(isalpha(ch)||(ch=='_')||isdigit(ch))
				{
                      arr[j++]=ch;
				      ch=fgetc(fpin);
				}
                arr[j]='\0';
				fseek(fpin,-1L,SEEK_CUR);
				outprinterror(lineno,lieno);
				outprintline(lineno,lieno);
				lieno=lieno+j;
				j=0;
				
			}
			else
			{
                arr[j]='\0';				
			    fseek(fpin,-1L,SEEK_CUR);
				outprintstring(35);
				outprintline(lineno,lieno);
				lieno=lieno+j;
			    j=0;
			}	
		}
		else if (isalpha(ch))		//如果是字母
		{   
			arr[j++]=ch;
			ch=fgetc(fpin);
			while(isalpha(ch)||isdigit(ch)||ch=='_')
			{
				arr[j++]=ch;
				ch=fgetc(fpin);
			}
			    fseek(fpin,-1L,SEEK_CUR);
			    arr[j]='\0';
			    if (judgekeyword(arr))	//如果是关键字
				{
				    outprintstring(judgekeyword(arr));
				    outprintline(lineno,lieno);
				}
			    else                         //普通标志符
				{
				    outprintstring(34);	
				    outprintline(lineno,lieno);
				}
			    lieno=lieno+j;
			    j=0;
		}
       else if(ch=='\'')
		{
		   outprintchar(38);
		   outprintline(lineno,lieno);
		   lieno++;
	   }
        else if(ch=='(')
		{	
			outprintchar(39);
			outprintline(lineno,lieno);
			lieno++;
		}
		else if(ch==')')
		{	
			outprintchar(40);
			outprintline(lineno,lieno);
			lieno++;
		}
        else if(ch=='*')       
		{	
			outprintchar(41);
			outprintline(lineno,lieno);
			lieno++;
		}
        else if(ch=='+')
		{
			outprintchar(43);
			outprintline(lineno,lieno);
			lieno++;
		}
        else if(ch==',')
		{	
			outprintchar(44);
			outprintline(lineno,lieno);
			lieno++;
		}
		else if(ch=='-')
		{	
			outprintchar(45);
			outprintline(lineno,lieno);
			lieno++;
		}
        else if(ch=='.')
		{
            ch=fgetc(fpin);
            if(ch=='.')
            {
				lieno++;
				fpout=fopen("token.txt","a");
                fprintf(fpout,"(%d,%s)\n",47,"..");
				fclose(fpout);
				outprintline(lineno,lieno);
				lieno++;
				string_char_num++;
            }
            else
            {
				fpout=fopen("token.txt","a");
		        fprintf(fpout,"(%d,%s)\n",46,".");
				fclose(fpout);
				outprintline(lineno,lieno);
				lieno++;
				string_char_num++;
                fseek(fpin,-1L,SEEK_CUR);
            }
		}
        else if(ch=='/')
		{   
			ch=fgetc(fpin);
			if(ch=='*')
			{   
				fpout=fopen("token.txt","a");
                fprintf(fpout,"(%d,%s)\n",49,"/*");
				fclose(fpout);
				string_char_num++;
				outprintline(lineno,lieno);
				lieno++;
				ch=fgetc(fpin);
exple:				
				while(ch!='*')
				{
					lieno++;
					if(ch=='\n')
					{
					    lineno++;
					    lieno=0;
					} 
					ch=fgetc(fpin);					
				}
				if(ch=='*')
				{   
					lieno++;
					ch=fgetc(fpin);					
					while(ch!='/')
					{
						goto exple;			//如果是注释 /*  */
					}
					fpout=fopen("token.txt","a");
                    fprintf(fpout,"(%d,%s)\n",42,"*/");
					fclose(fpout);
					string_char_num++;
					outprintline(lineno,lieno);
					lieno++;
				//	fseek(fpin,-1L,SEEK_CUR);
				}
			}
            else if(ch=='/')
			{
				ch=fgetc(fpin);
				while(ch!='\n')
				{
					ch=fgetc(fpin);	  //如果是注释 //
				}
				lineno++;
				lieno=1;
			}
			else 
			{  
				fpout=fopen("token.txt","a");
				fprintf(fpout,"(%d,%s)\n",48,"/");
				fclose(fpout);
				string_char_num++;
				outprintline(lineno,lieno);
				lieno++;
				fseek(fpin,-1L,SEEK_CUR);
			}
        }
		else if(ch==':')  
		{
			ch=fgetc(fpin);
			if(ch=='=') 
			{				
				fpout=fopen("token.txt","a");
				fprintf(fpout,"(%d,%s)\n",51,":=");
				fclose(fpout);             //如果是 :=				
				outprintline(lineno,lieno);
				lieno+=2;
				string_char_num++;
			}
			else
			{
				fpout=fopen("token.txt","a");
				fprintf(fpout,"(%d,%s)\n",50,":");   //如果是 :
				fclose(fpout);
				string_char_num++;
				outprintline(lineno,lieno);
				lieno++;
				fseek(fpin,-1L,SEEK_CUR);
			}
		}
        else if(ch==';')
		{
			outprintchar(52);
			outprintline(lineno,lieno);
			lieno++;
		}
        else if(ch=='<')
		{ 
			ch=fgetc(fpin);
			if(ch=='>')
			{				
				fpout=fopen("token.txt","a");
				fprintf(fpout,"(%d,%s)\n",55,"<>");  // 如果是 <>
				fclose(fpout);				
				outprintline(lineno,lieno);
				lieno+=2;
				string_char_num++;
			}
			else if(ch=='=')
			{				
				fpout=fopen("token.txt","a");
				fprintf(fpout,"(%d,%s)\n",54,"<=");   //如果是 <=
				fclose(fpout);
				string_char_num++;
				outprintline(lineno,lieno);
				lieno++;
			}
			else 
			{
				fpout=fopen("token.txt","a");
				fprintf(fpout,"(%d,%s)\n",53,"<");   //如果是 <
				fclose(fpout);
				outprintline(lineno,lieno);
				lieno++;
				fseek(fpin,-1L,SEEK_CUR);
			}
		}
        else if(ch=='=')
		{
			lieno++;
			fpout=fopen("token.txt","a");
			fprintf(fpout,"(%d,%s)\n",56,"=");
			fclose(fpout);
			string_char_num++;
			outprintline(lineno,lieno);
		}
		else if (ch=='>')
		{
			ch=fgetc(fpin);
			if(ch=='=')    //如果是 >=
			{				
				fpout=fopen("token.txt","a");
				fprintf(fpout,"(%d,%s)\n",58,">=");
				fclose(fpout);
				string_char_num++;
				outprintline(lineno,lieno);
				lieno++;
			}
			else
			{
				fpout=fopen("token.txt","a");
				fprintf(fpout,"(%d,%s)\n",57,">");  //如果是 >
				fclose(fpout);
				string_char_num++;
				outprintline(lineno,lieno);
				lieno++;
				fseek(fpin,-1L,SEEK_CUR);
			}
		}
		else if(ch=='[')
		{
			lieno++;
			outprintchar(59);
			outprintline(lineno,lieno);
		}
		else if(ch==']')
		{
			lieno++;
			outprintchar(60);
		}
		else 
		{	
			arr[j++]=ch;
		    arr[j]='\0';
			j=0;
			outprinterror(lineno,lieno);
			outprintline(lineno,lieno);
			lieno++;
		}
		}
       fclose(fpin);
}

//主函数
void main()
{   
    scanner();   /*扫描源程序*/
	FILE *fpout;
	fpout=fopen("line.txt","a");
    fprintf(fpout,"总共:\t%d\n正确:\t%d\n错误:\t%d\n",string_char_num,(string_char_num-error_num),error_num);
	fclose(fpout);
	return;
}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -