From 9f3b46522acd7800865e179e084111aa9251fd76 Mon Sep 17 00:00:00 2001 From: Audric Bonneau <audric.bonneau@etu.unistra.fr> Date: Tue, 24 Dec 2024 12:32:31 +0100 Subject: [PATCH 1/5] =?UTF-8?q?Debut=20d'impl=C3=A9mentation=20ND=20arrays?= =?UTF-8?q?=20->=20allocate=20an=20array=20to=20stock=20the=20size?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Codes_en_COREC/tests/test10.corec | 2 +- Codes_en_COREC/tests/test11.corec | 2 +- Codes_en_COREC/tests/test12.corec | 2 +- Codes_en_COREC/tests/test3.corec | 5 +- Codes_en_COREC/tests/test4.corec | 2 +- Codes_en_COREC/tests/test5.corec | 61 ++++++++++++++++------- Codes_en_COREC/tests/test6.corec | 24 +++++++-- Codes_en_COREC/tests/test7.corec | 12 ++++- Codes_en_COREC/tests/test8.corec | 2 +- Codes_en_COREC/tests/test9.corec | 2 +- Codes_en_COREC/testsErrors/test1Err.corec | 2 +- Codes_en_COREC/testsErrors/test2Err.corec | 2 +- Codes_en_COREC/testsErrors/test3Err.corec | 2 +- Codes_en_COREC/testsErrors/test4Err.corec | 2 +- Codes_en_COREC/testsErrors/test5Err.corec | 2 +- Codes_en_COREC/testsErrors/test6Err.corec | 2 +- Codes_en_COREC/testsErrors/test7Err.corec | 2 +- Codes_en_COREC/testsErrors/test8Err.corec | 2 +- Codes_en_COREC/testsErrors/test9Err.corec | 2 +- Makefile | 2 +- README.md | 18 +++++-- corec.l | 10 ++-- corec.y | 18 +++++-- docs/tests.md | 4 +- lib.c | 53 ++++++++++++++++---- lib.h | 4 +- 26 files changed, 174 insertions(+), 67 deletions(-) diff --git a/Codes_en_COREC/tests/test10.corec b/Codes_en_COREC/tests/test10.corec index 5dbec42..559c314 100644 --- a/Codes_en_COREC/tests/test10.corec +++ b/Codes_en_COREC/tests/test10.corec @@ -1 +1 @@ -// Call multiple function +// Call function arguments in out inout diff --git a/Codes_en_COREC/tests/test11.corec b/Codes_en_COREC/tests/test11.corec index 64dab45..5dbec42 100644 --- a/Codes_en_COREC/tests/test11.corec +++ b/Codes_en_COREC/tests/test11.corec @@ -1 +1 @@ -// Call function with the 2nd syntax +// Call multiple function diff --git a/Codes_en_COREC/tests/test12.corec b/Codes_en_COREC/tests/test12.corec index 131ce31..64dab45 100644 --- a/Codes_en_COREC/tests/test12.corec +++ b/Codes_en_COREC/tests/test12.corec @@ -1 +1 @@ -// Call function recursive +// Call function with the 2nd syntax diff --git a/Codes_en_COREC/tests/test3.corec b/Codes_en_COREC/tests/test3.corec index ff8cabe..26783eb 100644 --- a/Codes_en_COREC/tests/test3.corec +++ b/Codes_en_COREC/tests/test3.corec @@ -1,10 +1,11 @@ -// Aff arrays +// Aff 1D arrays prog Test3 { def Main{ Loc : (array1,5), (array2,2+4/2) Rec : { - array1 = 1; // Implicitement array1[0] + + array1 = 1.0; // Implicitement array1[0] array1[4] = 2; array2[0] = 1.15; diff --git a/Codes_en_COREC/tests/test4.corec b/Codes_en_COREC/tests/test4.corec index cf9ee6e..48f52ec 100644 --- a/Codes_en_COREC/tests/test4.corec +++ b/Codes_en_COREC/tests/test4.corec @@ -1,4 +1,4 @@ -// Opp on arrays +// Opp on 1D arrays prog Test4 { def Main{ diff --git a/Codes_en_COREC/tests/test5.corec b/Codes_en_COREC/tests/test5.corec index c984638..cf9ee6e 100644 --- a/Codes_en_COREC/tests/test5.corec +++ b/Codes_en_COREC/tests/test5.corec @@ -1,25 +1,52 @@ -// Conditions (if else ternaire..) +// Opp on arrays -prog test5{ - def Main { +prog Test4 { + def Main{ + Loc : (array,3) Rec : { - a = 10; - b = 2; + array[0] = 2; - printstr("a = 10 | b = 2"); - printstr("a<b ?"); + array[0] += 2; + printstr("Attendu 4 :"); + print((array,3)); + array[0] -= 2; + printstr("Attendu 2 :"); + print((array,3)); + array[0] /= 2; + printstr("Attendu 1 :"); + print((array,3)); + array[0] *= 2; + printstr("Attendu 2 :"); + print((array,3)); + + array[1] = array[0] + 3; + printstr("Attendu 5 :"); + print((array,3)); - a>b? - { - printstr("oui") - } - :printstr("non"); + array[1] = array[0] - 3; + printstr("Attendu 2 :"); + print((array,3)); - printstr("b egal a 2 ?"); - b==2? - { - printstr("oui") - }: + array[1] = array[0] / 3; + printstr("Attendu 0.66 :"); + print((array,3)); + array[1] = array[0] * 3; + printstr("Attendu 2.00 :"); + print((array,3)); + + + array[2] = array[0] + array[1]; + printstr("Attendu 4 :"); + print((array,3)); + array[2] = array[0] - array[1]; + printstr("Attendu 0 :"); + print((array,3)); + array[2] = array[0] / array[1]; + printstr("Attendu 1 :"); + print((array,3)); + array[2] = array[0] * array[1]; + printstr("Attendu 4 :"); + print((array,3)) } } } diff --git a/Codes_en_COREC/tests/test6.corec b/Codes_en_COREC/tests/test6.corec index a183de2..c984638 100644 --- a/Codes_en_COREC/tests/test6.corec +++ b/Codes_en_COREC/tests/test6.corec @@ -1,11 +1,25 @@ // Conditions (if else ternaire..) -prog test4 { - def Main { +prog test5{ + def Main { Rec : { - printstr("Saisie clavie :"); - read(saisie); - print(saisie) + a = 10; + b = 2; + + printstr("a = 10 | b = 2"); + printstr("a<b ?"); + + a>b? + { + printstr("oui") + } + :printstr("non"); + + printstr("b egal a 2 ?"); + b==2? + { + printstr("oui") + }: } } } diff --git a/Codes_en_COREC/tests/test7.corec b/Codes_en_COREC/tests/test7.corec index 0c8d007..a183de2 100644 --- a/Codes_en_COREC/tests/test7.corec +++ b/Codes_en_COREC/tests/test7.corec @@ -1 +1,11 @@ -// For with Dom +// Conditions (if else ternaire..) + +prog test4 { + def Main { + Rec : { + printstr("Saisie clavie :"); + read(saisie); + print(saisie) + } + } +} diff --git a/Codes_en_COREC/tests/test8.corec b/Codes_en_COREC/tests/test8.corec index 2cef160..0c8d007 100644 --- a/Codes_en_COREC/tests/test8.corec +++ b/Codes_en_COREC/tests/test8.corec @@ -1 +1 @@ -// Call function +// For with Dom diff --git a/Codes_en_COREC/tests/test9.corec b/Codes_en_COREC/tests/test9.corec index 559c314..2cef160 100644 --- a/Codes_en_COREC/tests/test9.corec +++ b/Codes_en_COREC/tests/test9.corec @@ -1 +1 @@ -// Call function arguments in out inout +// Call function diff --git a/Codes_en_COREC/testsErrors/test1Err.corec b/Codes_en_COREC/testsErrors/test1Err.corec index f22af3e..cb2ba05 100644 --- a/Codes_en_COREC/testsErrors/test1Err.corec +++ b/Codes_en_COREC/testsErrors/test1Err.corec @@ -1,5 +1,5 @@ -prog Test4 { +prog Test1Err { def Main{ } } diff --git a/Codes_en_COREC/testsErrors/test2Err.corec b/Codes_en_COREC/testsErrors/test2Err.corec index acf9691..cc01f56 100644 --- a/Codes_en_COREC/testsErrors/test2Err.corec +++ b/Codes_en_COREC/testsErrors/test2Err.corec @@ -1,4 +1,4 @@ -prog Test2 { +prog Test2Err { def Main{ Rec : { } diff --git a/Codes_en_COREC/testsErrors/test3Err.corec b/Codes_en_COREC/testsErrors/test3Err.corec index b4f816b..4588040 100644 --- a/Codes_en_COREC/testsErrors/test3Err.corec +++ b/Codes_en_COREC/testsErrors/test3Err.corec @@ -1,4 +1,4 @@ -prog Test3 { +prog Test3Err { def Main{ Loc : a, a=2, b // a deja declaré Rec : { diff --git a/Codes_en_COREC/testsErrors/test4Err.corec b/Codes_en_COREC/testsErrors/test4Err.corec index 6f8d058..4debeec 100644 --- a/Codes_en_COREC/testsErrors/test4Err.corec +++ b/Codes_en_COREC/testsErrors/test4Err.corec @@ -1,4 +1,4 @@ -prog Test4 { +prog Test4Err { def T{ [] Loc : a, c=2, b Rec : { diff --git a/Codes_en_COREC/testsErrors/test5Err.corec b/Codes_en_COREC/testsErrors/test5Err.corec index d5bf1c6..4ba3547 100644 --- a/Codes_en_COREC/testsErrors/test5Err.corec +++ b/Codes_en_COREC/testsErrors/test5Err.corec @@ -1,4 +1,4 @@ -prog Test5 { +prog Test5Err { def T{ [] Loc : a, c=2, b Rec : { diff --git a/Codes_en_COREC/testsErrors/test6Err.corec b/Codes_en_COREC/testsErrors/test6Err.corec index 9ed736d..2d6d501 100644 --- a/Codes_en_COREC/testsErrors/test6Err.corec +++ b/Codes_en_COREC/testsErrors/test6Err.corec @@ -1,4 +1,4 @@ -prog Test6 { +prog Test6Err { def Main{ Loc : a Rec : { diff --git a/Codes_en_COREC/testsErrors/test7Err.corec b/Codes_en_COREC/testsErrors/test7Err.corec index 185e886..d55f3a1 100644 --- a/Codes_en_COREC/testsErrors/test7Err.corec +++ b/Codes_en_COREC/testsErrors/test7Err.corec @@ -1,4 +1,4 @@ -prog Test7 { +prog Test7Err { def Main{ Loc : Rec : { diff --git a/Codes_en_COREC/testsErrors/test8Err.corec b/Codes_en_COREC/testsErrors/test8Err.corec index 0467165..1dcbc63 100644 --- a/Codes_en_COREC/testsErrors/test8Err.corec +++ b/Codes_en_COREC/testsErrors/test8Err.corec @@ -1,4 +1,4 @@ -prog Test8 { +prog Test8Err { def T{ [] Loc : (array,1) Rec : { diff --git a/Codes_en_COREC/testsErrors/test9Err.corec b/Codes_en_COREC/testsErrors/test9Err.corec index 34a1d28..041b672 100644 --- a/Codes_en_COREC/testsErrors/test9Err.corec +++ b/Codes_en_COREC/testsErrors/test9Err.corec @@ -1,4 +1,4 @@ -prog Test9 { +prog Test9Err { def Main{ Loc : (array,5) Rec : { diff --git a/Makefile b/Makefile index a148896..c2aff38 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ test_corec: allDev ./$(Compilateur_COREC) -tos < $(DIR_IN)/ProdMat.corec > $(DIR_OUT)/output6.asm ./$(Compilateur_COREC) -tos < $(DIR_IN)/SystTriang.corec > $(DIR_OUT)/output7.asm -test: allDev +test: all ./$(Compilateur_COREC) -tos -o $(DIR_OUT)/output$(num).asm < $(DIR_IN)/tests/test$(num).corec testErr: all diff --git a/README.md b/README.md index 11d6a7e..7f8a3fb 100644 --- a/README.md +++ b/README.md @@ -37,18 +37,30 @@ sudo apt install bison Download [MARS : MIPS java simulator on moodle unistra](https://moodle.unistra.fr/pluginfile.php/916605/mod_folder/content/0/Mars4_5.jar?forcedownload=1). ## Implemented Features -### Branche gencode_1 +### Branch gencode_1 - Definition of local variable in the loc section of functions. **(TO DO :TRANSLATE IN MIPS)** - Affectation of float and integer value. **(TO DO :TRANSLATE IN MIPS)** - Print and printstr functions. **(TO DO :TRANSLATE IN MIPS)** -### Branche gencode_2 +### Branch gencode_2 - Operation on variable (except arrays) -> (+,-,*,/). **(TO DO :TRANSLATE IN MIPS)** - Assignement operation on variable (except arrays) -> (+=,-=,*=,/=). **(TO DO :TRANSLATE IN MIPS)** -### Branche gencode_3 +### Branch gencode_3-4 - Affectation and definition of local 1D array. **(TO DO :TRANSLATE IN MIPS)** - Operation with and on local 1D array. **(TO DO :TRANSLATE IN MIPS)** - print function works on array **(NEED TO VERIFY IF THE SHAPE IS GOOD)**. **(TO DO :TRANSLATE IN MIPS)** +- Multi dimensional array. **(TO BE SOON)** **(TO DO :TRANSLATE IN MIPS)** + +## To Do +- To be soon : Arrays are implictly float number. +- To be soon : Float are array of dim 1 and length 1. +1. Translate intermediate code of the gencode_1 branch in mips. +2. Translate intermediate code of the gencode_2 branch in mips. +3. Translate intermediate code of the gencode_3 branch in mips. +4. Add to the symtable in the beginning of the programm COREC key words (def, prog, Loc, Rec, ...) to recognize without the lex. + + + ## Makefile commands - `make` -> compile the source files - `compil` -> run project executable on the [input.txt file](./../input.txt), create and write the result on `output/output.asm` file. diff --git a/corec.l b/corec.l index d97b2c9..0935e26 100644 --- a/corec.l +++ b/corec.l @@ -64,21 +64,21 @@ in {return in_dom;} "%" {return mod;} ([0-9]*[[:alpha:]]+|[[:alpha:]])[[:alnum:]]* { - if ( yyleng > 31 ) + if ( yyleng > 63 ) fprintf(stderr,"Error at line %u: Identifier '%s' too long (> 31), truncated.\n",lineNumber,yytext); - strncpy(yylval.strval,yytext,31); - yylval.strval[31] = '\0'; + strncpy(yylval.strval,yytext,63); + yylval.strval[64] = '\0'; return ID; } ["]([^"]|[\\]["])*["] { if ( yyleng > 1023 ) fprintf(stderr,"Error at line %u: Identifier '%s' too long (> 1023), truncated\n",lineNumber,yytext); strncpy(yylval.strval,yytext,1023); - yylval.strval[1023] = '\0'; + yylval.strval[1024] = '\0'; return chaine; } -(([1-9][0-9]*)|0)[.][0-9]*[1-9] {yylval.floatval = atof(yytext); return flottant;} +(([1-9][0-9]*)|0)[.](([0-9]*[1-9])|[0]+) {yylval.floatval = atof(yytext); return flottant;} [1-9][0-9]*|0 {yylval.intval = atoi(yytext); return entier;} [[:space:]] ; diff --git a/corec.y b/corec.y index 67c4689..c2fd007 100644 --- a/corec.y +++ b/corec.y @@ -183,11 +183,19 @@ ARRAY : DLIST : DLIST comma E { + if($3.ptr->kind == CONSTANT_DOUBLE){ + fprintf(stderr, "Error at line %u in function '%s': Try to allocate an array with a float length value.\n",lineNumber,symb_scope_function->u.name); + exit(1); + } $$.ptr = newtemp(SYMTAB); gencode(CODE,BOP_PLUS,$$.ptr,$1.ptr,$3.ptr); } | E { + if($1.ptr->kind == CONSTANT_DOUBLE){ + fprintf(stderr, "Error at line %u in function '%s': Try to allocate an array with a float length value.\n",lineNumber,symb_scope_function->u.name); + exit(1); + } $$.ptr = $1.ptr; } ; @@ -447,13 +455,15 @@ ARRAYREF : ID left_bracket ELIST right_bracket // ELIST >= 0 && CONSTANT_INT if($3.ptr->kind == CONSTANT_DOUBLE){ - fprintf(stderr, "Error at line %u in function '%s': Array '%s' can not be reached with a float number\n",lineNumber,symb_scope_function->u.name,$1); + fprintf(stderr, "Error at line %u in function '%s': Array '%s' can not be accessed with a float number\n",lineNumber,symb_scope_function->u.name,$1); exit(1); } else if($3.ptr->kind == CONSTANT_INT){ - if($3.ptr->u.value_int >= $$.ptr1->u.arr.size->u.value_int){ - fprintf(stderr, "Error at line %u in function '%s': Array '%s' can not be reached with a number superior than the size of the array\n",lineNumber,symb_scope_function->u.name,$1); - exit(1); + if($$.ptr1->u.arr.size[0]->kind == CONSTANT_INT){ + if($3.ptr->u.value_int >= $$.ptr1->u.arr.size[0]->u.value_int){ + fprintf(stderr, "Error at line %u in function '%s': Array '%s' can not be accessed with a number superior than the size of the array\n",lineNumber,symb_scope_function->u.name,$1); + exit(1); + } } } diff --git a/docs/tests.md b/docs/tests.md index c218837..6094bc1 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -21,7 +21,9 @@ 7. Array isn't declared. 8. Scope of local array. 9. Out of range in a local array. -10. +10. Reached array memory with a float value. +11. Allocate a array with a float value. +12. ## Navigation Return to the main documentation -> [click here](./../README.md). \ No newline at end of file diff --git a/lib.c b/lib.c index ffe039f..8828fe3 100644 --- a/lib.c +++ b/lib.c @@ -4,8 +4,16 @@ struct symtable * symtable_new() { struct symtable * t = malloc(sizeof(struct symtable)); + if(t == NULL){ + fprintf(stderr,"Bug memory allocation failed\n"); + exit(1); + } t->capacity = 1024; t->symbols = malloc(t->capacity*sizeof(struct symbol)); + if(t->symbols == NULL){ + fprintf(stderr,"Bug memory allocation failed\n"); + exit(1); + } t->temporary = 0; t->size = 0; return t; @@ -25,7 +33,13 @@ static void symtable_grow(struct symtable * t) struct symbol* symtable_const_int(struct symtable * t, long int v) { unsigned int i; - for ( i=0 ; i<t->size && t->symbols[i].u.value_int != v; i++ ); + for ( i=0 ; i<t->size; i++ ){ + if(t->symbols[i].kind == CONSTANT_INT){ + if(t->symbols[i].u.value_int == v){ + break; + } + } + } if(i==t->size) { if(t->size==t->capacity) @@ -45,7 +59,13 @@ struct symbol* symtable_const_int(struct symtable * t, long int v) struct symbol* symtable_const_double(struct symtable * t, double v) { unsigned int i; - for ( i=0 ; i<t->size && t->symbols[i].u.value_double != v; i++ ); + for ( i=0 ; i<t->size; i++ ){ + if(t->symbols[i].kind == CONSTANT_DOUBLE){ + if(t->symbols[i].u.value_int == v){ + break; + } + } + } if(i==t->size) { if(t->size==t->capacity) @@ -118,7 +138,12 @@ struct symbol* symtable_put_array(struct symtable * t, const char * var_id, stru symtable_grow(t); struct symbol *s = &(t->symbols[t->size]); s->kind = ARRAY; - s->u.arr.size = size; + s->u.arr.size = (struct symbol**) calloc(5,sizeof(struct symbol*)); + if(s->u.arr.size == NULL){ + fprintf(stderr,"Bug memory allocation failed\n"); + exit(1); + } + s->u.arr.size[0] = size; strcpy(s->u.arr.name,var_id); strcpy(s->scope_function,func_id->u.name); ++ (t->size); @@ -142,15 +167,15 @@ void symtable_dump(struct symtable * t, FILE* fout) fprintf(fout,"# %p = %s\n",&(t->symbols[i]),t->symbols[i].u.chaine); else if(t->symbols[i].kind==ARRAY){ fprintf(fout,"# %p = (%s,",&(t->symbols[i]),t->symbols[i].u.arr.name); - if(t->symbols[i].u.arr.size->kind == NAME_LOC || t->symbols[i].u.arr.size->kind == NAME) - fprintf(fout,"%s",t->symbols[i].u.arr.size->u.name); - else if(t->symbols[i].u.arr.size->kind == CONSTANT_INT) - fprintf(fout,"%ld",t->symbols[i].u.arr.size->u.value_int); - else if(t->symbols[i].u.arr.size->kind == CONSTANT_DOUBLE) - fprintf(fout,"%0.2lf",t->symbols[i].u.arr.size->u.value_double); + if(t->symbols[i].u.arr.size[0]->kind == NAME_LOC || t->symbols[i].u.arr.size[0]->kind == NAME) + fprintf(fout,"%s",t->symbols[i].u.arr.size[0]->u.name); + else if(t->symbols[i].u.arr.size[0]->kind == CONSTANT_INT) + fprintf(fout,"%ld",t->symbols[i].u.arr.size[0]->u.value_int); + else if(t->symbols[i].u.arr.size[0]->kind == CONSTANT_DOUBLE) + fprintf(fout,"%0.2lf",t->symbols[i].u.arr.size[0]->u.value_double); else{ - printf("BUG array size kind:%d\n",t->symbols[i].u.arr.size->kind); - exit(1); + printf("BUG array size kind:%d\n",t->symbols[i].u.arr.size[0]->kind); + exit(1); } fprintf(fout,") (in the scope of the '%s' function)\n",t->symbols[i].scope_function); } @@ -160,6 +185,12 @@ void symtable_dump(struct symtable * t, FILE* fout) void symtable_free(struct symtable * t) { + for (unsigned int i=0 ; i<t->size; i++ ){ + if(t->symbols[i].kind == ARRAY){ + if(t->symbols[i].u.arr.size != NULL) + free(t->symbols[i].u.arr.size); + } + } free(t->symbols); free(t); } diff --git a/lib.h b/lib.h index c5f2003..0201f5c 100644 --- a/lib.h +++ b/lib.h @@ -8,12 +8,12 @@ extern struct symbol* symb_scope_function; /* TABLE DES SYMBOLES */ -typedef char name_t[32]; +typedef char name_t[64]; typedef char name_64_t[1024]; struct array { name_t name; - struct symbol* size; + struct symbol** size; }; // Struct symbol -> store a symbol -- GitLab From a47a62a365c81bcfb8566951dd784ebd05c018f9 Mon Sep 17 00:00:00 2001 From: Audric Bonneau <audric.bonneau@etu.unistra.fr> Date: Tue, 24 Dec 2024 12:33:18 +0100 Subject: [PATCH 2/5] Nv tests err sur les arrays --- Codes_en_COREC/tests/test13.corec | 1 + Codes_en_COREC/testsErrors/test10Err.corec | 8 ++++++++ Codes_en_COREC/testsErrors/test11Err.corec | 8 ++++++++ 3 files changed, 17 insertions(+) create mode 100644 Codes_en_COREC/tests/test13.corec create mode 100644 Codes_en_COREC/testsErrors/test10Err.corec create mode 100644 Codes_en_COREC/testsErrors/test11Err.corec diff --git a/Codes_en_COREC/tests/test13.corec b/Codes_en_COREC/tests/test13.corec new file mode 100644 index 0000000..131ce31 --- /dev/null +++ b/Codes_en_COREC/tests/test13.corec @@ -0,0 +1 @@ +// Call function recursive diff --git a/Codes_en_COREC/testsErrors/test10Err.corec b/Codes_en_COREC/testsErrors/test10Err.corec new file mode 100644 index 0000000..fcbe86b --- /dev/null +++ b/Codes_en_COREC/testsErrors/test10Err.corec @@ -0,0 +1,8 @@ +prog Test10Err { + def Main{ + Loc : (array,5) + Rec : { + array[2.0] = 2 + } + } +} diff --git a/Codes_en_COREC/testsErrors/test11Err.corec b/Codes_en_COREC/testsErrors/test11Err.corec new file mode 100644 index 0000000..55d50b4 --- /dev/null +++ b/Codes_en_COREC/testsErrors/test11Err.corec @@ -0,0 +1,8 @@ +prog Test11Err { + def Main{ + Loc : (array,2.3) + Rec : { + array[2] = 2 + } + } +} -- GitLab From 58c1b8ca0381e8e47cbaa04b08d67703a6eca47d Mon Sep 17 00:00:00 2001 From: Audric Bonneau <audric.bonneau@etu.unistra.fr> Date: Tue, 24 Dec 2024 14:42:03 +0100 Subject: [PATCH 3/5] =?UTF-8?q?Update=20la=20fa=C3=A7on=20de=20print=20les?= =?UTF-8?q?=20arrays?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Codes_en_COREC/2mm.corec | 6 +++--- Codes_en_COREC/Fact.corec | 2 +- Codes_en_COREC/Fibonacci.corec | 4 ++-- Codes_en_COREC/tests/test4.corec | 19 ++++++------------- corec.y | 18 +++++++++--------- docs/projet_sujet.pdf | Bin 369477 -> 369458 bytes 6 files changed, 21 insertions(+), 28 deletions(-) diff --git a/Codes_en_COREC/2mm.corec b/Codes_en_COREC/2mm.corec index 7a33612..c00888f 100644 --- a/Codes_en_COREC/2mm.corec +++ b/Codes_en_COREC/2mm.corec @@ -21,7 +21,7 @@ prog 2mm { Rec: d[i,j]=(i*(j+2) % NK) / NK } - def Eq1 { [in: (a,NI,NK), (b,NK,NJ), NI,NJ,NK, alpha; out: (tmp,NI,NJ)] + def Eq1 { [in: (a,NI,NK), (b,NK,NJ), NI,NJ,NK, (alpha,1); out: (tmp,NI,NJ)] Dom: i in [0..NI-1], j in [0..NJ-1], k in [0..NK-1] Rec: { k==0?tmp[i,j]=0: ; @@ -29,7 +29,7 @@ prog 2mm { } } - def Eq2 { [in: (c,NJ,NL), (tmp,NI,NJ), NI,NJ,NL, beta; inout: (d,NI,NL)] + def Eq2 { [in: (c,NJ,NL), (tmp,NI,NJ), NI,NJ,NL, (beta,1); inout: (d,NI,NL)] Dom: i in [0..NI-1], j in [0..NL-1], k in [0..NJ-1] Rec: { k==0?d[i,j]*=beta: ; @@ -38,7 +38,7 @@ prog 2mm { } def Main { - Loc: alpha=1.5, beta=1.2, + Loc: (alpha,1)=1.5, (beta,1)=1.2, NI,NJ,NK,NL Rec: { printstr("Entrez une valeur entière NI : "); diff --git a/Codes_en_COREC/Fact.corec b/Codes_en_COREC/Fact.corec index 0167b56..34b25ae 100644 --- a/Codes_en_COREC/Fact.corec +++ b/Codes_en_COREC/Fact.corec @@ -2,7 +2,7 @@ prog factorielle { def Fact { [in: N; out: (f,N)] Rec: N==0?f[N]=1:{ N=N-1; - f[N+1]=(N+1)*Fact + f[N+1]=(N+1)*OutFact(Fact) } } diff --git a/Codes_en_COREC/Fibonacci.corec b/Codes_en_COREC/Fibonacci.corec index 347f696..de0f045 100644 --- a/Codes_en_COREC/Fibonacci.corec +++ b/Codes_en_COREC/Fibonacci.corec @@ -3,9 +3,9 @@ prog fibonacci { Loc: N1,N2 Rec: N==0?f[N]=0:N==1?f[N]=1:{ N=N-1; - N1=Fib; + N1=OutFact(Fib); N=N-1; - N2=Fib; + N2=OutFact(Fib); f[N+2]=N1+N2 } } diff --git a/Codes_en_COREC/tests/test4.corec b/Codes_en_COREC/tests/test4.corec index 48f52ec..8e30620 100644 --- a/Codes_en_COREC/tests/test4.corec +++ b/Codes_en_COREC/tests/test4.corec @@ -8,45 +8,38 @@ prog Test4 { array[0] += 2; printstr("Attendu 4 :"); - print((array,3)); array[0] -= 2; printstr("Attendu 2 :"); - print((array,3)); array[0] /= 2; printstr("Attendu 1 :"); - print((array,3)); array[0] *= 2; printstr("Attendu 2 :"); - print((array,3)); + + print(array); array[1] = array[0] + 3; printstr("Attendu 5 :"); - print((array,3)); - array[1] = array[0] - 3; printstr("Attendu 2 :"); - print((array,3)); array[1] = array[0] / 3; printstr("Attendu 0.66 :"); - print((array,3)); array[1] = array[0] * 3; printstr("Attendu 2.00 :"); - print((array,3)); + + print(array); array[2] = array[0] + array[1]; printstr("Attendu 4 :"); - print((array,3)); array[2] = array[0] - array[1]; printstr("Attendu 0 :"); - print((array,3)); array[2] = array[0] / array[1]; printstr("Attendu 1 :"); - print((array,3)); array[2] = array[0] * array[1]; printstr("Attendu 4 :"); - print((array,3)) + + print(array) } } } diff --git a/corec.y b/corec.y index c2fd007..e854ae8 100644 --- a/corec.y +++ b/corec.y @@ -7,6 +7,8 @@ extern int yylex(); struct symbol* symb_scope_function; +uint8_t isPrintCall = 0; + %} %define parse.error verbose @@ -261,14 +263,10 @@ I : | AFFECTATION | CALL // appel de fonction | read_f left_parenthesis ID right_parenthesis - | print left_parenthesis CALL right_parenthesis - { - gencode(CODE,CALL_PRINT,$3.ptr,NULL,NULL); - } - | print left_parenthesis ARRAY right_parenthesis - { - gencode(CODE,CALL_PRINT,$3.ptr1,NULL,NULL); - } + | print left_parenthesis {isPrintCall = 1;} CALL right_parenthesis + { + gencode(CODE,CALL_PRINT,$4.ptr,NULL,NULL); + } | print left_parenthesis PRECINST right_parenthesis | printstr left_parenthesis chaine right_parenthesis { @@ -424,13 +422,15 @@ CALL : exit(1); } - if(id->kind == ARRAY){ + if(id->kind == ARRAY && !isPrintCall){ $$.ptr = newtemp(SYMTAB); struct symbol* const_0 = symtable_const_int(SYMTAB,0); gencode(CODE,COPY_ARRAY,$$.ptr,id,const_0); } else $$.ptr = id; + + isPrintCall = 0; } ; LCALL : diff --git a/docs/projet_sujet.pdf b/docs/projet_sujet.pdf index 9de81b705c8eb1cb867bb0141975443b75bc67f0..71d84338e4ba5bdec7b89196bd3505b8b2e05420 100644 GIT binary patch delta 13769 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 delta 13782 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 -- GitLab From edf4f958c7c145b5d75ad8b273e207a05a8b1f60 Mon Sep 17 00:00:00 2001 From: Audric Bonneau <audric.bonneau@etu.unistra.fr> Date: Tue, 24 Dec 2024 14:50:37 +0100 Subject: [PATCH 4/5] Update test pour init les flottants comme des tableaux --- Codes_en_COREC/tests/test1.corec | 2 +- Codes_en_COREC/tests/test3.corec | 12 ++++++---- Codes_en_COREC/tests/test4.corec | 41 ++++++++++++++++---------------- corec.l | 18 +++++++------- corecDev.l | 36 ++++++++++++++-------------- 5 files changed, 55 insertions(+), 54 deletions(-) diff --git a/Codes_en_COREC/tests/test1.corec b/Codes_en_COREC/tests/test1.corec index b0af3f5..d8c7220 100644 --- a/Codes_en_COREC/tests/test1.corec +++ b/Codes_en_COREC/tests/test1.corec @@ -5,7 +5,7 @@ prog Test1 { Loc : a, c=2, b Rec : { a = 10; - b = 2.2; + b = 2; printstr("Affichage de variables, a: "); print(a); diff --git a/Codes_en_COREC/tests/test3.corec b/Codes_en_COREC/tests/test3.corec index 26783eb..44a6266 100644 --- a/Codes_en_COREC/tests/test3.corec +++ b/Codes_en_COREC/tests/test3.corec @@ -2,20 +2,22 @@ prog Test3 { def Main{ - Loc : (array1,5), (array2,2+4/2) + Loc : (array1,5), (array2,2+4/2), (f,1) Rec : { - array1 = 1.0; // Implicitement array1[0] + array1 = 1; // Implicitement array1[0] array1[4] = 2; - array2[0] = 1.15; + f = 1.15; // Implicit array of dim 1 length 1 -> f[0] + array2[0] = f; array2[1] = 5; array1[3] = array2[1]; - array1[2] = 1; + f[0] = 1.0; // Implicit array of dim 1 length 1 -> f[0] + array1[2] = f; - print((array1,5)) + print(array1) } } } diff --git a/Codes_en_COREC/tests/test4.corec b/Codes_en_COREC/tests/test4.corec index 8e30620..8c91d74 100644 --- a/Codes_en_COREC/tests/test4.corec +++ b/Codes_en_COREC/tests/test4.corec @@ -2,42 +2,41 @@ prog Test4 { def Main{ - Loc : (array,3) + Loc : (array,6) Rec : { array[0] = 2; array[0] += 2; - printstr("Attendu 4 :"); - array[0] -= 2; - printstr("Attendu 2 :"); - array[0] /= 2; - printstr("Attendu 1 :"); - array[0] *= 2; - printstr("Attendu 2 :"); + printstr("Attendu 4.00"); + array[1] -= 2; + printstr("Attendu 2.00"); + array[2] /= 2; + printstr("Attendu 1.00"); + array[3] *= 2; + printstr("Attendu 2.00"); print(array); array[1] = array[0] + 3; - printstr("Attendu 5 :"); - array[1] = array[0] - 3; - printstr("Attendu 2 :"); + printstr("Attendu 5.00 :"); + array[2] = array[0] - 3; + printstr("Attendu 2.00 :"); - array[1] = array[0] / 3; + array[3] = array[0] / 3; printstr("Attendu 0.66 :"); - array[1] = array[0] * 3; + array[4] = array[0] * 3; printstr("Attendu 2.00 :"); print(array); - array[2] = array[0] + array[1]; - printstr("Attendu 4 :"); - array[2] = array[0] - array[1]; - printstr("Attendu 0 :"); - array[2] = array[0] / array[1]; - printstr("Attendu 1 :"); - array[2] = array[0] * array[1]; - printstr("Attendu 4 :"); + printstr("Attendu 4.00 :"); + array[3] = array[0] - array[1]; + printstr("Attendu 0.00 :"); + array[4] = array[0] / array[1]; + printstr("Attendu 1.00 :"); + array[5] = array[0] * array[1]; + printstr("Attendu 4.00 :"); print(array) } diff --git a/corec.l b/corec.l index 0935e26..572b155 100644 --- a/corec.l +++ b/corec.l @@ -70,16 +70,16 @@ in {return in_dom;} yylval.strval[64] = '\0'; return ID; } -["]([^"]|[\\]["])*["] { - if ( yyleng > 1023 ) - fprintf(stderr,"Error at line %u: Identifier '%s' too long (> 1023), truncated\n",lineNumber,yytext); - strncpy(yylval.strval,yytext,1023); - yylval.strval[1024] = '\0'; - return chaine; - } +["]([^"]|[\\]["])*["] { + if ( yyleng > 1023 ) + fprintf(stderr,"Error at line %u: Identifier '%s' too long (> 1023), truncated\n",lineNumber,yytext); + strncpy(yylval.strval,yytext,1023); + yylval.strval[1024] = '\0'; + return chaine; + } -(([1-9][0-9]*)|0)[.](([0-9]*[1-9])|[0]+) {yylval.floatval = atof(yytext); return flottant;} -[1-9][0-9]*|0 {yylval.intval = atoi(yytext); return entier;} +(([1-9][0-9]*)|0)[.](([0-9]*[1-9])|[0]+) {yylval.floatval = atof(yytext); return flottant;} +[1-9][0-9]*|0 {yylval.intval = atoi(yytext); return entier;} [[:space:]] ; diff --git a/corecDev.l b/corecDev.l index 47e8981..3e0143e 100644 --- a/corecDev.l +++ b/corecDev.l @@ -63,24 +63,24 @@ in {printf("in_dom"); return in_dom;} "/" {printf("divide"); return divide;} "%" {printf("mod"); return mod;} -([0-9]*[[:alpha:]]+|[[:alpha:]])[[:alnum:]]* { - printf("ID"); - if ( yyleng > 31 ) - fprintf(stderr,"Error at line %u: Identifier '%s' too long (> 31), truncated.\n",lineNumber,yytext); - strncpy(yylval.strval,yytext,31); - yylval.strval[31] = '\0'; - return ID; - } -["]([^"]|[\\]["])*["] { - printf("chaine"); - if ( yyleng > 1023 ) - fprintf(stderr,"Error at line %u: Identifier '%s' too long (> 1023), truncated\n",lineNumber,yytext); - strncpy(yylval.strval,yytext,1023); - yylval.strval[1023] = '\0'; - return chaine; - } -(([1-9][0-9]*)|0)[.][0-9]*[1-9] {printf("flottant"); yylval.floatval = atof(yytext); return flottant;} -[1-9][0-9]*|0 {printf("entier"); yylval.intval = atoi(yytext); return entier;} +([0-9]*[[:alpha:]]+|[[:alpha:]])[[:alnum:]]* { + printf("ID"); + if ( yyleng > 63 ) + fprintf(stderr,"Error at line %u: Identifier '%s' too long (> 31), truncated.\n",lineNumber,yytext); + strncpy(yylval.strval,yytext,63); + yylval.strval[64] = '\0'; + return ID; + } +["]([^"]|[\\]["])*["] { + printf("chaine"); + if ( yyleng > 1023 ) + fprintf(stderr,"Error at line %u: Identifier '%s' too long (> 1023), truncated\n",lineNumber,yytext); + strncpy(yylval.strval,yytext,1023); + yylval.strval[1023] = '\0'; + return chaine; + } +(([1-9][0-9]*)|0)[.](([0-9]*[1-9])|[0]+) {printf("flottant"); yylval.floatval = atof(yytext); return flottant;} +[1-9][0-9]*|0 {printf("entier"); yylval.intval = atoi(yytext); return entier;} [[:space:]] {printf(" ");} -- GitLab From ac4b1b0b205cb9747a0e44fcf05bf17aa0428479 Mon Sep 17 00:00:00 2001 From: Audric Bonneau <audric.bonneau@etu.unistra.fr> Date: Tue, 24 Dec 2024 19:32:22 +0100 Subject: [PATCH 5/5] Float var as singleton array --- Codes_en_COREC/tests/test4.corec | 14 ++-- Codes_en_COREC/tests/test5.corec | 47 +----------- Codes_en_COREC/testsErrors/test12Err.corec | 8 ++ Codes_en_COREC/testsErrors/test13Err.corec | 9 +++ Codes_en_COREC/testsErrors/test14Err.corec | 9 +++ Codes_en_COREC/testsErrors/test15Err.corec | 8 ++ Codes_en_COREC/testsErrors/test16Err.corec | 8 ++ Codes_en_COREC/testsErrors/test3Err.corec | 2 +- Codes_en_COREC/testsErrors/test4Err.corec | 2 +- Codes_en_COREC/testsErrors/test5Err.corec | 4 +- README.md | 7 +- corec.y | 89 +++++++++++++++++++--- docs/tests.md | 6 +- lib.c | 24 +++--- lib.h | 8 +- 15 files changed, 158 insertions(+), 87 deletions(-) create mode 100644 Codes_en_COREC/testsErrors/test12Err.corec create mode 100644 Codes_en_COREC/testsErrors/test13Err.corec create mode 100644 Codes_en_COREC/testsErrors/test14Err.corec create mode 100644 Codes_en_COREC/testsErrors/test15Err.corec create mode 100644 Codes_en_COREC/testsErrors/test16Err.corec diff --git a/Codes_en_COREC/tests/test4.corec b/Codes_en_COREC/tests/test4.corec index 8c91d74..61dfdca 100644 --- a/Codes_en_COREC/tests/test4.corec +++ b/Codes_en_COREC/tests/test4.corec @@ -2,11 +2,11 @@ prog Test4 { def Main{ - Loc : (array,6) + Loc : (array,6), (float,1), float=3.0 Rec : { - array[0] = 2; + array = 2; - array[0] += 2; + array += float; printstr("Attendu 4.00"); array[1] -= 2; printstr("Attendu 2.00"); @@ -17,14 +17,14 @@ prog Test4 { print(array); - array[1] = array[0] + 3; + array[1] = array[0] + float; printstr("Attendu 5.00 :"); - array[2] = array[0] - 3; + array[2] = array[0] - float; printstr("Attendu 2.00 :"); - array[3] = array[0] / 3; + array[3] = array[0] / float; printstr("Attendu 0.66 :"); - array[4] = array[0] * 3; + array[4] = array[0] * float; printstr("Attendu 2.00 :"); print(array); diff --git a/Codes_en_COREC/tests/test5.corec b/Codes_en_COREC/tests/test5.corec index cf9ee6e..5adf5de 100644 --- a/Codes_en_COREC/tests/test5.corec +++ b/Codes_en_COREC/tests/test5.corec @@ -1,52 +1,9 @@ // Opp on arrays -prog Test4 { +prog Test5 { def Main{ - Loc : (array,3) Rec : { - array[0] = 2; - - array[0] += 2; - printstr("Attendu 4 :"); - print((array,3)); - array[0] -= 2; - printstr("Attendu 2 :"); - print((array,3)); - array[0] /= 2; - printstr("Attendu 1 :"); - print((array,3)); - array[0] *= 2; - printstr("Attendu 2 :"); - print((array,3)); - - array[1] = array[0] + 3; - printstr("Attendu 5 :"); - print((array,3)); - - array[1] = array[0] - 3; - printstr("Attendu 2 :"); - print((array,3)); - - array[1] = array[0] / 3; - printstr("Attendu 0.66 :"); - print((array,3)); - array[1] = array[0] * 3; - printstr("Attendu 2.00 :"); - print((array,3)); - - - array[2] = array[0] + array[1]; - printstr("Attendu 4 :"); - print((array,3)); - array[2] = array[0] - array[1]; - printstr("Attendu 0 :"); - print((array,3)); - array[2] = array[0] / array[1]; - printstr("Attendu 1 :"); - print((array,3)); - array[2] = array[0] * array[1]; - printstr("Attendu 4 :"); - print((array,3)) + printstr("A faire") } } } diff --git a/Codes_en_COREC/testsErrors/test12Err.corec b/Codes_en_COREC/testsErrors/test12Err.corec new file mode 100644 index 0000000..6019f03 --- /dev/null +++ b/Codes_en_COREC/testsErrors/test12Err.corec @@ -0,0 +1,8 @@ +prog Test12Err { + def Main{ + Loc : a = 1.2 + Rec : { + print(a) + } + } +} diff --git a/Codes_en_COREC/testsErrors/test13Err.corec b/Codes_en_COREC/testsErrors/test13Err.corec new file mode 100644 index 0000000..62483c8 --- /dev/null +++ b/Codes_en_COREC/testsErrors/test13Err.corec @@ -0,0 +1,9 @@ +prog Test13Err { + def Main{ + Loc : a = 1 + Rec : { + a = 2.1 * 1; + print(a) + } + } +} diff --git a/Codes_en_COREC/testsErrors/test14Err.corec b/Codes_en_COREC/testsErrors/test14Err.corec new file mode 100644 index 0000000..993583b --- /dev/null +++ b/Codes_en_COREC/testsErrors/test14Err.corec @@ -0,0 +1,9 @@ +prog Test14Err { + def Main{ + Loc : a = 1 + Rec : { + a += 2.1; + print(a) + } + } +} diff --git a/Codes_en_COREC/testsErrors/test15Err.corec b/Codes_en_COREC/testsErrors/test15Err.corec new file mode 100644 index 0000000..82dd8a0 --- /dev/null +++ b/Codes_en_COREC/testsErrors/test15Err.corec @@ -0,0 +1,8 @@ +prog Test15Err { + def Main{ + Loc : a, a = 1.2 + Rec : { + print(a) + } + } +} diff --git a/Codes_en_COREC/testsErrors/test16Err.corec b/Codes_en_COREC/testsErrors/test16Err.corec new file mode 100644 index 0000000..483ecbf --- /dev/null +++ b/Codes_en_COREC/testsErrors/test16Err.corec @@ -0,0 +1,8 @@ +prog Test16Err { + def Main{ + Loc : (a,1), a=2.0, b = a + Rec : { + print(b) + } + } +} diff --git a/Codes_en_COREC/testsErrors/test3Err.corec b/Codes_en_COREC/testsErrors/test3Err.corec index 4588040..eebb8b3 100644 --- a/Codes_en_COREC/testsErrors/test3Err.corec +++ b/Codes_en_COREC/testsErrors/test3Err.corec @@ -3,7 +3,7 @@ prog Test3Err { Loc : a, a=2, b // a deja declaré Rec : { a = 10; - b = 2.2; + b = 2; printstr("Affichage de variables, a: "); print(a); diff --git a/Codes_en_COREC/testsErrors/test4Err.corec b/Codes_en_COREC/testsErrors/test4Err.corec index 4debeec..fdee3ae 100644 --- a/Codes_en_COREC/testsErrors/test4Err.corec +++ b/Codes_en_COREC/testsErrors/test4Err.corec @@ -3,7 +3,7 @@ prog Test4Err { Loc : a, c=2, b Rec : { a = 10; - b = 2.2; + b = 2; printstr("Affichage de variables, a: "); print(a); diff --git a/Codes_en_COREC/testsErrors/test5Err.corec b/Codes_en_COREC/testsErrors/test5Err.corec index 4ba3547..435750f 100644 --- a/Codes_en_COREC/testsErrors/test5Err.corec +++ b/Codes_en_COREC/testsErrors/test5Err.corec @@ -3,7 +3,7 @@ prog Test5Err { Loc : a, c=2, b Rec : { a = 10; - b = 2.2; + b = 2; printstr("Affichage de variables, a: "); print(a); @@ -19,7 +19,7 @@ prog Test5Err { Loc : a, c=2, b Rec : { a = 10; - b = 2.2; + b = 2; printstr("Affichage de variables, a: "); print(a); diff --git a/README.md b/README.md index 7f8a3fb..c1407c9 100644 --- a/README.md +++ b/README.md @@ -38,8 +38,8 @@ sudo apt install bison ## Implemented Features ### Branch gencode_1 -- Definition of local variable in the loc section of functions. **(TO DO :TRANSLATE IN MIPS)** -- Affectation of float and integer value. **(TO DO :TRANSLATE IN MIPS)** +- Definition of local variable in the loc section of functions. **(TO DO :TRANSLATE IN MIPS but do not do here the float value)** +- Affectation of integer value. **(TO DO :TRANSLATE IN MIPS but do not do here the float value)** - Print and printstr functions. **(TO DO :TRANSLATE IN MIPS)** ### Branch gencode_2 - Operation on variable (except arrays) -> (+,-,*,/). **(TO DO :TRANSLATE IN MIPS)** @@ -47,8 +47,9 @@ sudo apt install bison ### Branch gencode_3-4 - Affectation and definition of local 1D array. **(TO DO :TRANSLATE IN MIPS)** - Operation with and on local 1D array. **(TO DO :TRANSLATE IN MIPS)** -- print function works on array **(NEED TO VERIFY IF THE SHAPE IS GOOD)**. **(TO DO :TRANSLATE IN MIPS)** +- print function works on array. **(TO DO :TRANSLATE IN MIPS)** +- float value as singleton array. **(TO DO :TRANSLATE IN MIPS)** - Multi dimensional array. **(TO BE SOON)** **(TO DO :TRANSLATE IN MIPS)** ## To Do diff --git a/corec.y b/corec.y index e854ae8..cffcb34 100644 --- a/corec.y +++ b/corec.y @@ -24,6 +24,11 @@ uint8_t isPrintCall = 0; struct symbol* ptr; } ptrVal; + struct { + struct symbol* ptr; + uint8_t isEArray; + } ptrValE; + struct { struct symbol* ptr1; struct symbol* ptr2; @@ -92,7 +97,8 @@ uint8_t isPrintCall = 0; %left mult divide mod %right usub formatmod -%type <ptrVal> F T E CALL DLIST ELIST +%type <ptrVal> DLIST ELIST +%type <ptrValE> E T F CALL %type <ptrArray> ARRAYREF ARRAY %type <opaff> OPAFF @@ -155,14 +161,44 @@ DECL : id = symtable_put_loc(SYMTAB,$1,symb_scope_function); } | ID aff E - { + { struct symbol* id = symtable_get(SYMTAB,$1,symb_scope_function); - if ( id != NULL ){ - fprintf(stderr, "Error at line %u in function '%s': Variable '%s' is already declared.\n",lineNumber,symb_scope_function->u.name,$1); - exit(1); + if($3.ptr->kind == CONSTANT_FLOAT){ // Test if affectation a float to an array + fprintf(fname,"FLOAT LOC\n"); + if(id == NULL){ + fprintf(stderr, "Error at line %u in function '%s': Try to declare variable '%s' as an float (array of dimension and lenght 1) but the size isn't declare. You may prefer to do this : '(%s,1), '%s'=%0.2f'.\n",lineNumber,symb_scope_function->u.name,$1,$1,$1,$3.ptr->u.value_float); + exit(1); + } + else if(id->kind != ARRAY){ + fprintf(stderr, "Error at line %u in function '%s': Try assigning at variable '%s' a float value (an array of dimension and lenght 1) but '%s' isn't a float variable.\n",lineNumber,symb_scope_function->u.name,$1,$1); + exit(1); + } + } + else if($3.ptr->kind == ARRAY || $3.isEArray){ + if(id == NULL){ + fprintf(stderr, "Error at line %u in function '%s': Try to declare variable '%s' as an integer but the affectation value is an array.\n",lineNumber,symb_scope_function->u.name,$1); + exit(1); + } + else if(id->kind != ARRAY){ + fprintf(stderr, "Error at line %u in function '%s': Try assigning an array variable '%s' to a non array type variable '%s'.\n",lineNumber,symb_scope_function->u.name,$3.ptr->u.arr.name,$1); + exit(1); + } } - id = symtable_put_loc(SYMTAB,$1,symb_scope_function); - gencode(CODE,COPY,id,$3.ptr,NULL); + else{ // Test if affectation value isn't a float and array + if (id != NULL){ + fprintf(stderr, "Error at line %u in function '%s': Variable '%s' is already declared.\n",lineNumber,symb_scope_function->u.name,$1); + exit(1); + } + + id = symtable_put_loc(SYMTAB,$1,symb_scope_function); + } + + if(id->kind == ARRAY){ // Handle if ID is an implicit array(array -> array[0]) + struct symbol* const_0 = symtable_const_int(SYMTAB,0); + gencode(CODE,AFF_ARRAY,id,const_0,$3.ptr); + } + else + gencode(CODE,COPY,id,$3.ptr,NULL); } | ARRAY { @@ -185,7 +221,7 @@ ARRAY : DLIST : DLIST comma E { - if($3.ptr->kind == CONSTANT_DOUBLE){ + if($3.ptr->kind == CONSTANT_FLOAT){ fprintf(stderr, "Error at line %u in function '%s': Try to allocate an array with a float length value.\n",lineNumber,symb_scope_function->u.name); exit(1); } @@ -194,7 +230,7 @@ DLIST : } | E { - if($1.ptr->kind == CONSTANT_DOUBLE){ + if($1.ptr->kind == CONSTANT_FLOAT){ fprintf(stderr, "Error at line %u in function '%s': Try to allocate an array with a float length value.\n",lineNumber,symb_scope_function->u.name); exit(1); } @@ -331,7 +367,7 @@ AFFECTATION : break; case 5: - fprintf(stderr, "Error at line %u: Unrecognized operation assignment (only +=, -=, *= and /= are possible).\n",lineNumber-1); + fprintf(stderr, "Error at line %u in function '%s': Unrecognized operation assignment (only +=, -=, *= and /= are possible).\n",lineNumber-1,symb_scope_function->u.name); exit(1); break; @@ -345,6 +381,11 @@ AFFECTATION : } | ID OPAFF E { + if($3.ptr->kind == CONSTANT_FLOAT){ + fprintf(stderr, "Error at line %u in function '%s': Cannot affect an float to an non array variable '%s'.\n",lineNumber-1,symb_scope_function->u.name,$1); + exit(1); + } + // Get the variable ID struct symbol* id = symtable_get(SYMTAB,$1,symb_scope_function); if ( id == NULL ){ @@ -416,6 +457,7 @@ CALL : | ID { // Appel de variable + struct symbol* id = symtable_get(SYMTAB,$1,symb_scope_function); if ( id == NULL ){ fprintf(stderr, "Error at line %u in function '%s': Variable '%s' is not declared, neither as an argument, nor as a local variable.\n",lineNumber,symb_scope_function->u.name,$1); @@ -423,6 +465,7 @@ CALL : } if(id->kind == ARRAY && !isPrintCall){ + $$.isEArray = 1; $$.ptr = newtemp(SYMTAB); struct symbol* const_0 = symtable_const_int(SYMTAB,0); gencode(CODE,COPY_ARRAY,$$.ptr,id,const_0); @@ -454,7 +497,7 @@ ARRAYREF : ID left_bracket ELIST right_bracket } // ELIST >= 0 && CONSTANT_INT - if($3.ptr->kind == CONSTANT_DOUBLE){ + if($3.ptr->kind == CONSTANT_FLOAT){ fprintf(stderr, "Error at line %u in function '%s': Array '%s' can not be accessed with a float number\n",lineNumber,symb_scope_function->u.name,$1); exit(1); } @@ -487,11 +530,19 @@ ELIST : E : E plus T { + if($1.ptr->kind != $3.ptr->kind && ($3.ptr->kind == CONSTANT_INT || $3.ptr->kind==CONSTANT_FLOAT) && ($1.ptr->kind == CONSTANT_INT || $1.ptr->kind==CONSTANT_FLOAT) ){ + fprintf(stderr, "Error at line %u in function '%s': Try to perfom an operation with two operands of differents types.\n",lineNumber,symb_scope_function->u.name); + exit(1); + } $$.ptr = newtemp(SYMTAB); gencode(CODE,BOP_PLUS,$$.ptr,$1.ptr,$3.ptr); } | E sub T { + if($1.ptr->kind != $3.ptr->kind && ($3.ptr->kind == CONSTANT_INT || $3.ptr->kind==CONSTANT_FLOAT) && ($1.ptr->kind == CONSTANT_INT || $1.ptr->kind==CONSTANT_FLOAT) ){ + fprintf(stderr, "Error at line %u in function '%s': Try to perfom an operation with two operands of differents types.\n",lineNumber,symb_scope_function->u.name); + exit(1); + } $$.ptr = newtemp(SYMTAB); gencode(CODE,BOP_MINUS,$$.ptr,$1.ptr,$3.ptr); } @@ -503,28 +554,42 @@ E : | T { $$.ptr = $1.ptr; + $$.isEArray = $1.isEArray; } ; T : T mult F { + if($1.ptr->kind != $3.ptr->kind && ($3.ptr->kind == CONSTANT_INT || $3.ptr->kind==CONSTANT_FLOAT) && ($1.ptr->kind == CONSTANT_INT || $1.ptr->kind==CONSTANT_FLOAT) ){ + fprintf(stderr, "Error at line %u in function '%s': Try to perfom an operation with two operands of differents types.\n",lineNumber,symb_scope_function->u.name); + exit(1); + } $$.ptr = newtemp(SYMTAB); gencode(CODE,BOP_MULT,$$.ptr,$1.ptr,$3.ptr); } | T divide F { + if($1.ptr->kind != $3.ptr->kind && ($3.ptr->kind == CONSTANT_INT || $3.ptr->kind==CONSTANT_FLOAT) && ($1.ptr->kind == CONSTANT_INT || $1.ptr->kind==CONSTANT_FLOAT) ){ + fprintf(stderr, "Error at line %u in function '%s': Try to perfom an operation with two operands of differents types.\n",lineNumber,symb_scope_function->u.name); + exit(1); + } $$.ptr = newtemp(SYMTAB); gencode(CODE,BOP_DIV,$$.ptr,$1.ptr,$3.ptr); } | T mod F { + if($1.ptr->kind != $3.ptr->kind && ($3.ptr->kind == CONSTANT_INT || $3.ptr->kind==CONSTANT_FLOAT) && ($1.ptr->kind == CONSTANT_INT || $1.ptr->kind==CONSTANT_FLOAT) ){ + fprintf(stderr, "Error at line %u in function '%s': Try to perfom an operation with two operands of differents types.\n",lineNumber,symb_scope_function->u.name); + exit(1); + } $$.ptr = newtemp(SYMTAB); gencode(CODE,BOP_MOD,$$.ptr,$1.ptr,$3.ptr); } | F { $$.ptr = $1.ptr; + $$.isEArray = $1.isEArray; } ; @@ -535,10 +600,12 @@ F : } | CALL { + $$.isEArray = $1.isEArray; $$.ptr = $1.ptr; } | ARRAYREF { + $$.ptr = newtemp(SYMTAB); gencode(CODE,COPY_ARRAY,$$.ptr,$1.ptr1,$1.ptr2); } diff --git a/docs/tests.md b/docs/tests.md index 6094bc1..5777fa3 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -23,7 +23,11 @@ 9. Out of range in a local array. 10. Reached array memory with a float value. 11. Allocate a array with a float value. -12. +12. Float is array of dim 1, length 1. Defined in Loc a=FLOAT_VALUE should be OK only if before, the user has declared (a,1). +13. Same but an affectation assign a float value to an integer variable. +14. Try assigning a float value to a non-array variable. +15. Try assigning a float value to a non-array variable in Loc section. +16. Try assigning to a non array value an array. ## Navigation Return to the main documentation -> [click here](./../README.md). \ No newline at end of file diff --git a/lib.c b/lib.c index 8828fe3..a789a63 100644 --- a/lib.c +++ b/lib.c @@ -56,11 +56,11 @@ struct symbol* symtable_const_int(struct symtable * t, long int v) } } -struct symbol* symtable_const_double(struct symtable * t, double v) +struct symbol* symtable_const_double(struct symtable * t, float v) { unsigned int i; for ( i=0 ; i<t->size; i++ ){ - if(t->symbols[i].kind == CONSTANT_DOUBLE){ + if(t->symbols[i].kind == CONSTANT_FLOAT){ if(t->symbols[i].u.value_int == v){ break; } @@ -71,8 +71,8 @@ struct symbol* symtable_const_double(struct symtable * t, double v) if(t->size==t->capacity) symtable_grow(t); struct symbol *s = &(t->symbols[t->size]); - s->kind = CONSTANT_DOUBLE; - s->u.value_double = v; + s->kind = CONSTANT_FLOAT; + s->u.value_float = v; ++ (t->size); return s; } @@ -157,8 +157,8 @@ void symtable_dump(struct symtable * t, FILE* fout) { if(t->symbols[i].kind==CONSTANT_INT) fprintf(fout,"# %p = %ld\n",&(t->symbols[i]),t->symbols[i].u.value_int); - else if(t->symbols[i].kind==CONSTANT_DOUBLE) - fprintf(fout,"# %p = %0.2lf\n",&(t->symbols[i]),t->symbols[i].u.value_double); + else if(t->symbols[i].kind==CONSTANT_FLOAT) + fprintf(fout,"# %p = %0.2f\n",&(t->symbols[i]),t->symbols[i].u.value_float); else if(t->symbols[i].kind==NAME) fprintf(fout,"# %p = %s\n",&(t->symbols[i]),t->symbols[i].u.name); else if(t->symbols[i].kind==NAME_LOC) @@ -171,8 +171,8 @@ void symtable_dump(struct symtable * t, FILE* fout) fprintf(fout,"%s",t->symbols[i].u.arr.size[0]->u.name); else if(t->symbols[i].u.arr.size[0]->kind == CONSTANT_INT) fprintf(fout,"%ld",t->symbols[i].u.arr.size[0]->u.value_int); - else if(t->symbols[i].u.arr.size[0]->kind == CONSTANT_DOUBLE) - fprintf(fout,"%0.2lf",t->symbols[i].u.arr.size[0]->u.value_double); + else if(t->symbols[i].u.arr.size[0]->kind == CONSTANT_FLOAT) + fprintf(fout,"%0.2f",t->symbols[i].u.arr.size[0]->u.value_float); else{ printf("BUG array size kind:%d\n",t->symbols[i].u.arr.size[0]->kind); exit(1); @@ -251,8 +251,8 @@ static void symbol_dump(struct symbol* s, FILE* fout) case CONSTANT_INT: fprintf(fout,"%ld",s->u.value_int); break; - case CONSTANT_DOUBLE: - fprintf(fout,"%0.2lf",s->u.value_double); + case CONSTANT_FLOAT: + fprintf(fout,"%0.2f",s->u.value_float); break; case NAME_LOC: fprintf(fout,"%s",s->u.name); @@ -390,8 +390,8 @@ void code_mips_dump(struct symtable * t, struct code * c){ if(t->symbols[i].kind == CONSTANT_INT){ //INTEGER CONSTANT fprintf(stdout,"\ttemp%d: .word %ld\n",i,t->symbols[i].u.value_int); } - else if(t->symbols[i].kind == CONSTANT_DOUBLE){ //FLOAT CONSTANT - fprintf(stdout,"\ttemp%d: .word %0.2lf\n",i,t->symbols[i].u.value_double); + 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{ //NAME fprintf(stdout,"\ttemp%d: .word 0\n",i); diff --git a/lib.h b/lib.h index 0201f5c..f1d26c2 100644 --- a/lib.h +++ b/lib.h @@ -20,7 +20,7 @@ struct array { struct symbol { enum { NAME, // -> use the name attribut in the union u CONSTANT_INT, // -> use the value_int attribut in the union u - CONSTANT_DOUBLE, // -> use the value_double attribut in the union u + CONSTANT_FLOAT, // -> use the value_float attribut in the union u CHAIN, // -> use the chaine attribut in the union u NAME_LOC, // -> use the name attribut, the symbol is just defined ARRAY // -> use the name attribut in the union u @@ -29,7 +29,7 @@ struct symbol { name_t name; name_64_t chaine; long int value_int; - double value_double; + float value_float; struct array arr; } u; @@ -50,8 +50,8 @@ struct symtable * symtable_new(); // Add a symbol in the table of a integer (CONSTANT_INT) struct symbol* symtable_const_int(struct symtable * t, long int v); -// Add a symbol in the table of a double (CONSTANT_DOUBLE) -struct symbol* symtable_const_double(struct symtable * t, double v); +// Add a symbol in the table of a float (CONSTANT_FLOAT) +struct symbol* symtable_const_double(struct symtable * t, float v); // Add a symbol in the table of a function (NAME) struct symbol* symtable_put_name(struct symtable * t, const char * s); // Add a symbol in the table of a chaine of caracters (CHAIN) -- GitLab