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

📄 syn_sem.cpp

📁 这是一个完整的词法分析器
💻 CPP
📖 第 1 页 / 共 2 页
字号:


// Nom Du Fichier		: syn_sem.cpp
// Fonction				: Programmation Principale de analyseur syntaxique et sementique
// Cadre				: TP Compilation
// Auteurs				: Wei zhouyue
// Date					: 15/03/2005

#include "syn_sem.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);
}

/*************************************************************************/
/*					      FUNCTION LEXICOGRAPHE                          */
/*************************************************************************/

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=44;
	  }
	      

	/******************************************************/
	// 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=43;  
	}      
	
	/******************************************************/
	// 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=46;
				break;
			}
			else
			{
				Stoker[++k]=ch;
				Fbuffer=Debut_chercher();
				while(ch>='0' && ch<='9')
				{
					Stoker[++k]=ch;
					Fbuffer=Debut_chercher();
				}
				Type_no=45;
				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=45;
					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();
	}
	nb_ligne();
	return(Type_no);
}

void nb_ligne()
{
	if(Type_no==1 || Type_no==4 || Type_no==7 || Type_no==9 || Type_no==5 || Type_no==42 || Type_no==100)
	{
		no_ligne=no_ligne+1;
	}
	else 
	{
		no_ligne=no_ligne;
	}
}

/*************************************************************************/
/*					      FUNCTIONS SYNTAXIQUE	                         */
/*************************************************************************/

void programme()
{
		Type_no=LireUs();
		while(Type_no==100)
		{
			Type_no=LireUs();
		}
		if(Type_no==1)
		{
			Type_no=LireUs();
			while(Type_no==100)
			{
				Type_no=LireUs();
			}
			liste_instructions();
			if(Type_no==2)
			{ 			
				cout<<"Ce programme est bon!"<<endl;
			}
			else
			{
				Erreur=true;
				cout<<"Il manque un 'Fin' a la fin du programme."<<endl;
			}
		}
		else
		{
			Erreur=true;
			cout<<"manque un 'Debut' au debut du programme."<<endl;
			cout<<"Ce programme n'est pas bon."<<endl;
		}
}

void liste_instructions()
{
	instruction();
	if(Type_no==42)
	{
		Type_no=LireUs();
		while(Type_no==100)
		{
			Type_no=LireUs();
		}
		suite_instructions();
	}
	else
	{
		Erreur=true;
		cout<<no_ligne<<": ";
		cout<<"Il manque un ';' a la fin d''une instruction."<<endl;
		exit(-1);
	}
}

void instruction()
{
	switch(Type_no)
	{
		case 43:
			affectation();
			break;
		case 3:
			conditionnelle();
			break;
		case 7:
			iteration();
			break;
		case 8:
			iteration();
			break;
		case 11:
			iteration();
			break;
		default:
			Erreur=true;
			cout<<no_ligne<<": ";
			cout<<"On ne reconnait pas une instruction."<<endl;
			exit(-1);
	}
}

void suite_instructions()
{
	if(Type_no!=2 && Type_no!=5 && Type_no!=6 && Type_no!=10 && Type_no!=12 && Type_no!=15 && Type_no!=0)
	{
		switch(Type_no)
		{
			case 43:
				liste_instructions();
				break;
			case 3:
				liste_instructions();
				break;
			case 7:
				liste_instructions();
				break;
			case 8:
				liste_instructions();
				break;
			case 11:
				liste_instructions();
				break;
			case 16:
				liste_instructions();
				break;
			case 17:
				liste_instructions();
				break;
			default:
				Erreur=true;
				cout<<no_ligne<<": ";
				cout<<"On ne reconnait pas une instruction."<<endl;
				exit(-1);
		}
	}
}

void affectation()
{
	if(Type_no==43)
	{
		Type_no=LireUs();
		if(Type_no==21)
		{
			Type_no=LireUs();
			ea();
		}
		else
		{
			Erreur=true;
			cout<<no_ligne<<": ";
			cout<<"Il manque un '=' dans une affectation."<<endl;
			exit(-1);
		}
	}
	else
	{
		Erreur=true;
		cout<<no_ligne<<": ";
		cout<<"Il manque un identificateur au debut d''une affectation."<<endl;
		exit(-1);
	}
}

