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