Files
compilateur-l/src/dico.c
2016-03-15 16:02:12 +01:00

102 lines
2.6 KiB
C

#include "dico.h"
int afficheDico = 0;
/*-------------------------------------------------------------------------*/
void entreeFonction(void){
dico.base = dico.sommet;
contexte = C_VARIABLE_LOCALE;
adresseLocaleCourante = 0;
adresseArgumentCourant = 0;
}
/*-------------------------------------------------------------------------*/
void sortieFonction(void){
dico.sommet = dico.base;
dico.base = 0;
contexte = C_VARIABLE_GLOBALE;
}
/*-------------------------------------------------------------------------*/
int ajouteIdentificateur(char *identif, int classe, int type, int adresse, int complement)
{
dico.tab[dico.sommet].identif = strdup(identif);
dico.tab[dico.sommet].classe = classe;
dico.tab[dico.sommet].type = type;
dico.tab[dico.sommet].adresse = adresse;
dico.tab[dico.sommet].complement = complement;
dico.sommet++;
if(dico.sommet == maxDico){
fprintf(stderr, "attention, plus de place dans le dictionnaire des \
identificateurs, augmenter maxDico\n");
exit(1);
}
/* affiche_dico(); */
return dico.sommet - 1;
}
/*-------------------------------------------------------------------------*/
int rechercheExecutable(char *identif)
{
int i;
for(i = dico.sommet - 1; i >= 0; i--){
if(!strcmp(identif, dico.tab[i].identif))
return i;
}
return -1;
}
/*-------------------------------------------------------------------------*/
int rechercheDeclarative(char *identif)
{
int i;
for(i = dico.base; i < dico.sommet; i++){
if(!strcmp(identif, dico.tab[i].identif))
return i;
}
return -1;
}
/*-------------------------------------------------------------------------*/
void affiche_dico(void)
{
if(afficheDico) {
int i;
printf("------------------------------------------\n");
printf("base = %d\n", dico.base);
printf("sommet = %d\n", dico.sommet);
for(i=0; i < dico.sommet; i++){
printf("%d ", i);
printf("%s ", dico.tab[i].identif);
if(dico.tab[i].classe == C_VARIABLE_GLOBALE)
printf("GLOBALE ");
else
if(dico.tab[i].classe == C_VARIABLE_LOCALE)
printf("LOCALE ");
else
if(dico.tab[i].classe == C_ARGUMENT)
printf("ARGUMENT ");
if(dico.tab[i].type == T_ENTIER)
printf("ENTIER ");
else if(dico.tab[i].type == T_TABLEAU_ENTIER)
printf("TABLEAU ");
/* else if(dico.tab[i].type == _ARGUMENT) */
/* printf("ARGUMENT "); */
else if(dico.tab[i].type == T_FONCTION)
printf("FONCTION ");
printf("%d ", dico.tab[i].adresse);
printf("%d\n", dico.tab[i].complement);
}
printf("------------------------------------------\n");
}
}