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

📄 lexi.cpp

📁 这是一个完整的词法分析器
💻 CPP
字号:
// Nom Du Fichier      : lexi.cpp// Fonction            : Programmation principale  de  analyseur lexicographe// Cadre               : TP Compilation// Auteurs             : Wei zhou yue// Date                : 12/02/2005#include "lexi.h"void Ensource(){	int i=0;	char c; 	fstream infile(FichierNom);   // Ouvriez le fichier par son nom.	while (infile.get(c))		Str[i++]=c;	Str[i]='\0';}/******************************************************************************************/int Debut_chercher()		// Retirer un caractere dans le buffer.							// si oui alors 1, sinon 0{ 	ch=Str[++pStr];	if (ch=='\0') return(-1);	else return(1);}/*****************************************************************************************/int LireUs(){	bool flag=false;	int k=-1;      	Type_no=0;          Prevtype=0;	while (ch<=32 && ch>0)		Fbuffer=Debut_chercher();	/****************************************************/	// Traiter le caract鑢e erreur	if(ch=='^' || ch=='#')	  {	    Stoker[++k]=ch;	    Fbuffer=Debut_chercher();	    Stoker[++k]='\0';	    Type_no=101;	  }    	/***************************************************/	// Traiter le commentaire	if(ch=='@')	  {	    Stoker[++k]=ch;	    Fbuffer=Debut_chercher();	      while(ch!='@')		{		  Stoker[++k]=ch;		  Fbuffer=Debut_chercher();		}	      Stoker[++k]=ch;	      Fbuffer=Debut_chercher();	      Stoker[++k]='\0';	      Type_no=100;	  }	/**************************************************/	// Traiter le cha頽e de caract鑢e	if(ch=='"')	  {	    Stoker[++k]=ch;	    Fbuffer=Debut_chercher();	    while(ch!='"')	      {		Stoker[++k]=ch;		Fbuffer=Debut_chercher();	      }	    Stoker[++k]=ch;	    Fbuffer=Debut_chercher();	    Stoker[++k]='\0';	    Type_no=17;	  }	      	/**************************************************/	// Traiter le Mot_cle ou l'identificateur	if (ch>='a'&& ch<='z'|| ch>='A'&& ch<='Z')	{		k=-1;		while(true)		{  			if((++k)<Maxlen)			{				Stoker[k]=ch;			}			Fbuffer=Debut_chercher();			if  (!(ch>='a'&& ch<='z'|| ch>='A'&& ch<='Z'||ch>='0' && ch<='9'))				break; 		}		Stoker[++k]='\0';		int i;		for (i=0;i<Motcle_No;i++)			if (strcmp(Stoker,MOTCLE[i])==0)			{				flag=true;				break;			}			if(flag)				Type_no=i+1;			else Type_no=16;  	}      		/**************************************************/	// Traiter Enti鑢e et R閑l	else if (ch>='0' && ch<='9')	{  		Stoker[++k]=ch;		Fbuffer=Debut_chercher();		while(true)		{			while(ch>='0' && ch<='9')			{				Stoker[++k]=ch;				Fbuffer=Debut_chercher();			}			if(ch!='.')			{				Type_no=20;				break;			}			else			{				Stoker[++k]=ch;				Fbuffer=Debut_chercher();				while(ch>='0' && ch<='9')				{					Stoker[++k]=ch;					Fbuffer=Debut_chercher();				}				Type_no=19;				break;			}		}		Stoker[++k]='\0';	}	else if (ch=='.')	{  		Stoker[++k]=ch;		Fbuffer=Debut_chercher();		while(true)		{			if(ch=='.')			{				Type_no=1000;				break;			}			else			{				while(ch>='0' && ch<='9')				{					Stoker[++k]=ch;					Fbuffer=Debut_chercher();				}					Type_no=19;					break;					}		}		Stoker[++k]='\0';	}        /***************************************************************/	// Traiter le Signsymbole	else if (ch=='+' || ch=='-' || ch=='*' || ch=='/'|| ch=='>'||ch=='<'||ch=='='||ch=='!')	{    		Stoker[++k]=ch;		Fbuffer=Debut_chercher();		if( ch=='=')		{ 		   Stoker[++k]=ch;		   Fbuffer=Debut_chercher();		}                if(ch=='+')		{		  Stoker[++k]=ch;		  Fbuffer=Debut_chercher();                  if(ch=='+')		    Stoker[++k]='\0';		}                                if(ch=='-')		{		  Stoker[++k]=ch;		  Fbuffer=Debut_chercher();                  if(ch=='-')		    Stoker[++k]='\0';		}		Stoker[++k]='\0';		int i;		for (i=0;i<Signsymbole_No;i++)			if (strcmp(SIGNSYMBOLE[i],Stoker)==0) 			{				flag=true;				break;			}			if(flag)				Type_no=i+21; 		}	/***************************************************************/	// Traiter le Limitsymbole	else if (ch=='('||ch==')'||ch=='['||ch==']'||ch=='{'||ch=='}'||ch==','||ch==':'||ch==';')	{   		Stoker[++k]=ch;		Stoker[++k]='\0';		int i;		for (i=0;i<Limitsymbole_No;i++)		     if (strcmp(Stoker,LIMITSYMBOLE[i])==0)			 {				 flag=true;				 break;			 }			 if(flag)				 Type_no=i+34;			 Fbuffer=Debut_chercher();	}	return(Type_no);}/*************************************************************************/int main(){	FILE *fp,*fp1;	int n=100;	cout<<"Entrez le nom du fichier,S'il vous plait: "<<endl;	cin.getline(FichierNom,n);	fp=fopen(FichierNom,"r");	while (fp==NULL)	{		cout<<"Pardon,Le fichier n'est existe!"<<endl;		cout<<"Entrez un autre nom du fichier: "<<endl;		cin.getline(FichierNom,n);		fp=fopen(FichierNom,"r");	}	if((fp1=fopen("outfile.txt","w"))==NULL)	{		printf("can not open outfile\n");		return -1;	}	Ensource();	fclose(fp);	cout<<endl;	Debut_chercher();	Fbuffer=1;	while(Fbuffer!=-1)	{ 		Type_no=LireUs();		if(Type_no!=0)		{			if(Type_no>=1 && Type_no<=15)			{				cout<<"MOT_CLE: ";				cout<<"("<<Type_no+0<<",";				cout<<"\""<<Stoker<<"\"";				cout<<")"<<endl;				fprintf(fp1,"%d%s%s\n", Type_no,"  MOT_CLE: ",Stoker);			}			else if(Type_no==100)                          {				cout<<"COMMENTAIRE: ";				cout<<"("<<Type_no+0<<",";				cout<<"\""<<Stoker<<"\"";				cout<<")"<<endl;				fprintf(fp1,"%d%s%s\n", Type_no,"  COMMENTAIRE: ",Stoker);			} 			else if(Type_no==101)			  {			        cout<<"Erreur: ";			    	cout<<"("<<Type_no+0<<",";				cout<<"\""<<Stoker<<"\"";				cout<<")"<<endl;				fprintf(fp1,"%d%s%s\n", Type_no,"  ERREUR: ",Stoker);			  }			else if(Type_no==16)			{				cout<<"IDENTIFICATEUR: ";				cout<<"("<<Type_no+0<<",";				cout<<"\""<<Stoker<<"\"";				cout<<")"<<endl;				fprintf(fp1,"%d%s%s\n", Type_no,"  IDENTIFICATEUR: ",Stoker);			}	        	else if(Type_no==17)			{				cout<<"CHAINE DE CARACTERE: ";				cout<<"("<<Type_no+0<<",";				cout<<"\""<<Stoker<<"\"";				cout<<")"<<endl;				fprintf(fp1,"%d%s%s\n", Type_no,"  CHAINE DE CARACTERE: ",Stoker);			}                        else if(Type_no==19)			{				cout<<"REEL: ";				cout<<"("<<Type_no+0<<",";				cout<<"\""<<Stoker<<"\"";				cout<<")"<<endl;				fprintf(fp1,"%d%s%s\n", Type_no,"  REEL: ",Stoker);			}			else if(Type_no==20)			{				cout<<"ENTIER: ";				cout<<"("<<Type_no+0<<",";				cout<<"\""<<Stoker<<"\"";				cout<<")"<<endl;			        fprintf(fp1,"%d%s%s\n", Type_no,"  ENTIER: ",Stoker);			}			else			{					cout<<"SYMBOLE: ";				cout<<"("<<Type_no+0<<",";				cout<<"\""<<Stoker<<"\"";				cout<<")"<<endl;			       	fprintf(fp1,"%d%s%s\n", Type_no,"  SYMBOLE: ",Stoker);			}		}	}			cout<<'\n';		return  0;}

⌨️ 快捷键说明

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