void conditionnelle()
{
	if(Type_no==3)
	{
		Type_no=LireUs();
		condition();
		if(Type_no==4)
		{
			Type_no=LireUs();
			liste_instructions();
			suite_conditionnelle();
		}
		else
		{
			Erreur=true;
			cout<<no_ligne<<": ";
			cout<<"Il manque un 'Alors' dans une instruction conditionnelle."<<endl;
			exit(-1);
		}
	}
	else
	{
		Erreur=true;
		cout<<Stoker<<endl;
		cout<<"Il manque un 'Si' au debut d''une instruction conditionnelle."<<endl;
		exit(-1);
	}
}

void iteration()
{
	switch(Type_no)
	{
		case 7:
				if(Type_no==7)
				{
					Type_no=LireUs();
					liste_instructions();
					if(Type_no==12)
					{
						Type_no=LireUs();
						condition();
					}
					else
					{
						Erreur=true;
						cout<<no_ligne<<": ";
						cout<<"Il manque un 'Jusqua' dans une iteration."<<endl;
						exit(-1);
					}
				}
				else
				{
					Erreur=true;
					cout<<no_ligne<<": ";
					cout<<"Il manque un 'Repeter' dans une iteration."<<endl;
					exit(-1);
				}
				break;
		case 8:
				if(Type_no==8)
				{
					Type_no=LireUs();
					condition();
					if(Type_no==9)
					{
						Type_no=LireUs();
						liste_instructions();
						if(Type_no==10)
						{
							Type_no=LireUs();
						}
						else
						{
							Erreur=true;
							cout<<no_ligne<<": ";
							cout<<"Il manque un 'Fintantque' dans une iteration."<<endl;
							exit(-1);
						}
					}
					else
					{
						Erreur=true;
						cout<<no_ligne<<": ";
						cout<<"Il manque un 'Faire' dans une iteration."<<endl;
						exit(-1);
					}
				}
				else
				{
					Erreur=true;
					cout<<no_ligne<<": ";
					cout<<"Il manque un 'Tantque' dans une iteration."<<endl;
					exit(-1);
				}
				break;
		case 11:
				if(Type_no==11)
				{
					Type_no=LireUs();
					if(Type_no==43)
					{
						Type_no=LireUs();
						if(Type_no==13)
						{
							Type_no=LireUs();
							ea();
							if(Type_no==14)
							{
								Type_no=LireUs();
								ea();
								if(Type_no==9)
								{
									Type_no=LireUs();
									liste_instructions();
									if(Type_no==15)
									{
										Type_no=LireUs();
									}
									else
									{
										Erreur=true;
										cout<<no_ligne<<": ";
										cout<<"Il manque un 'Finpour' dans une iteration."<<endl;
										exit(-1);
									}
								}
								else
								{
									Erreur=true;
									cout<<no_ligne<<": ";
									cout<<"Il manque un 'Faire' dans une iteration."<<endl;
									exit(-1);
								}
							}
							else
							{
								Erreur=true;
								cout<<no_ligne<<": ";
								cout<<"Il manque un 'A' dans une iteration."<<endl;
								exit(-1);
							}
						}
						else
						{
							Erreur=true;
							cout<<no_ligne<<": ";
							cout<<"Il manque un 'De' dans une iteration."<<endl;
							exit(-1);
						}
					}
					else
					{
						Erreur=true;
						cout<<no_ligne<<": ";
						cout<<"Il manque un identificateur dans une iteration."<<endl;
						exit(-1);
					}
				}
				else
				{
					Erreur=true;
					cout<<no_ligne<<": ";
					cout<<"Il manque un 'Pour' dans une iteration."<<endl;
					exit(-1);
				}
				break;
		default:
			Erreur=true;
			cout<<no_ligne<<": ";
			cout<<"On ne reconnait pas une iteration."<<endl;
			exit(-1);
		}
}

void suite_conditionnelle()
{
	switch(Type_no)
	{
		case 6:
			if(Type_no==6)
			{
				Type_no=LireUs();
			}
			else
			{
				Erreur=true;
				cout<<no_ligne<<": ";
				cout<<"Il manque un 'Finsi' a la fin d''une instruction conditionnelle."<<endl;
				exit(-1);
			}
			break;
		case 5:
			if(Type_no==5)
			{
				Type_no=LireUs();
				liste_instructions();
				if(Type_no==6)
				{
					Type_no=LireUs();
				}
				else
				{
					Erreur=true;
					cout<<no_ligne<<": ";
					cout<<"Il manque un 'Finsi' a la fin d''une instruction conditionnelle."<<endl;

⌨️ 快捷键说明

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