Ajout table_symbole pour les fonctions

This commit is contained in:
2016-03-09 10:52:31 +01:00
parent 634440714c
commit ef3f2bb998
7 changed files with 126 additions and 2 deletions

View File

@@ -251,10 +251,33 @@ void affiche_t_dec(n_dec *n)
void affiche_t_foncDec(n_dec *n)
{
char *fct = "foncDec";
//affiche_t_texte( n->nom, trace_abs );
int i = rechercheExecutable(n->nom);
if( i >= 0) {
printf("Fonction %s déjà déclaré\n", n->nom);
affiche_dico();
exit(1);
}
int id = ajouteIdentificateur(n->nom, contexte, T_FONCTION, 0, -1);
entreeFonction();
contexte = C_ARGUMENT;
affiche_t_l_dec(n->u.foncDec_.param);
int j = 0;
for(int i = dico.sommet - 1; i >= 0; i--){
if(dico.tab[i].classe != C_ARGUMENT)
break;
j++;
}
dico.tab[id].complement = j;
contexte = C_VARIABLE_LOCALE;
affiche_t_l_dec(n->u.foncDec_.variables);
affiche_t_instr(n->u.foncDec_.corps);
affiche_dico();
sortieFonction();
}
/*-------------------------------------------------------------------------*/
@@ -264,6 +287,7 @@ void affiche_t_varDec(n_dec *n)
//affiche_t_element("varDec", n->nom, trace_abs);
if(rechercheDeclarative(n->nom) >= 0) {
printf("Variable %s déjà déclaré\n", n->nom);
affiche_dico();
exit(1);
}
@@ -278,6 +302,7 @@ void affiche_t_varDec(n_dec *n)
adresseArgumentCourant += 4;
} else {
printf("Wtf ? %s\n", n->nom);
affiche_dico();
exit(1);
}
@@ -292,14 +317,16 @@ void affiche_t_tabDec(n_dec *n)
if(rechercheDeclarative(n->nom) >= 0) {
printf("Tableau %s déjà déclaré\n", n->nom);
affiche_dico();
exit(1);
}
if (contexte == C_VARIABLE_GLOBALE) {
ajouteIdentificateur(n->nom, contexte, T_ENTIER, adresseGlobalCourante, n->u.tabDec_.taille);
ajouteIdentificateur(n->nom, contexte, T_TABLEAU_ENTIER, adresseGlobalCourante, n->u.tabDec_.taille);
adresseGlobalCourante += 4*n->u.tabDec_.taille;
} else {
printf("Wtf ? %s\n", n->nom);
affiche_dico();
exit(1);
}
@@ -323,9 +350,11 @@ void affiche_t_var_simple(n_var *n)
int i = rechercheExecutable(n->nom);
if( i < 0) {
printf("Variable %s non déclaré\n", n->nom);
affiche_dico();
exit(1);
} else if (dico.tab[i].type == T_TABLEAU_ENTIER) {
printf("Indice tableau %s est attendu\n", n->nom);
affiche_dico();
exit(1);
}
}
@@ -334,6 +363,18 @@ void affiche_t_var_simple(n_var *n)
void affiche_t_var_indicee(n_var *n)
{
char *fct = "var_indicee";
int i = rechercheExecutable(n->nom);
if( i < 0) {
printf("Tableau %s non déclaré\n", n->nom);
affiche_dico();
exit(1);
} else if (dico.tab[i].type == T_ENTIER) {
printf("%s n'est pas un Tableau\n", n->nom);
affiche_dico();
exit(1);
}
affiche_t_exp( n->u.indicee_.indice );
}
/*-------------------------------------------------------------------------*/