test prof reussi enfin je crois
This commit is contained in:
197
src/parcours.c
197
src/parcours.c
@@ -2,13 +2,15 @@
|
|||||||
#include "parcours.h"
|
#include "parcours.h"
|
||||||
#include "syntabs.h"
|
#include "syntabs.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
int argumentMicka = 0;
|
|
||||||
|
int nbArg = 0;
|
||||||
int contexte = C_VARIABLE_GLOBALE;
|
int contexte = C_VARIABLE_GLOBALE;
|
||||||
int adresseGlobalCourante = 0;
|
int adresseGlobalCourante = 0;
|
||||||
int adresseLocaleCourante = 0;
|
int adresseLocaleCourante = 0;
|
||||||
int adresseArgumentCourant = 0;
|
int adresseArgumentCourant = 0;
|
||||||
int afficheMips = 0;
|
int afficheMips = 0;
|
||||||
int creg = 0;
|
int creg = 0;
|
||||||
|
|
||||||
extern dico_ dico;
|
extern dico_ dico;
|
||||||
|
|
||||||
int tagindice = 0;
|
int tagindice = 0;
|
||||||
@@ -34,13 +36,19 @@ void debutFunc() {
|
|||||||
printMips("sw $ra, 0($sp)");
|
printMips("sw $ra, 0($sp)");
|
||||||
}
|
}
|
||||||
|
|
||||||
void finFunc() {
|
void finFuncreturn(int bool){
|
||||||
printMips("lw $ra, 0($sp)");
|
printMips("lw $ra, 0($sp)");
|
||||||
printMips("addi $sp, $sp, 4");
|
printMips("addi $sp, $sp, 4");
|
||||||
printMips("lw $fp, 0($sp)");
|
printMips("lw $fp, 0($sp)");
|
||||||
printMips("addi $sp, $sp, 4");
|
printMips("addi $sp, $sp, 4");
|
||||||
|
if(!bool){
|
||||||
|
printMips("addi $sp, $sp, 4 #ignore valeur de retour");
|
||||||
|
}
|
||||||
printMips("jr $ra");
|
printMips("jr $ra");
|
||||||
}
|
}
|
||||||
|
void finFunc() {
|
||||||
|
finFuncreturn(0);
|
||||||
|
}
|
||||||
|
|
||||||
void empile(char *reg) {
|
void empile(char *reg) {
|
||||||
if(afficheMips) {
|
if(afficheMips) {
|
||||||
@@ -221,8 +229,9 @@ void parcours_instr_affect(n_instr *n)
|
|||||||
char tmp[250];
|
char tmp[250];
|
||||||
char registre[250];
|
char registre[250];
|
||||||
|
|
||||||
parcours_var(n->u.affecte_.var,var);
|
|
||||||
parcours_exp(n->u.affecte_.exp);
|
parcours_exp(n->u.affecte_.exp);
|
||||||
|
parcours_var(n->u.affecte_.var,var);
|
||||||
|
|
||||||
|
|
||||||
int iRegistre = 0;
|
int iRegistre = 0;
|
||||||
sprintf(registre,"$t%d",iRegistre);
|
sprintf(registre,"$t%d",iRegistre);
|
||||||
@@ -250,7 +259,7 @@ void parcours_appel(n_appel *n)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
printMips("sub $sp, $sp, 4 #Val Retour");
|
printMips("subi $sp, $sp, 4 #Val Retour");
|
||||||
|
|
||||||
int nbArg = parcours_l_exp(n->args);
|
int nbArg = parcours_l_exp(n->args);
|
||||||
|
|
||||||
@@ -264,8 +273,10 @@ void parcours_appel(n_appel *n)
|
|||||||
sprintf(tmp,"jal %s",n->fonction);
|
sprintf(tmp,"jal %s",n->fonction);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
int i = nbArg * 4;
|
int i = nbArg * 4;
|
||||||
sprintf(tmp,"addi $sp, $sp, %d",i);
|
if(i != 0) {
|
||||||
|
sprintf(tmp,"addi $sp, $sp, %d #désalocation des arguments",i);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
@@ -274,17 +285,15 @@ void parcours_instr_retour(n_instr *n)
|
|||||||
{
|
{
|
||||||
char tmp[250];
|
char tmp[250];
|
||||||
char exec[250];
|
char exec[250];
|
||||||
int returnAdress = 4 * (argumentMicka + 1);
|
int returnAdress = 4 * (nbArg + 1);
|
||||||
|
|
||||||
parcours_exp(n->u.retour_.expression);
|
parcours_exp(n->u.retour_.expression);
|
||||||
|
|
||||||
int iRegistre = 0;
|
int iRegistre = 0;
|
||||||
sprintf(tmp,"$t%d",iRegistre);
|
sprintf(tmp,"$t%d",iRegistre);
|
||||||
depile(tmp);
|
depile(tmp);
|
||||||
sprintf(exec,"sw %s %d($fp) #Adresse de retour",tmp , returnAdress);
|
sprintf(exec,"sw %s %d($fp) #Adresse de retour",tmp , returnAdress);
|
||||||
printMips(exec);
|
printMips(exec);
|
||||||
|
|
||||||
finFunc();
|
finFuncreturn(1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -354,35 +363,60 @@ void parcours_opExp(n_exp *n)
|
|||||||
int iRegistre2 = 1;
|
int iRegistre2 = 1;
|
||||||
int iRegistre3 = 2;
|
int iRegistre3 = 2;
|
||||||
|
|
||||||
parcours_exp(n->u.opExp_.op1);
|
|
||||||
if(n->u.opExp_.op2 != NULL)
|
|
||||||
parcours_exp(n->u.opExp_.op2);
|
|
||||||
|
|
||||||
sprintf(tmp, "$t%d", iRegistre3);
|
|
||||||
depile(tmp);
|
|
||||||
|
|
||||||
if(n->u.opExp_.op != non){
|
|
||||||
sprintf(tmp, "$t%d", iRegistre2);
|
|
||||||
depile(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(n->u.opExp_.op == plus) {
|
if(n->u.opExp_.op == plus) {
|
||||||
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
|
|
||||||
sprintf(tmp,"add $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3);
|
sprintf(tmp,"add $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
} else if(n->u.opExp_.op == moins){
|
} else if(n->u.opExp_.op == moins){
|
||||||
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
|
|
||||||
sprintf(tmp,"sub $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3);
|
sprintf(tmp,"sub $t%d, $t%d, $t%d",iRegistre, iRegistre2, iRegistre3);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
} else if(n->u.opExp_.op == fois) {
|
} else if(n->u.opExp_.op == fois) {
|
||||||
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
|
|
||||||
sprintf(tmp,"mult $t%d, $t%d", iRegistre2, iRegistre3);
|
sprintf(tmp,"mult $t%d, $t%d", iRegistre2, iRegistre3);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
sprintf(tmp,"mflo $t%d",iRegistre);
|
sprintf(tmp,"mflo $t%d",iRegistre);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
} else if(n->u.opExp_.op == divise) {
|
} else if(n->u.opExp_.op == divise) {
|
||||||
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
|
|
||||||
sprintf(tmp,"div $t%d, $t%d", iRegistre2, iRegistre3);
|
sprintf(tmp,"div $t%d, $t%d", iRegistre2, iRegistre3);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
sprintf(tmp,"mflo $t%d",iRegistre);
|
sprintf(tmp,"mflo $t%d",iRegistre);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
} else if(n->u.opExp_.op == egal){
|
} else if(n->u.opExp_.op == egal){
|
||||||
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
|
||||||
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
|
|
||||||
char etiquette[256];
|
char etiquette[256];
|
||||||
new_tag(etiquette);
|
new_tag(etiquette);
|
||||||
sprintf(tmp,"li $t%d, 1",iRegistre);
|
sprintf(tmp,"li $t%d, 1",iRegistre);
|
||||||
@@ -394,6 +428,13 @@ void parcours_opExp(n_exp *n)
|
|||||||
sprintf(tmp,"%s:", etiquette);
|
sprintf(tmp,"%s:", etiquette);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
} else if(n->u.opExp_.op == diff) {
|
} else if(n->u.opExp_.op == diff) {
|
||||||
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
|
|
||||||
char etiquette[256];
|
char etiquette[256];
|
||||||
new_tag(etiquette);
|
new_tag(etiquette);
|
||||||
sprintf(tmp,"li $t%d, 0",iRegistre);
|
sprintf(tmp,"li $t%d, 0",iRegistre);
|
||||||
@@ -405,6 +446,12 @@ void parcours_opExp(n_exp *n)
|
|||||||
sprintf(tmp,"%s:", etiquette);
|
sprintf(tmp,"%s:", etiquette);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
}else if(n->u.opExp_.op == inf){
|
}else if(n->u.opExp_.op == inf){
|
||||||
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
char etiquette[256];
|
char etiquette[256];
|
||||||
new_tag(etiquette);
|
new_tag(etiquette);
|
||||||
sprintf(tmp,"li $t%d, 1",iRegistre);
|
sprintf(tmp,"li $t%d, 1",iRegistre);
|
||||||
@@ -416,6 +463,13 @@ void parcours_opExp(n_exp *n)
|
|||||||
sprintf(tmp,"%s:", etiquette);
|
sprintf(tmp,"%s:", etiquette);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
}else if(n->u.opExp_.op == infeg){
|
}else if(n->u.opExp_.op == infeg){
|
||||||
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
|
|
||||||
char etiquette[256];
|
char etiquette[256];
|
||||||
new_tag(etiquette);
|
new_tag(etiquette);
|
||||||
sprintf(tmp,"li $t%d, 1",iRegistre);
|
sprintf(tmp,"li $t%d, 1",iRegistre);
|
||||||
@@ -427,15 +481,87 @@ void parcours_opExp(n_exp *n)
|
|||||||
sprintf(tmp,"%s:", etiquette);
|
sprintf(tmp,"%s:", etiquette);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
}else if(n->u.opExp_.op == ou){
|
}else if(n->u.opExp_.op == ou){
|
||||||
//TODOOOOOOOOOOOOOO
|
char faux1[256];
|
||||||
} else if(n->u.opExp_.op == et) {
|
char faux2[256];
|
||||||
sprintf(tmp,"and $t%d, $t%d",iRegistre2,iRegistre3);
|
char vrai[256];
|
||||||
|
char empile[256];
|
||||||
|
new_tag(faux1);
|
||||||
|
new_tag(faux2);
|
||||||
|
new_tag(vrai);
|
||||||
|
new_tag(empile);
|
||||||
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp,"beq $zero, $t%d, %s",iRegistre2,faux1);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"j %s",vrai);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"%s :",faux1);
|
||||||
|
printMips(tmp);
|
||||||
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp,"beq $zero $t%d %s",iRegistre2,faux2);
|
||||||
|
sprintf(tmp, "%s :", vrai);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"li $t%d 1",iRegistre);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"j %s",empile);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"%s :",faux2);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"li $t%d 0",iRegistre);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"%s : ", empile);
|
||||||
|
printMips(tmp);
|
||||||
|
} else if(n->u.opExp_.op == et) {
|
||||||
|
char empile[256];
|
||||||
|
char faux[256];
|
||||||
|
new_tag(empile);
|
||||||
|
new_tag(faux);
|
||||||
|
|
||||||
|
|
||||||
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre2);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp,"li $t%d, 1",iRegistre);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"beq $zero, $t%d, %s",iRegistre2,faux);
|
||||||
|
printMips(tmp);
|
||||||
|
|
||||||
|
parcours_exp(n->u.opExp_.op2);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp,"beq $zero, $t%d, %s",iRegistre3,faux);
|
||||||
|
printMips(tmp);
|
||||||
|
|
||||||
|
sprintf(tmp,"j %s", empile);
|
||||||
|
printMips(tmp);
|
||||||
|
|
||||||
|
sprintf(tmp," %s :",faux);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"li $t%d 0",iRegistre);
|
||||||
|
printMips(tmp);
|
||||||
|
|
||||||
|
sprintf(tmp ," %s :",empile);
|
||||||
|
|
||||||
|
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);
|
parcours_exp(n->u.opExp_.op1);
|
||||||
|
char fin[256];
|
||||||
|
new_tag(fin);
|
||||||
|
sprintf(tmp, "$t%d", iRegistre3);
|
||||||
|
depile(tmp);
|
||||||
|
sprintf(tmp,"li $t%d 0",iRegistre);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"beq $t%d, $zero %s",iRegistre3,fin);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp,"li $t%d 1",iRegistre);
|
||||||
|
printMips(tmp);
|
||||||
|
sprintf(tmp, "%s :",fin);
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(tmp, "$t%d", iRegistre);
|
sprintf(tmp, "$t%d", iRegistre);
|
||||||
empile(tmp);
|
empile(tmp);
|
||||||
}
|
}
|
||||||
@@ -530,25 +656,29 @@ void parcours_foncDec(n_dec *n)
|
|||||||
break;
|
break;
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
argumentMicka = j;
|
nbArg = j;
|
||||||
dico.tab[id].complement = j;
|
dico.tab[id].complement = j;
|
||||||
|
|
||||||
contexte = C_VARIABLE_LOCALE;
|
contexte = C_VARIABLE_LOCALE;
|
||||||
parcours_l_dec(n->u.foncDec_.variables);
|
parcours_l_dec(n->u.foncDec_.variables);
|
||||||
parcours_instr(n->u.foncDec_.corps);
|
parcours_instr(n->u.foncDec_.corps);
|
||||||
i = rechercheExecutable(n->nom);
|
i = id;
|
||||||
int nbvariableLocale = 0;
|
int nbvariableLocale = 0;
|
||||||
while (dico.tab[i+1].classe == C_VARIABLE_LOCALE){
|
|
||||||
|
while (i+1 < dico.sommet && (dico.tab[i+1].classe == C_VARIABLE_LOCALE
|
||||||
|
|| dico.tab[i+1].classe == C_ARGUMENT)){
|
||||||
|
if(dico.tab[i+1].classe == C_VARIABLE_LOCALE)
|
||||||
++nbvariableLocale;
|
++nbvariableLocale;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(tmp,"addi $sp, $sp %d # desallocation variables locales",nbvariableLocale * 4);
|
sprintf(tmp,"addi $sp, $sp %d # desallocation variables locales",nbvariableLocale * 4);
|
||||||
//SAm est morte ici
|
|
||||||
printMips(tmp);
|
printMips(tmp);
|
||||||
|
|
||||||
finFunc();
|
|
||||||
affiche_dico();
|
affiche_dico();
|
||||||
sortieFonction();
|
sortieFonction();
|
||||||
|
finFunc();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
@@ -638,7 +768,6 @@ void parcours_var_simple(n_var *n, char * var)
|
|||||||
}
|
}
|
||||||
else if (dico.tab[i].classe == C_ARGUMENT) {
|
else if (dico.tab[i].classe == C_ARGUMENT) {
|
||||||
int adress = dico.tab[i].adresse;
|
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) #variable argument %s",result,n->nom);
|
sprintf(var, "%d($fp) #variable argument %s",result,n->nom);
|
||||||
}
|
}
|
||||||
@@ -661,8 +790,10 @@ void parcours_var_indicee(n_var *n, char * var)
|
|||||||
affiche_dico();
|
affiche_dico();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
parcours_exp( n->u.indicee_.indice );
|
parcours_exp( n->u.indicee_.indice );
|
||||||
|
depile ("$t4");
|
||||||
|
printMips("add $t4,$t4,$t4");
|
||||||
|
printMips("add $t4,$t4,$t4");
|
||||||
|
sprintf(var,"$%s($t4)",n->nom);
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|||||||
Reference in New Issue
Block a user