Resolv many bugs
This commit is contained in:
143
src/parcours.c
143
src/parcours.c
@@ -44,7 +44,7 @@ void finFunc() {
|
||||
|
||||
void empile(char *reg) {
|
||||
if(afficheMips) {
|
||||
printf("subu $sp, $sp, 4\n");
|
||||
printf("subi $sp, $sp, 4\n");
|
||||
printf("sw %s, 0($sp)\n", reg);
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,7 @@ void empile(char *reg) {
|
||||
void depile(char *reg) {
|
||||
if(afficheMips) {
|
||||
printf("lw %s, 0($sp)\n", reg);
|
||||
printf("addu $sp, $sp, 4\n");
|
||||
printf("addi $sp, $sp, 4\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,25 +110,33 @@ void parcours_instr(n_instr *n)
|
||||
void parcours_instr_si(n_instr *n)
|
||||
{
|
||||
parcours_exp(n->u.si_.test);
|
||||
int iRegistre = newReg();
|
||||
int iRegistre = 0;
|
||||
char tmp[250];
|
||||
char registre[250];
|
||||
char faux[256];
|
||||
char suite[256];
|
||||
|
||||
new_tag(faux);
|
||||
new_tag(suite);
|
||||
|
||||
sprintf(registre,"$t%d",iRegistre);
|
||||
depile(registre);
|
||||
char faux[256];
|
||||
new_tag(faux);
|
||||
char suite[256];
|
||||
new_tag(suite);
|
||||
|
||||
sprintf(tmp,"beq %s $0 %s", registre,faux);
|
||||
printMips(tmp);
|
||||
|
||||
parcours_instr(n->u.si_.alors);
|
||||
|
||||
sprintf(tmp,"j %s",suite);
|
||||
printMips(tmp);
|
||||
|
||||
sprintf(tmp,"%s:",faux);
|
||||
printMips(tmp);
|
||||
|
||||
if(n->u.si_.sinon){
|
||||
parcours_instr(n->u.si_.sinon);
|
||||
}
|
||||
|
||||
sprintf(tmp,"%s:",suite);
|
||||
printMips(tmp);
|
||||
}
|
||||
@@ -139,21 +147,25 @@ void parcours_instr_tantque(n_instr *n)
|
||||
{
|
||||
char tmp[256];
|
||||
char etiquette[256];
|
||||
char fin[256];
|
||||
char registre[250];
|
||||
|
||||
new_tag(etiquette);
|
||||
new_tag(fin);
|
||||
|
||||
sprintf(tmp,"%s:",etiquette);
|
||||
printMips(tmp);
|
||||
|
||||
char fin[256];
|
||||
new_tag(fin);
|
||||
parcours_exp(n->u.tantque_.test);
|
||||
int iRegistre = newReg();
|
||||
|
||||
char registre[250];
|
||||
int iRegistre = 0;
|
||||
sprintf(registre,"$t%d",iRegistre);
|
||||
depile(registre);
|
||||
sprintf(tmp,"beq %s $0 %s", registre,fin);
|
||||
printMips(tmp);
|
||||
|
||||
parcours_instr(n->u.tantque_.faire);
|
||||
|
||||
sprintf(tmp,"j %s",etiquette);
|
||||
printMips(tmp);
|
||||
sprintf(tmp,"%s:",fin);
|
||||
@@ -176,24 +188,25 @@ void parcours_instr_pour(n_instr *n)
|
||||
{
|
||||
parcours_instr(n->u.pour_.init);
|
||||
char tmp[250];
|
||||
|
||||
char etiquette[256];
|
||||
new_tag(etiquette);
|
||||
char fin[256];
|
||||
char registre[250];
|
||||
|
||||
new_tag(etiquette);
|
||||
new_tag(fin);
|
||||
|
||||
sprintf(tmp,"%s:",etiquette);
|
||||
printMips(tmp);
|
||||
|
||||
parcours_exp(n->u.pour_.test);
|
||||
|
||||
int iRegistre = newReg();
|
||||
char registre[250];
|
||||
int iRegistre = 0;
|
||||
sprintf(registre,"$t%d",iRegistre);
|
||||
depile(registre);
|
||||
sprintf(tmp,"beq %s $0 %s", registre,fin);
|
||||
sprintf(tmp,"beq %s $zero %s", registre, fin);
|
||||
printMips(tmp);
|
||||
parcours_instr(n->u.pour_.faire);
|
||||
|
||||
parcours_instr(n->u.pour_.faire);
|
||||
parcours_instr(n->u.pour_.incr);
|
||||
|
||||
sprintf(tmp,"%s:",fin);
|
||||
@@ -205,14 +218,16 @@ void parcours_instr_pour(n_instr *n)
|
||||
void parcours_instr_affect(n_instr *n)
|
||||
{
|
||||
char var[256];
|
||||
parcours_var(n->u.affecte_.var,&var);
|
||||
parcours_exp(n->u.affecte_.exp);
|
||||
int iRegistre = newReg();
|
||||
char tmp[250];
|
||||
char registre[250];
|
||||
|
||||
parcours_var(n->u.affecte_.var,var);
|
||||
parcours_exp(n->u.affecte_.exp);
|
||||
|
||||
int iRegistre = 0;
|
||||
sprintf(registre,"$t%d",iRegistre);
|
||||
depile(registre);
|
||||
sprintf(tmp,"sw $t%d, %s ",iRegistre, var);
|
||||
sprintf(tmp,"sw %s, %s",registre, var);
|
||||
printMips(tmp);
|
||||
}
|
||||
|
||||
@@ -226,25 +241,32 @@ void parcours_instr_appel(n_instr *n)
|
||||
|
||||
void parcours_appel(n_appel *n)
|
||||
{
|
||||
char tmp[250];
|
||||
|
||||
int id = rechercheExecutable(n->fonction);
|
||||
if(id < 0) {
|
||||
printf("Fonction %s introuvable\n", n->fonction);
|
||||
affiche_dico();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printMips("subu $sp, $sp, 4 #Val Retour");
|
||||
|
||||
int nbArg = parcours_l_exp(n->args);
|
||||
printMips("subu $sp, $sp, 4");
|
||||
|
||||
|
||||
if(dico.tab[id].complement != nbArg) {
|
||||
printf("Nombre Argument différent pour l'appel à %s\n", n->fonction);
|
||||
affiche_dico();
|
||||
exit(1);
|
||||
}
|
||||
char tmp[250];
|
||||
int i = nbArg;
|
||||
while(i < 1){
|
||||
printMips("subu $sp, $sp, 4");
|
||||
|
||||
/*int i = nbArg;
|
||||
while(i > 0){
|
||||
printMips("subu $sp, $sp, 4 #Val Argument");
|
||||
--i;
|
||||
}
|
||||
} */
|
||||
|
||||
sprintf(tmp,"jal %s",n->fonction);
|
||||
printMips(tmp);
|
||||
}
|
||||
@@ -253,14 +275,16 @@ void parcours_appel(n_appel *n)
|
||||
|
||||
void parcours_instr_retour(n_instr *n)
|
||||
{
|
||||
parcours_exp(n->u.retour_.expression);
|
||||
int iRegistre;
|
||||
char tmp[250];
|
||||
int nbArg = 2; ///TO DOOOOOOOOOOO
|
||||
char exec[250];
|
||||
int returnAdress = 4 * (nbArg + 1);
|
||||
|
||||
parcours_exp(n->u.retour_.expression);
|
||||
|
||||
int iRegistre = 0;
|
||||
sprintf(tmp,"$t%d",iRegistre);
|
||||
depile(tmp);
|
||||
int nbArg = 2; ///TO DOOOOOOOOOOO
|
||||
int returnAdress = 4 * (nbArg + 1);
|
||||
char exec[250];
|
||||
sprintf(exec,"sw %s %d($fp) ",tmp , returnAdress);
|
||||
printMips(exec);
|
||||
finFunc();
|
||||
@@ -270,9 +294,10 @@ void parcours_instr_retour(n_instr *n)
|
||||
void parcours_instr_ecrire(n_instr *n)
|
||||
{
|
||||
parcours_exp(n->u.ecrire_.expression);
|
||||
|
||||
char tmp[250];
|
||||
int iRegistre;
|
||||
iRegistre = newReg();
|
||||
int iRegistre = 0;
|
||||
|
||||
sprintf(tmp,"$t%d",iRegistre);
|
||||
depile(tmp);
|
||||
sprintf(tmp, "move $a0, $t%d",iRegistre);
|
||||
@@ -311,9 +336,11 @@ void parcours_exp(n_exp *n)
|
||||
void parcours_varExp(n_exp *n)
|
||||
{
|
||||
char var[256];
|
||||
parcours_var(n->u.var, &var);
|
||||
char tmp[256];
|
||||
int iRegistre = newReg();
|
||||
|
||||
parcours_var(n->u.var, var);
|
||||
|
||||
int iRegistre = 0;
|
||||
sprintf(tmp, "lw $t%d, %s", iRegistre, var);
|
||||
printMips(tmp);
|
||||
sprintf(tmp, "$t%d", iRegistre);
|
||||
@@ -323,18 +350,19 @@ void parcours_varExp(n_exp *n)
|
||||
/*-------------------------------------------------------------------------*/
|
||||
void parcours_opExp(n_exp *n)
|
||||
{
|
||||
int iRegistre = newReg();
|
||||
int iRegistre2 = newReg();
|
||||
int iRegistre3 = newReg();
|
||||
char tmp[256];
|
||||
|
||||
int iRegistre = 0;
|
||||
int iRegistre2 = 1;
|
||||
int iRegistre3 = 2;
|
||||
|
||||
parcours_exp(n->u.opExp_.op1);
|
||||
if(n->u.opExp_.op2 != NULL)
|
||||
parcours_exp(n->u.opExp_.op2);
|
||||
|
||||
char tmp[256];
|
||||
|
||||
sprintf(tmp, "$t%d", iRegistre3);
|
||||
depile(tmp);
|
||||
|
||||
if(n->u.opExp_.op != non){
|
||||
sprintf(tmp, "$t%d", iRegistre2);
|
||||
depile(tmp);
|
||||
@@ -367,8 +395,7 @@ void parcours_opExp(n_exp *n)
|
||||
printMips(tmp);
|
||||
sprintf(tmp,"%s:", etiquette);
|
||||
printMips(tmp);
|
||||
|
||||
} else if(n->u.opExp_.op == diff) {
|
||||
} else if(n->u.opExp_.op == diff) {
|
||||
char etiquette[256];
|
||||
new_tag(etiquette);
|
||||
sprintf(tmp,"li $t%d, 0",iRegistre);
|
||||
@@ -379,7 +406,7 @@ void parcours_opExp(n_exp *n)
|
||||
printMips(tmp);
|
||||
sprintf(tmp,"%s:", etiquette);
|
||||
printMips(tmp);
|
||||
}else if(n->u.opExp_.op == inf){
|
||||
}else if(n->u.opExp_.op == inf){
|
||||
char etiquette[256];
|
||||
new_tag(etiquette);
|
||||
sprintf(tmp,"li $t%d, 1",iRegistre);
|
||||
@@ -390,7 +417,7 @@ void parcours_opExp(n_exp *n)
|
||||
printMips(tmp);
|
||||
sprintf(tmp,"%s:", etiquette);
|
||||
printMips(tmp);
|
||||
}else if(n->u.opExp_.op == infeg){
|
||||
}else if(n->u.opExp_.op == infeg){
|
||||
char etiquette[256];
|
||||
new_tag(etiquette);
|
||||
sprintf(tmp,"li $t%d, 1",iRegistre);
|
||||
@@ -401,26 +428,25 @@ void parcours_opExp(n_exp *n)
|
||||
printMips(tmp);
|
||||
sprintf(tmp,"%s:", etiquette);
|
||||
printMips(tmp);
|
||||
}else if(n->u.opExp_.op == ou){
|
||||
}else if(n->u.opExp_.op == ou){
|
||||
//TODOOOOOOOOOOOOOO
|
||||
}
|
||||
else if(n->u.opExp_.op == et) {
|
||||
} else if(n->u.opExp_.op == et) {
|
||||
sprintf(tmp,"and $t%d, $t%d",iRegistre2,iRegistre3);
|
||||
printMips(tmp);
|
||||
} else if(n->u.opExp_.op == non) {
|
||||
} else if(n->u.opExp_.op == non) {
|
||||
sprintf(tmp,"not $t%d, $t%d",iRegistre,iRegistre3);
|
||||
printMips(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(tmp, "$t%d", iRegistre);
|
||||
empile(tmp);
|
||||
sprintf(tmp, "$t%d", iRegistre);
|
||||
empile(tmp);
|
||||
}
|
||||
|
||||
/*-------------------------------- -----------------------------------------*/
|
||||
|
||||
void parcours_intExp(n_exp *n)
|
||||
{
|
||||
int iRegistre = newReg();
|
||||
int iRegistre = 0;
|
||||
|
||||
char tmp[256];
|
||||
sprintf(tmp, "li $t%d, %d", iRegistre, n->u.entier);
|
||||
@@ -435,7 +461,7 @@ void parcours_lireExp(n_exp *n)
|
||||
printMips("li $v0 5");
|
||||
printMips("syscall");
|
||||
|
||||
int iRegistre = newReg();
|
||||
int iRegistre = 0;
|
||||
char tmp[256];
|
||||
|
||||
sprintf(tmp, "move $t%d, $v0", iRegistre);
|
||||
@@ -530,7 +556,7 @@ void parcours_varDec(n_dec *n)
|
||||
if (contexte == C_VARIABLE_GLOBALE) {
|
||||
ajouteIdentificateur(n->nom, contexte, T_ENTIER, adresseGlobalCourante, -1);
|
||||
char tmp[250];
|
||||
sprintf(tmp, "$%s: .word", n->nom);
|
||||
sprintf(tmp, "$%s: .space 4", n->nom);
|
||||
printMips(tmp);
|
||||
adresseGlobalCourante += 4;
|
||||
} else if (contexte == C_VARIABLE_LOCALE) {
|
||||
@@ -602,14 +628,15 @@ void parcours_var_simple(n_var *n, char * var)
|
||||
if(dico.tab[i].classe == C_VARIABLE_GLOBALE) {
|
||||
sprintf(var, "$%s", n->nom);
|
||||
}
|
||||
else if (dico.tab[i].classe == C_ARGUMENT){
|
||||
else if (dico.tab[i].classe == C_ARGUMENT) {
|
||||
int adress = dico.tab[i].adresse;
|
||||
int nbArg = dico.tab[i - (adress/4) -1].complement;
|
||||
int result = (4 * nbArg + adress);
|
||||
int result = (4 * nbArg - adress);
|
||||
|
||||
sprintf(var, "%d($fp)", result);
|
||||
}
|
||||
else if (dico.tab[i].classe == C_VARIABLE_LOCALE){
|
||||
int adresse = -1 *(8 - dico.tab[i].adresse);
|
||||
int adresse = -1 *(8 + dico.tab[i].adresse);
|
||||
sprintf(var, "%d($fp)", adresse);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user