a corriger

This commit is contained in:
sylvain099
2016-03-19 23:54:45 +01:00
parent 876044dc6a
commit 968a48028c
2 changed files with 49 additions and 36 deletions

View File

@@ -17,21 +17,21 @@ void parcours_instr_affect(n_instr *n);
void parcours_instr_appel(n_instr *n); void parcours_instr_appel(n_instr *n);
void parcours_instr_retour(n_instr *n); void parcours_instr_retour(n_instr *n);
void parcours_instr_ecrire(n_instr *n); void parcours_instr_ecrire(n_instr *n);
void parcours_l_exp(n_l_exp *n); int parcours_l_exp(n_l_exp *n);
int parcours_exp(n_exp *n); char* parcours_exp(n_exp *n);
int parcours_varExp(n_exp *n); char* parcours_varExp(n_exp *n);
int parcours_opExp(n_exp *n); char* parcours_opExp(n_exp *n);
int parcours_intExp(n_exp *n); char* parcours_intExp(n_exp *n);
int parcours_lireExp(n_exp *n); char* parcours_lireExp(n_exp *n);
int parcours_appelExp(n_exp *n); char* parcours_appelExp(n_exp *n);
void parcours_l_dec(n_l_dec *n); void parcours_l_dec(n_l_dec *n);
void parcours_dec(n_dec *n); void parcours_dec(n_dec *n);
void parcours_foncDec(n_dec *n); void parcours_foncDec(n_dec *n);
void parcours_varDec(n_dec *n); void parcours_varDec(n_dec *n);
void parcours_tabDec(n_dec *n); void parcours_tabDec(n_dec *n);
void parcours_var(n_var *n); char* parcours_var(n_var *n);
void parcours_var_simple(n_var *n); char* parcours_var_simple(n_var *n);
void parcours_var_indicee(n_var *n); char* parcours_var_indicee(n_var *n);
void parcours_appel(n_appel *n); void parcours_appel(n_appel *n);
#endif #endif

View File

@@ -3,6 +3,7 @@
#include "syntabs.h" #include "syntabs.h"
#include "util.h" #include "util.h"
#include "parcours.h" #include "parcours.h"
#define is_num(c)(('0' <= (c)) && ((c) <= '9'))
int contexte = C_VARIABLE_GLOBALE; int contexte = C_VARIABLE_GLOBALE;
int adresseGlobalCourante = 0; 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) {
if(n->type == blocInst) parcours_l_instr(n->u.liste); 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) void parcours_instr_affect(n_instr *n)
{ {
parcours_var(n->u.affecte_.var); char * name = parcours_var(n->u.affecte_.var);
parcours_exp(n->u.affecte_.exp); 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(); affiche_dico();
exit(1); exit(1);
} }
int nbArg = parcours_l_exp(n->args); int nbArg = parcours_l_exp(n->args);
if(dico.tab[id].complement != nbArg) { if(dico.tab[id].complement != nbArg) {
printf("Nombre Argument différent pour l'appel à %s\n", n->fonction); 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) 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]; char tmp[250];
sprintf(tmp, "move $a0 $t%d", tRegistre); sprintf(tmp, "move $a0, %s", name);
printMips(tmp); printMips(tmp);
printMips("li $v0 1"); 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); if(n->type == varExp) return parcours_varExp(n);
else if(n->type == opExp) return parcours_opExp(n); else if(n->type == opExp) return parcours_opExp(n);
else if(n->type == intExp) return parcours_intExp(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 char *texte = malloc (sizeof (char) * 256); // Max. 50 chiffres
sprintf(texte, "%d", n->u.entier); 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("li $v0 5");
printMips("systcall"); printMips("syscall");
int iRegistre = newReg(); int iRegistre = newReg();
char tmp[250]; char tmp[250];
sprintf(tmp, "move $t%d $a0", iRegistre); sprintf(tmp, "move $t%d $a0", iRegistre);
printMips(tmp); 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); 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) { if(n->type == simple) {
parcours_var_simple(n); return parcours_var_simple(n);
} }
else if(n->type == indicee) { 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); int i = rechercheExecutable(n->nom);
if( i < 0) { if( i < 0) {
@@ -359,10 +367,14 @@ void parcours_var_simple(n_var *n)
affiche_dico(); affiche_dico();
exit(1); 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); int i = rechercheExecutable(n->nom);
if( i < 0) { if( i < 0) {
@@ -376,5 +388,6 @@ void parcours_var_indicee(n_var *n)
} }
parcours_exp( n->u.indicee_.indice ); parcours_exp( n->u.indicee_.indice );
return n->nom;
} }
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/