diff --git a/header/parcours.h b/header/parcours.h index bedd06d..c335b33 100644 --- a/header/parcours.h +++ b/header/parcours.h @@ -17,21 +17,21 @@ void parcours_instr_affect(n_instr *n); void parcours_instr_appel(n_instr *n); void parcours_instr_retour(n_instr *n); void parcours_instr_ecrire(n_instr *n); -void parcours_l_exp(n_l_exp *n); -int parcours_exp(n_exp *n); -int parcours_varExp(n_exp *n); -int parcours_opExp(n_exp *n); -int parcours_intExp(n_exp *n); -int parcours_lireExp(n_exp *n); -int parcours_appelExp(n_exp *n); +int parcours_l_exp(n_l_exp *n); +char* parcours_exp(n_exp *n); +char* parcours_varExp(n_exp *n); +char* parcours_opExp(n_exp *n); +char* parcours_intExp(n_exp *n); +char* parcours_lireExp(n_exp *n); +char* parcours_appelExp(n_exp *n); void parcours_l_dec(n_l_dec *n); void parcours_dec(n_dec *n); void parcours_foncDec(n_dec *n); void parcours_varDec(n_dec *n); void parcours_tabDec(n_dec *n); -void parcours_var(n_var *n); -void parcours_var_simple(n_var *n); -void parcours_var_indicee(n_var *n); +char* parcours_var(n_var *n); +char* parcours_var_simple(n_var *n); +char* parcours_var_indicee(n_var *n); void parcours_appel(n_appel *n); #endif diff --git a/src/parcours.c b/src/parcours.c index c56922b..affbb3c 100644 --- a/src/parcours.c +++ b/src/parcours.c @@ -3,6 +3,7 @@ #include "syntabs.h" #include "util.h" #include "parcours.h" +#define is_num(c)(('0' <= (c)) && ((c) <= '9')) int contexte = C_VARIABLE_GLOBALE; int adresseGlobalCourante = 0; @@ -50,7 +51,7 @@ void parcours_l_instr(n_l_instr *n) /*-------------------------------------------------------------------------*/ -int parcours_instr(n_instr *n) +void parcours_instr(n_instr *n) { if(n) { if(n->type == blocInst) parcours_l_instr(n->u.liste); @@ -106,8 +107,12 @@ void parcours_instr_pour(n_instr *n) void parcours_instr_affect(n_instr *n) { - parcours_var(n->u.affecte_.var); - parcours_exp(n->u.affecte_.exp); + char * name = parcours_var(n->u.affecte_.var); + char * tRegistre = parcours_exp(n->u.affecte_.exp); + char tmp[250]; + sprintf(tmp,"sw %s, %s ", tRegistre,name); + + printMips(tmp); } /*-------------------------------------------------------------------------*/ @@ -126,7 +131,6 @@ void parcours_appel(n_appel *n) affiche_dico(); exit(1); } - int nbArg = parcours_l_exp(n->args); if(dico.tab[id].complement != nbArg) { printf("Nombre Argument différent pour l'appel à %s\n", n->fonction); @@ -143,15 +147,15 @@ void parcours_instr_retour(n_instr *n) } /*-------------------------------------------------------------------------*/ - void parcours_instr_ecrire(n_instr *n) { - int tRegistre = parcours_exp(n->u.ecrire_.expression); + char* name = parcours_exp(n->u.ecrire_.expression); + char tmp[250]; - sprintf(tmp, "move $a0 $t%d", tRegistre); + sprintf(tmp, "move $a0, %s", name); printMips(tmp); printMips("li $v0 1"); - printMips("systcall"); + printMips("syscall"); } /*-------------------------------------------------------------------------*/ @@ -167,9 +171,8 @@ int parcours_l_exp(n_l_exp *n) /*-------------------------------------------------------------------------*/ -int parcours_exp(n_exp *n) +char* parcours_exp(n_exp *n) { - if(n->type == varExp) return parcours_varExp(n); else if(n->type == opExp) return parcours_opExp(n); else if(n->type == intExp) return parcours_intExp(n); @@ -179,40 +182,45 @@ int parcours_exp(n_exp *n) /*-------------------------------------------------------------------------*/ -int parcours_varExp(n_exp *n) +char* parcours_varExp(n_exp *n) { - parcours_var(n->u.var); + return parcours_var(n->u.var); } /*-------------------------------------------------------------------------*/ -int parcours_opExp(n_exp *n) +char* parcours_opExp(n_exp *n) { - + } /*-------------------------------------------------------------------------*/ -int parcours_intExp(n_exp *n) +char* parcours_intExp(n_exp *n) { - char texte[ 50 ]; // Max. 50 chiffres - sprintf(texte, "%d", n->u.entier); + char *texte = malloc (sizeof (char) * 256); // Max. 50 chiffres + int iRegistre = newReg(); + sprintf(texte, "li $t%d, %d",iRegistre, n->u.entier); + printMips(texte); + sprintf(texte,"$t%d",iRegistre); + return texte; } /*-------------------------------------------------------------------------*/ -int parcours_lireExp(n_exp *n) +char* parcours_lireExp(n_exp *n) { printMips("li $v0 5"); - printMips("systcall"); + printMips("syscall"); int iRegistre = newReg(); char tmp[250]; sprintf(tmp, "move $t%d $a0", iRegistre); printMips(tmp); - return iRegistre; + sprintf(tmp, "$t%d",iRegistre); + return tmp; } /*-------------------------------------------------------------------------*/ -int parcours_appelExp(n_exp *n) +char* parcours_appelExp(n_exp *n) { parcours_appel(n->u.appel); } @@ -336,18 +344,18 @@ void parcours_tabDec(n_dec *n) /*-------------------------------------------------------------------------*/ -void parcours_var(n_var *n) +char* parcours_var(n_var *n) { if(n->type == simple) { - parcours_var_simple(n); + return parcours_var_simple(n); } else if(n->type == indicee) { - parcours_var_indicee(n); + return parcours_var_indicee(n); } } /*-------------------------------------------------------------------------*/ -void parcours_var_simple(n_var *n) +char* parcours_var_simple(n_var *n) { int i = rechercheExecutable(n->nom); if( i < 0) { @@ -359,10 +367,14 @@ void parcours_var_simple(n_var *n) affiche_dico(); exit(1); } + ///TODOOOOOOOOOOO + char *tmp = malloc (sizeof (char) * 256); + sprintf(tmp,"$%s",n->nom); + return tmp; } /*-------------------------------------------------------------------------*/ -void parcours_var_indicee(n_var *n) +char* parcours_var_indicee(n_var *n) { int i = rechercheExecutable(n->nom); if( i < 0) { @@ -376,5 +388,6 @@ void parcours_var_indicee(n_var *n) } parcours_exp( n->u.indicee_.indice ); + return n->nom; } /*-------------------------------------------------------------------------*/