#include #include #include #include #define ErreurSym 0 #define BeginSym 1 #define EndSym 2 #define ReadSym 3 #define WriteSym 4 #define ID 5 #define INT 6 #define OpPlus 7 #define OpMoins 8 #define OpAffect 9 #define Virgule 10 #define Point_Virgule 11 #define ParenG 12 #define ParenD 13 #define EOFSym 14 int position=4;/*la position des identificateurs dans la table de symboles:les 4 premières places sont dejà prises!!*/ char *tab=(char*)malloc(sizeof(char));/* un token*/ char **tabsymbol=(char**)malloc(sizeof(char*));/*la table de symboles*/ /*rechercher permet de tester l'existence de l'identificateur dans la table de symboles*/ int rechercher(char *token) { for(int h=1;h<=position;h++) { if(stricmp(token,tabsymbol[h])==0)/*permet de comparer les 2 chaines de caracteres passées en argument*/ /* retourne 0 si identiques */ { return 1; } } return 0; } /*inserer permet de stocker les identificateurs dans la table de symboles dans la première position vacante*/ void inserer(char *token,int position) { int l=rechercher(token); if(l==0) { static int indice=position; indice++; printf("%s\n",token); position=indice; printf("non %d\n",position); tabsymbol[position]=token; } } /*fonction principale*/ int GetNextToken(FILE *code) { int lettre;/*un caractere du fichier code*/ int lettre_2; int i=0; int j=1; int k=1; int indicateur=0; int indicateur1=0; int indicateur2=0; /*les 4 premières places de la tabsymbol sont reservées aux mots clés du langage ABJAD*/ tabsymbol[1]="begin"; tabsymbol[2]="end"; tabsymbol[3]="read"; tabsymbol[4]="write"; while((lettre=getc(code))) { if((isspace(lettre))&&(i==0)) continue; if(((lettre==EOF)||(isspace(lettre))||(lettre==',')||(lettre==';')||(lettre=='+')||(lettre==')')||(lettre=='(')||(lettre==':'))&&(i!=0)) { indicateur1=1; ungetc(lettre,code); } else{ if(((lettre==EOF)||(lettre==',')||(lettre==';')||(lettre=='+')||(lettre==')')||(lettre=='(')||(lettre==':')||(lettre=='-'))&&(i==0)) { switch(lettre) { case ')' : return ParenD; case '(' : return ParenG; case '+' : return OpPlus; case ',' : return Virgule; case ';' : return Point_Virgule; case EOF : return EOFSym; case ':' : lettre_2=getc(code); if(lettre_2=='=') return OpAffect; else return ErreurSym; case '-' : lettre_2=getc(code); if(lettre_2=='-') { while(lettre_2!='\n') { lettre_2=getc(code); } continue; } else { ungetc(lettre_2,code); return OpMoins; } } } if(!((isspace(lettre))||(lettre==',')||(lettre==';')||(lettre=='+')||(lettre==')')||(lettre=='(')||(lettre==':'))) indicateur1=0; } if(indicateur1==0) { if(i>32) return ErreurSym; tab[i]=lettre; i++; tab[i]='\0'; indicateur2=0; } else { indicateur2=1; } if((indicateur2==1)) { if((isalpha(tab[0]))) { if(i>1) { while(j1) { while(k