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

📄 czh.cpp

📁 一个词法分析器,挺实用的,实现了小数,界符,关键字,运算符,标识符的检测
💻 CPP
字号:
#include "iostream.h"
#include "stdio.h"
#include "ctype.h"
#include"stdlib.h"
#include"string.h"
#include "iomanip.h"
#include"setcolor.h"
class RS
{
    public:
		RS(){}
		~RS(){}
        //void set();	    
		void listall();		
		char *setname(char name[255]){return name;}
		char *settype(char type[20]){return type;}	
	    char name[255];
		char type[20];
		int  idx,idy;


};
void RS::listall()
 {	
 cout<<setiosflags(ios::left)<<setw(15)<<name<<setw(15)<<type<<"("<<idx<<","<<idy<<")"<<endl;
 }
RS rs[1000];
int rsnum=0;
#define  MAX 9   //分析表的最大容量
#define  MAXBUF 255
char  ch =' ';   // 存放读入当前的输入字符
int lineno;
char tr[MAXBUF];
struct mykey   //关键字
{
 char lexptr[MAXBUF];
 int token;
};
struct mykey symtable[MAX];
char * str[]={"main","void","cout","cin","if","else","int","float","double","while" };//"include",

void init()     //对符号表进行初始化
{
 for( int j=0; j<9; j++)
 { 
  strcpy(symtable[j].lexptr,str[j]);
  symtable[j].token=j+2;
 }
}
int search(char *temp)
{
	for(int i=0;i<18;i++) {
     if(!strcmp(symtable[i].lexptr ,temp))
	 {
       return  symtable[i].token;
	 }
 }
 return 0;
} 
void Analyse(FILE *fpin,FILE *fpout)    //分析主程序
{
	  char arr[MAXBUF],arrtemp[MAXBUF];
      int i=0;
	  int j=0,k=0;
	  int y=0;
      while((ch=fgetc(fpin))!=EOF)    //读入字符判断,(换行符、空格、字母、数字、界符)
	  {
	      rsnum++;
		  if(ch==' '||ch=='\t')
		  {
            rsnum--;
		  }
		  else if(ch=='\n')    //如果是换行符,则行号加1
		  {  
			rsnum--;
		    lineno++;
			y=0;
		  }
		  else if(isdigit(ch))   //如果是数字
		  { 
		    while(isdigit(ch))   //判断和读取数字
			{ 
				arr[j]=ch;
				j++;
				ch=fgetc(fpin);
			} 
		    if(ch=='.'){
			   arr[j]=ch;j++;
			   ch=fgetc(fpin);
			   while(isdigit(ch))   //判断和读取小数点后的数字
			   { 
				arr[j]=ch;
				j++;
				ch=fgetc(fpin);
			   }
			}
			   arr[j]='\0';
			   j=0;
			   fseek(fpin,-1L,SEEK_CUR);
			   strcpy(rs[rsnum].name,rs[rsnum].setname(arr));
			   strcpy(rs[rsnum].type,rs[rsnum].settype("2"));
               rs[rsnum].idx=lineno;
			   rs[rsnum].idy=++y;
			   fprintf(fpout,"%s\t\t%d\t%d\t%d\n",arr,2,lineno,rs[rsnum].idy) ;
		  }
		  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)) //如果是关键字
			   {
					strcpy(rs[rsnum].name,arr);
					strcpy(rs[rsnum].type,"关键字");
					rs[rsnum].idx=lineno;
					rs[rsnum].idy=++y;
					fprintf(fpout,"%s\t\t%d\t%d\t%d\n",arr,search(arr),lineno,rs[rsnum].idy);
			   }
			   else
			   {
					strcpy(rs[rsnum].name,arr);
					strcpy(rs[rsnum].type,"1");
					rs[rsnum].idx=lineno;
					rs[rsnum].idy=++y;
					fprintf(fpout,"%s\t\t%d\t%d\t%d\n",arr,1,lineno,rs[rsnum].idy); //普通标志符
			   }
		  }
		  else if(ch=='!')  
		  {
			   arrtemp[0]=ch;char cht;cht=ch;
			   ch=fgetc(fpin);
			   if(ch=='=') 
			   {arrtemp[1]=ch;arrtemp[2]='\0';
				strcpy(rs[rsnum].name,arrtemp);
				strcpy(rs[rsnum].type,"21");
				rs[rsnum].idx=lineno;
				rs[rsnum].idy=++y;
				fprintf(fpout,"%s\t\t%d\t%d\t%d\n","!=",21,lineno,rs[rsnum].idy);    //如果是 !=
			   }
			   else
			   {
				   arrtemp[1]='\0';//j=0;
				   arrtemp[0]=cht;
				   strcpy(rs[rsnum].name,arrtemp);
				   strcpy(rs[rsnum].type,"22");
				   rs[rsnum].idx=lineno;
				   rs[rsnum].idy=++y;
				   fprintf(fpout,"%s\t\t%d\t%d\t%d\n","!",22,lineno,rs[rsnum].idy);   //如果是 !
				   fseek(fpin,-1L,SEEK_CUR);
			   }
		  }	
		  else if(ch=='=')  
		  {
			   arrtemp[0]=ch;char cht;cht=ch;
			   ch=fgetc(fpin);
			   if(ch=='=') 
			   {
				   arrtemp[1]=ch;arrtemp[2]='\0';
				   strcpy(rs[rsnum].name,arrtemp);
				   strcpy(rs[rsnum].type,"23");
				   rs[rsnum].idx=lineno;
				   rs[rsnum].idy=++y;
				   fprintf(fpout,"%s\t\t%d\t%d\t%d\n","==",23,lineno,rs[rsnum].idy);    //如果是 ==
			   }
			   else
			   {
				   arrtemp[1]='\0';
				   arrtemp[0]=cht;
				   strcpy(rs[rsnum].name,arrtemp);
				   strcpy(rs[rsnum].type,"24");
				   rs[rsnum].idx=lineno;
				   rs[rsnum].idy=++y;
				   fprintf(fpout,"%s\t\t%d\t%d\t%d\n","=",24,lineno,rs[rsnum].idy);   //如果是 =
				   fseek(fpin,-1L,SEEK_CUR);
			   }
		  }		  
		  else if(ch=='<')
		  { 
			   arrtemp[0]=ch;char cht;cht=ch;
			   ch=fgetc(fpin);
			   if(ch=='<')
			   {
				    arrtemp[1]=ch;arrtemp[2]='\0';
				    strcpy(rs[rsnum].name,arrtemp);
					strcpy(rs[rsnum].type,"25");
					rs[rsnum].idx=lineno;
					rs[rsnum].idy=++y;
				    fprintf(fpout,"%s\t\t%d\t%d\t%d\n","<<",25,lineno,rs[rsnum].idy);  // 如果是 <<
			   }
			   else if(ch=='=')
			   {
				   arrtemp[1]='\0';
				   arrtemp[0]=cht;
				   strcpy(rs[rsnum].name,arrtemp);
				   strcpy(rs[rsnum].type,"26");
				   rs[rsnum].idx=lineno;
				   rs[rsnum].idy=++y;
				   fprintf(fpout,"%s\t\t%d\t%d\t%d\n","<=",26,lineno,rs[rsnum].idy);   //如果是 <=
			   }
			   else 
			   {
				   arrtemp[1]='\0';
				   arrtemp[0]=cht;
				   strcpy(rs[rsnum].name,arrtemp);
				   strcpy(rs[rsnum].type,"27");
				   rs[rsnum].idx=lineno;
				   rs[rsnum].idy=++y;
				   fprintf(fpout,"%s\t\t%d\t%d\t%d\n","<",27,lineno,rs[rsnum].idy);   //如果是 <
			       fseek(fpin,-1L,SEEK_CUR);
			   }
		  }
		  else if(ch=='>')
		  { 
			   arrtemp[0]=ch;char cht;cht=ch;
			   ch=fgetc(fpin);
			   if(ch=='>')
			   {
				    arrtemp[1]=ch;arrtemp[2]='\0';
				    strcpy(rs[rsnum].name,arrtemp);
					strcpy(rs[rsnum].type,"28");
					rs[rsnum].idx=lineno;
					rs[rsnum].idy=++y;
			    	fprintf(fpout,"%s\t\t%d\t%d\t%d\n",">>",28,lineno,rs[rsnum].idy);  // 如果是 >>
			   }
			   else if(ch=='=')
			   {
				    arrtemp[1]=ch;arrtemp[2]='\0';
				    strcpy(rs[rsnum].name,arrtemp);
					strcpy(rs[rsnum].type,"29");
					rs[rsnum].idx=lineno;
					rs[rsnum].idy=++y;
				    fprintf(fpout,"%s\t\t%d\t%d\t%d\n",">=",29,lineno,rs[rsnum].idy);   //如果是 >=
			   }
			   else 
			   {
				   arrtemp[1]='\0';
				   arrtemp[0]=cht;
				   strcpy(rs[rsnum].name,arrtemp);
				   strcpy(rs[rsnum].type,"30");
				   rs[rsnum].idx=lineno;
				   rs[rsnum].idy=++y;
				   fprintf(fpout,"%s\t\t%d\t%d\t%d\n",">",30,lineno,rs[rsnum].idy);   //如果是 >
				   fseek(fpin,-1L,SEEK_CUR);
			   }
		  }
		  else if(ch=='/')
		  { 
			   ch=fgetc(fpin);
			   if(ch=='*')
			   {
		   	    ch=fgetc(fpin);
	    	s:                //goto come here
		       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\t%d\t%d\t%d\n","/",31,lineno,rs[rsnum].idy);
				fseek(fpin,-1L,SEEK_CUR);
		   }
		  }
		  else if(ch=='+')
		  {
			  arrtemp[0]=ch;arrtemp[1]='\0';
			  strcpy(rs[rsnum].name,arrtemp);
			  strcpy(rs[rsnum].type,"32");
			  rs[rsnum].idx=lineno;
			  rs[rsnum].idy=++y;
		      fprintf(fpout,"%s\t\t%d\t%d\t%d\n","+",32,lineno,rs[rsnum].idy);
		  }
		  else if(ch=='-')
		  {
			  arrtemp[0]=ch;arrtemp[1]='\0';
			  strcpy(rs[rsnum].name,arrtemp);
			  strcpy(rs[rsnum].type,"33");
			  rs[rsnum].idx=lineno;
			  rs[rsnum].idy=++y;
		      fprintf(fpout,"%s\t\t%d\t%d\t%d\n","-",33,lineno,rs[rsnum].idy);
		  }
		  else if(ch=='*')
		  {
			  arrtemp[0]=ch;arrtemp[1]='\0';
			  strcpy(rs[rsnum].name,arrtemp);
			  strcpy(rs[rsnum].type,"34");
			  rs[rsnum].idx=lineno;
			  rs[rsnum].idy=++y;
		      fprintf(fpout,"%s\t\t%d\t%d\t%d\n","*",34,lineno,rs[rsnum].idy);
		  }
		  else if(ch=='%')
		  {
			  arrtemp[0]=ch;arrtemp[1]='\0';
			  strcpy(rs[rsnum].name,arrtemp);
			  strcpy(rs[rsnum].type,"35");
			  rs[rsnum].idx=lineno;
			  rs[rsnum].idy=++y;
		      fprintf(fpout,"%s\t\t%d\t%d\t%d\n","%",35,lineno,rs[rsnum].idy);
		  }
		  else if(ch=='(')
		  {
			  arrtemp[0]=ch;arrtemp[1]='\0';
			  strcpy(rs[rsnum].name,arrtemp);
			  strcpy(rs[rsnum].type,"36");
			  rs[rsnum].idx=lineno;
			  rs[rsnum].idy=++y;
		      fprintf(fpout,"%s\t\t%d\t%d\t%d\n","(",36,lineno,rs[rsnum].idy);
		  }
		  else if(ch==')')
		  {

			  arrtemp[0]=ch;arrtemp[1]='\0';
			  strcpy(rs[rsnum].name,arrtemp);
			  strcpy(rs[rsnum].type,"37");
			  rs[rsnum].idx=lineno;
			  rs[rsnum].idy=++y;
		      fprintf(fpout,"%s\t\t%d\t%d\t%d\n",")",37,lineno,rs[rsnum].idy);
		  }
		  else if(ch=='[')
		  {
			  arrtemp[0]=ch;arrtemp[1]='\0';
			  strcpy(rs[rsnum].name,arrtemp);
			  strcpy(rs[rsnum].type,"38");
			  rs[rsnum].idx=lineno;
			  rs[rsnum].idy=++y;
		      fprintf(fpout,"%s\t\t%d\t%d\t%d\n","[",38,lineno,rs[rsnum].idy);
		  }
		  else if(ch==']')
		  {
			  arrtemp[0]=ch;arrtemp[1]='\0';
			  strcpy(rs[rsnum].name,arrtemp);
			  strcpy(rs[rsnum].type,"39");
			  rs[rsnum].idx=lineno;
			  rs[rsnum].idy=++y;
		      fprintf(fpout,"%s\t\t%d\t%d\t%d\n","]",39,lineno,rs[rsnum].idy);
		  }
		  else if(ch=='"')
		  {
			  arrtemp[0]=ch;arrtemp[1]='\0';
			  strcpy(rs[rsnum].name,arrtemp);
			  strcpy(rs[rsnum].type,"40");
			  rs[rsnum].idx=lineno;
			  rs[rsnum].idy=++y;
		      fprintf(fpout,"%s\t\t%d\t%d\t%d\n","”",40,lineno,rs[rsnum].idy);
		  }
		  else if(ch==';')
		  {
			   arrtemp[0]=ch;arrtemp[1]='\0';
			   strcpy(rs[rsnum].name,arrtemp);
			   strcpy(rs[rsnum].type,"41");
			   rs[rsnum].idx=lineno;
			   rs[rsnum].idy=++y;
		       fprintf(fpout,"%s\t\t%d\t%d\t%d\n",";",41,lineno,rs[rsnum].idy);
		  }
		  else if(ch=='=')
		  {
			   arrtemp[0]=ch;arrtemp[1]='\0';
			   strcpy(rs[rsnum].name,arrtemp);
			   strcpy(rs[rsnum].type,"42");
			   rs[rsnum].idx=lineno;
			   rs[rsnum].idy=++y;
		       fprintf(fpout,"%s\t\t%d\t%d\t%d\n","=",42,lineno,rs[rsnum].idy);
		  }
		  else if(ch==',')
		  {
			   arrtemp[0]=ch;arrtemp[1]='\0';
			   strcpy(rs[rsnum].name,arrtemp);
			   strcpy(rs[rsnum].type,"43");
			   rs[rsnum].idx=lineno;
			   rs[rsnum].idy=++y;
		       fprintf(fpout,"%s\t\t%d\t%d\t%d\n",",",43,lineno,rs[rsnum].idy);
		  }
		  else if(ch=='{')
		  {
			   arrtemp[0]=ch;arrtemp[1]='\0';
			   strcpy(rs[rsnum].name,arrtemp);
			   strcpy(rs[rsnum].type,"44");
			   rs[rsnum].idx=lineno;
			   rs[rsnum].idy=++y;
		       fprintf(fpout,"%s\t\t%d\t%d\t%d\n","{",44,lineno,rs[rsnum].idy);
		  }
		  else if(ch=='}')
		  {
			   arrtemp[0]=ch;arrtemp[1]='\0';
			   strcpy(rs[rsnum].name,arrtemp);
			   strcpy(rs[rsnum].type,"45");
			   rs[rsnum].idx=lineno;
			   rs[rsnum].idy=++y;
		       fprintf(fpout,"%s\t\t%d\t%d\t%d\n","}",45,lineno,rs[rsnum].idy);
		  }
		  else
		  {
			  arrtemp[0]=ch;arrtemp[1]='\0';
			  strcpy(rs[rsnum].name,arrtemp);
			  strcpy(rs[rsnum].type,"非法字符");
			  rs[rsnum].idx=lineno;
			  rs[rsnum].idy=++y;
			  fprintf(fpout,"%c\t\t非法\t%d\t%d\n",ch,lineno,rs[rsnum].idy);
		  }
     }
}
void main()
{
	//setcolor(6,12);
         void Analyse(FILE *fpin,FILE *fpout);
	     char filenamein[10];
		 char filenameout[10];
		 setcolor(20,10);
		 cout<<"-------------------------------------------------"<<endl;
		 cout<<"--------------------词法分析器-------------------"<<endl;
		 cout<<"                                                 2004级计算机一班"<<endl;
	     cout<<"                                                 姓名:常振华 学号:20041783"<<endl;
		 //cout<<("直接输入源代码请按1,从文件中读入源代码请按2 \n") ;
		 cout<<"请输入源代码文件名:";
		 cin>>filenamein;
		 cout<<endl;   
		 //scanf("%s",filenamein);
		 printf("请输入保存词法分析结果的文件名:");
		 //cin>>filenameout;
		 scanf("%s",filenameout);
		 FILE* fpin=fopen(filenamein,"r");
		 FILE* fpout=fopen(filenameout,"w");
		 init();
		 cout<<"分析结果如下:"<<endl;
		 setcolor(6,12);
		 cout<<"序号      单词           类型          行列号 "<<endl;
		 setcolor(20,10);
		 Analyse(fpin,fpout);
		 fclose(fpin);
		 fclose(fpout);         
		 for(int i=1;i<=rsnum;i++)
		 {
			 if(rs[i].name!=NULL)
			 {
				cout<<setiosflags(ios::left)<<setw(10)<<i;
				rs[i].listall();
			 }
		}
		 cout<<"end program:  "<<endl;
		 setcolor(6,12);
		 cout<<"分析结束!"<<endl;
}
 

⌨️ 快捷键说明

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