From 7fcb3a29022acfe02a9e125151213d128bc6f25a Mon Sep 17 00:00:00 2001 From: rugengande <jaenai.rugengande-ihimbazwe@etu.unistra.fr> Date: Fri, 27 Dec 2024 21:33:24 +0100 Subject: [PATCH 1/3] Code generation for simple assigning,print and string print --- lib.c | 36 +++++++++++++++++++++++++++--------- main.c | 2 ++ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/lib.c b/lib.c index ba27d2a..0c7f35b 100644 --- a/lib.c +++ b/lib.c @@ -284,7 +284,7 @@ static void quad_dump(struct quad * q, FILE* fout) { switch ( q->kind ) { - case BOP_PLUS: + /*case BOP_PLUS: symbol_dump(q->sym1,fout); fprintf(fout," := "); symbol_dump(q->sym2,fout); @@ -328,7 +328,7 @@ static void quad_dump(struct quad * q, FILE* fout) case DEF_FUNCTION: symbol_dump(q->sym1,fout); fprintf(fout,":"); - break; + break;*/ case CALL_PRINT: fprintf(fout,"print "); symbol_dump(q->sym1,fout); @@ -342,7 +342,7 @@ static void quad_dump(struct quad * q, FILE* fout) fprintf(fout," := "); symbol_dump(q->sym2,fout); break; - case ALLOCATE_ARRAY: + /*case ALLOCATE_ARRAY: fprintf(fout,"Allocate '"); symbol_dump(q->sym1,fout); fprintf(fout,"' to an one dimensional array of length "); @@ -365,7 +365,7 @@ static void quad_dump(struct quad * q, FILE* fout) fprintf(fout,"["); symbol_dump(q->sym3,fout); fprintf(fout,"]"); - break; + break;*/ default: fprintf(stderr,"BUG quad_dump(...) : q->kind inconnu\n"); break; @@ -410,6 +410,12 @@ void code_mips_dump(struct symtable * t, struct code * c){ else if(t->symbols[i].kind == CONSTANT_FLOAT){ //FLOAT CONSTANT fprintf(stdout,"\ttemp%d: .word %0.2f\n",i,t->symbols[i].u.value_float); } + else if(t->symbols[i].kind == CHAIN){ //CHAIN + fprintf(stdout,"\ttemp%d: .asciiz %s\n",i,t->symbols[i].u.chaine); + } + else if(t->symbols[i].kind == NAME_LOC){ + fprintf(stdout,"\t%s: .word 0\n",t->symbols[i].u.name); + } else{ //NAME fprintf(stdout,"\ttemp%d: .word 0\n",i); } @@ -417,10 +423,13 @@ void code_mips_dump(struct symtable * t, struct code * c){ fprintf(stdout,"\n\n.text\n main:\n"); + //int reg_counter=0; + //int max_temp_regs=7; + for(i = 0; i<c->nextquad; i++){ switch (c->quads[i].kind) { - case BOP_PLUS: + /*case BOP_PLUS: fprintf(stdout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2)); fprintf(stdout,"\tlw $t1, temp%d\n",indice_temp(t,c->quads[i].sym3)); fprintf(stdout,"\tadd $t0, $t0, $t1\n"); @@ -443,18 +452,27 @@ void code_mips_dump(struct symtable * t, struct code * c){ fprintf(stdout,"\tlw $t1, temp%d\n",indice_temp(t,c->quads[i].sym2)); fprintf(stdout,"\tsub $t0, $t0, $t1\n"); fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1)); - break; + break;*/ case CALL_PRINT: + fprintf(stdout,"\tlw $t0, %s\n",c->quads[i].sym1->u.name); + fprintf(stdout,"\tmove $a0, $t0\n"); fprintf(stdout,"\tli $v0, 1\n"); - fprintf(stdout,"\tlw $a0, temp%d\n",indice_temp(t,c->quads[i].sym1)); + //fprintf(stdout,"\tla $a0, %s\n",c->quads[i].sym1->u.name); + fprintf(stdout,"\tsyscall\n"); + break; + case CALL_PRINTSTR: + fprintf(stdout,"\tli $v0, 4\n"); + fprintf(stdout,"\tla $a0, temp%d\n",indice_temp(t,c->quads[i].sym1)); fprintf(stdout,"\tsyscall\n"); break; case COPY: fprintf(stdout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2)); - fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1)); + //fprintf(stdout,"\tsw $t%d, temp%d\n",reg_counter%max_temp_regs,indice_temp(t,c->quads[i].sym1)); + fprintf(stdout,"\tsw $t0, %s\n",c->quads[i].sym1->u.name); + //reg_counter++; break; default: - fprintf(stderr,"BUG\n"); + fprintf(stderr,"#BUG %d\n",c->quads[i].kind); break; } } diff --git a/main.c b/main.c index 272306c..7ef4e4b 100644 --- a/main.c +++ b/main.c @@ -48,6 +48,8 @@ int main(int argc, char *argv[]) // Generate intermediate code code_dump(CODE,fname); + code_mips_dump(SYMTAB,CODE); + // Free memory symtable_free(SYMTAB); code_free(CODE); -- GitLab From 733eda3fce965fccab6cc157863121cae92798d7 Mon Sep 17 00:00:00 2001 From: rugengande <jaenai.rugengande-ihimbazwe@etu.unistra.fr> Date: Sat, 28 Dec 2024 21:23:17 +0100 Subject: [PATCH 2/3] Register MIPS generated code into an output file --- lib.c | 50 ++++++++++++++++++++++++++++++-------------------- lib.h | 2 +- main.c | 2 +- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/lib.c b/lib.c index 0c7f35b..517ed00 100644 --- a/lib.c +++ b/lib.c @@ -397,31 +397,39 @@ int indice_temp(struct symtable* t, struct symbol* s){ return i; } -void code_mips_dump(struct symtable * t, struct code * c){ - fprintf(stdout,".data\n"); +void code_mips_dump(struct symtable * t, struct code * c, FILE* fout){ + fprintf(fout,".data\n"); + fprintf(fout,"\tlf: .asciiz \"\\n\"\n"); if(t==NULL){fprintf(stderr,"Code mips dump: symtable null\n"); exit(1);} unsigned int i =0; for(i=i; i<t->size; i++){ if(t->symbols[i].kind == CONSTANT_INT){ //INTEGER CONSTANT - fprintf(stdout,"\ttemp%d: .word %ld\n",i,t->symbols[i].u.value_int); + fprintf(fout,"\ttemp%d: .word %ld\n",i,t->symbols[i].u.value_int); } else if(t->symbols[i].kind == CONSTANT_FLOAT){ //FLOAT CONSTANT - fprintf(stdout,"\ttemp%d: .word %0.2f\n",i,t->symbols[i].u.value_float); + fprintf(fout,"\ttemp%d: .word %0.2f\n",i,t->symbols[i].u.value_float); } else if(t->symbols[i].kind == CHAIN){ //CHAIN - fprintf(stdout,"\ttemp%d: .asciiz %s\n",i,t->symbols[i].u.chaine); + fprintf(fout,"\ttemp%d: .asciiz %s\n",i,t->symbols[i].u.chaine); } else if(t->symbols[i].kind == NAME_LOC){ - fprintf(stdout,"\t%s: .word 0\n",t->symbols[i].u.name); + fprintf(fout,"\t%s: .word 0\n",t->symbols[i].u.name); } else{ //NAME - fprintf(stdout,"\ttemp%d: .word 0\n",i); + fprintf(fout,"\ttemp%d: .word 0\n",i); } } - fprintf(stdout,"\n\n.text\n main:\n"); + //Macro for new line print + fprintf(fout,".macro LF\n"); + fprintf(fout,"\tli $v0, 4\n"); + fprintf(fout,"\tla $a0, lf\n"); + fprintf(fout,"\tsyscall\n"); + fprintf(fout,".end_macro\n"); + fprintf(fout,"\n\n.text\n main:\n"); + //int reg_counter=0; //int max_temp_regs=7; @@ -454,21 +462,23 @@ void code_mips_dump(struct symtable * t, struct code * c){ fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1)); break;*/ case CALL_PRINT: - fprintf(stdout,"\tlw $t0, %s\n",c->quads[i].sym1->u.name); - fprintf(stdout,"\tmove $a0, $t0\n"); - fprintf(stdout,"\tli $v0, 1\n"); + fprintf(fout,"\tlw $t0, %s\n",c->quads[i].sym1->u.name); + fprintf(fout,"\tmove $a0, $t0\n"); + fprintf(fout,"\tli $v0, 1\n"); //fprintf(stdout,"\tla $a0, %s\n",c->quads[i].sym1->u.name); - fprintf(stdout,"\tsyscall\n"); + fprintf(fout,"\tsyscall\n"); + //Return to line + fprintf(fout,"\tLF\n"); break; case CALL_PRINTSTR: - fprintf(stdout,"\tli $v0, 4\n"); - fprintf(stdout,"\tla $a0, temp%d\n",indice_temp(t,c->quads[i].sym1)); - fprintf(stdout,"\tsyscall\n"); + fprintf(fout,"\tli $v0, 4\n"); + fprintf(fout,"\tla $a0, temp%d\n",indice_temp(t,c->quads[i].sym1)); + fprintf(fout,"\tsyscall\n"); break; case COPY: - fprintf(stdout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2)); + fprintf(fout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2)); //fprintf(stdout,"\tsw $t%d, temp%d\n",reg_counter%max_temp_regs,indice_temp(t,c->quads[i].sym1)); - fprintf(stdout,"\tsw $t0, %s\n",c->quads[i].sym1->u.name); + fprintf(fout,"\tsw $t0, %s\n",c->quads[i].sym1->u.name); //reg_counter++; break; default: @@ -477,9 +487,9 @@ void code_mips_dump(struct symtable * t, struct code * c){ } } - fprintf(stdout,"\t# exit\n"); - fprintf(stdout,"\tli $v0,10\n"); - fprintf(stdout,"\tsyscall\n"); + fprintf(fout,"\t# exit\n"); + fprintf(fout,"\tli $v0,10\n"); + fprintf(fout,"\tsyscall\n"); } void code_free(struct code * c) diff --git a/lib.h b/lib.h index 79bc692..d8c32da 100644 --- a/lib.h +++ b/lib.h @@ -114,7 +114,7 @@ struct symbol *newtemp(struct symtable * t); // Display in the 'fout' output file the intermediate code (in commentary) void code_dump(struct code * c, FILE* fout); // Display in the 'fout' output file the mips code -void code_mips_dump(struct symtable * t, struct code * c); +void code_mips_dump(struct symtable * t, struct code * c, FILE* fout); // Free memory of the code struct void code_free(struct code * c); diff --git a/main.c b/main.c index 7ef4e4b..5ec6af1 100644 --- a/main.c +++ b/main.c @@ -48,7 +48,7 @@ int main(int argc, char *argv[]) // Generate intermediate code code_dump(CODE,fname); - code_mips_dump(SYMTAB,CODE); + code_mips_dump(SYMTAB,CODE,fname); // Free memory symtable_free(SYMTAB); -- GitLab From 8132dc5e5a96cb4327a64a6ca783385e2b95c7e8 Mon Sep 17 00:00:00 2001 From: rugengande <jaenai.rugengande-ihimbazwe@etu.unistra.fr> Date: Sun, 29 Dec 2024 15:06:51 +0100 Subject: [PATCH 3/3] remove unnecessary commented code --- lib.c | 37 ++++--------------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/lib.c b/lib.c index 517ed00..997d101 100644 --- a/lib.c +++ b/lib.c @@ -284,7 +284,7 @@ static void quad_dump(struct quad * q, FILE* fout) { switch ( q->kind ) { - /*case BOP_PLUS: + case BOP_PLUS: symbol_dump(q->sym1,fout); fprintf(fout," := "); symbol_dump(q->sym2,fout); @@ -328,7 +328,7 @@ static void quad_dump(struct quad * q, FILE* fout) case DEF_FUNCTION: symbol_dump(q->sym1,fout); fprintf(fout,":"); - break;*/ + break; case CALL_PRINT: fprintf(fout,"print "); symbol_dump(q->sym1,fout); @@ -342,7 +342,7 @@ static void quad_dump(struct quad * q, FILE* fout) fprintf(fout," := "); symbol_dump(q->sym2,fout); break; - /*case ALLOCATE_ARRAY: + case ALLOCATE_ARRAY: fprintf(fout,"Allocate '"); symbol_dump(q->sym1,fout); fprintf(fout,"' to an one dimensional array of length "); @@ -365,7 +365,7 @@ static void quad_dump(struct quad * q, FILE* fout) fprintf(fout,"["); symbol_dump(q->sym3,fout); fprintf(fout,"]"); - break;*/ + break; default: fprintf(stderr,"BUG quad_dump(...) : q->kind inconnu\n"); break; @@ -431,41 +431,14 @@ void code_mips_dump(struct symtable * t, struct code * c, FILE* fout){ fprintf(fout,"\n\n.text\n main:\n"); - //int reg_counter=0; - //int max_temp_regs=7; for(i = 0; i<c->nextquad; i++){ switch (c->quads[i].kind) { - /*case BOP_PLUS: - fprintf(stdout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2)); - fprintf(stdout,"\tlw $t1, temp%d\n",indice_temp(t,c->quads[i].sym3)); - fprintf(stdout,"\tadd $t0, $t0, $t1\n"); - fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1)); - break; - case BOP_MINUS: - fprintf(stdout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2)); - fprintf(stdout,"\tlw $t1, temp%d\n",indice_temp(t,c->quads[i].sym3)); - fprintf(stdout,"\tsub $t0, $t0, $t1\n"); - fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1)); - break; - case BOP_MULT: - fprintf(stdout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2)); - fprintf(stdout,"\tlw $t1, temp%d\n",indice_temp(t,c->quads[i].sym3)); - fprintf(stdout,"\tmul $t0, $t0, $t1\n"); - fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1)); - break; - case UOP_MINUS: - fprintf(stdout,"\tli $t0, 0\n"); - fprintf(stdout,"\tlw $t1, temp%d\n",indice_temp(t,c->quads[i].sym2)); - fprintf(stdout,"\tsub $t0, $t0, $t1\n"); - fprintf(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1)); - break;*/ case CALL_PRINT: fprintf(fout,"\tlw $t0, %s\n",c->quads[i].sym1->u.name); fprintf(fout,"\tmove $a0, $t0\n"); fprintf(fout,"\tli $v0, 1\n"); - //fprintf(stdout,"\tla $a0, %s\n",c->quads[i].sym1->u.name); fprintf(fout,"\tsyscall\n"); //Return to line fprintf(fout,"\tLF\n"); @@ -477,9 +450,7 @@ void code_mips_dump(struct symtable * t, struct code * c, FILE* fout){ break; case COPY: fprintf(fout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2)); - //fprintf(stdout,"\tsw $t%d, temp%d\n",reg_counter%max_temp_regs,indice_temp(t,c->quads[i].sym1)); fprintf(fout,"\tsw $t0, %s\n",c->quads[i].sym1->u.name); - //reg_counter++; break; default: fprintf(stderr,"#BUG %d\n",c->quads[i].kind); -- GitLab