diff --git a/lib.c b/lib.c index ba27d2ac76bbd6e72b2056a157b2748aabce45e2..997d1010ce21b9614e771150258d46ef1167b231 100644 --- a/lib.c +++ b/lib.c @@ -397,71 +397,70 @@ 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(fout,"\ttemp%d: .asciiz %s\n",i,t->symbols[i].u.chaine); + } + else if(t->symbols[i].kind == NAME_LOC){ + 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"); + + 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(stdout,"\tli $v0, 1\n"); - fprintf(stdout,"\tlw $a0, temp%d\n",indice_temp(t,c->quads[i].sym1)); - fprintf(stdout,"\tsyscall\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(fout,"\tsyscall\n"); + //Return to line + fprintf(fout,"\tLF\n"); + break; + case CALL_PRINTSTR: + 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(stdout,"\tsw $t0, temp%d\n",indice_temp(t,c->quads[i].sym1)); + fprintf(fout,"\tlw $t0, temp%d\n",indice_temp(t,c->quads[i].sym2)); + fprintf(fout,"\tsw $t0, %s\n",c->quads[i].sym1->u.name); break; default: - fprintf(stderr,"BUG\n"); + fprintf(stderr,"#BUG %d\n",c->quads[i].kind); break; } } - 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 79bc6924fc1b0d49baf00cba06d6d121b900f2fb..d8c32da2eeb48851e97a16d824344c0a9826f87c 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 272306c94b23ea260f80908629fc417c6207de02..5ec6af13469af6b2ca97860ac616c4cecc39e27e 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,fname); + // Free memory symtable_free(SYMTAB); code_free(CODE);