📄 syn_sem.cpp
字号:
// 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 + -