Added operations

This commit is contained in:
Raphaël LACROIX 2023-04-18 09:44:04 +02:00
parent 322afd388c
commit 42e264b8d5
5 changed files with 126 additions and 20 deletions

View file

@ -5,7 +5,7 @@ BIN=out
CC=gcc CC=gcc
CFLAGS=-Wall -g CFLAGS=-Wall -g
OBJ=yacc.tab.o lex.yy.o table.o OBJ=yacc.tab.o lex.yy.o table.o operations.o
all: $(BIN) all: $(BIN)
@touch testFile # to prevent an error in case of deletion @touch testFile # to prevent an error in case of deletion

47
operations.h Normal file
View file

@ -0,0 +1,47 @@
//
// Created by chepycou on 4/14/23.
//
#ifndef PROJET_SYSTEMES_INFORMATIQUES_OPERATIONS_H
#define PROJET_SYSTEMES_INFORMATIQUES_OPERATIONS_H
/*prints the ASM instruction for the addition computation
* and returns the address of the temporary variable*/
int operation_add(int addr1, int addr2);
/*prints the ASM instruction for the subtraction computation
* and returns the address of the temporary variable*/
int operation_sub(int addr1, int addr2);
/*prints the ASM instruction for the multiplication computation
* and returns the address of the temporary variable*/
int operation_mul(int addr1, int addr2);
/*prints the ASM instruction for the integer division computation
* and returns the address of the temporary variable*/
int operation_divInt(int addr1, int addr2);
/*prints the ASM instruction for the remainder computation
* and returns the address of the temporary variable*/
int operation_divRem(int addr1, int addr2);
/*prints the ASM instruction for the affection of a variable
* EX :
* a = 2;
*/
void operation_afc_nb(int addr, int value);
/*prints the ASM instruction for the affection of a temporary variable
* EX :
* "1_TEMP = 2"
* and returns the address of the temp variable*/
int operation_afc_nb_tmp(int value);
/*prints the ASM instruction for the affection of a temporary variable
* EX :
* a = b;
*/
void operation_afc_addr(int addr1, int addr2);
#endif //PROJET_SYSTEMES_INFORMATIQUES_OPERATIONS_H

48
table.c
View file

@ -5,6 +5,7 @@
#define VERBOSITY 1 // 1 -> displays the table, 0 no display #define VERBOSITY 1 // 1 -> displays the table, 0 no display
int memorySizes[2] = {1,1}; int memorySizes[2] = {1,1};
int tempCounter = 0;
/*At the start of the execution : the whole array is empty*/ /*At the start of the execution : the whole array is empty*/
static Symbol* symbolTable; static Symbol* symbolTable;
@ -40,7 +41,7 @@ int getOffset(char* name){
/* Returns the structure with this name */ /* Returns the structure with this name */
Symbol getStruct(char* name){ Symbol getStruct(char* name){
for(int i=0; i < currentIndex; i++){ for(int i=0; i < currentIndex; i++){
if (symbolTable[i].name == name){ if (strcmp(symbolTable[i].name, name) == 0){
return symbolTable[i]; return symbolTable[i];
} }
} }
@ -134,6 +135,30 @@ void addElement(char* name, enumVarType type){
} }
} }
/* Adds an element and returns the offset of it */
int addElementAndGetAddress(char* name, enumVarType type){
addElement(name,type);
return getOffset(name);
}
/* Adds a temporary Int element and returns the offset of it */
int addTempINTAndGetAddress(){
char name[NAME_MAX_LENGTH];
if (tempCounter == 0){
// we create the first temporary variable and use it
addElement("0_TEMP",INT);
strcpy(name, "0_TEMP");
} else if (tempCounter == 1) {
// we create the second temporary variable and use it
addElement("1_TEMP",INT);
strcpy(name, "1_TEMP");
} else {
// we use the right temporary variable
sprintf(name, "%d_TEMP", tempCounter % 2);
}
tempCounter++;
return getOffset(name);
}
/* removes all symbols */ /* removes all symbols */
void flushSymbolTable(){ void flushSymbolTable(){
@ -199,6 +224,27 @@ void displayTable(){
doubleLine(); doubleLine();
} }
/*removes all temporary variables used for INTs*/
void suppressTempINTElement(){
if (tempCounter == 1){
suppressElement("0_TEMP");
} else {
if (tempCounter > 1){
suppressElement("0_TEMP");
suppressElement("1_TEMP");
}
}
}
/*removes one element*/
void suppressElement(char* name){
for(int i = getIndex(name); i < (currentIndex - 1); i ++){
symbolTable[i] = symbolTable[i+1];
}
currentIndex--;
checkArraySanity();
}
void line(){ void line(){
printf("---------------------------------\n"); printf("---------------------------------\n");
} }

16
table.h
View file

@ -12,7 +12,7 @@
typedef enum enumVarType {INT, FLOAT} enumVarType; typedef enum enumVarType {INT, FLOAT} enumVarType;
// a list of all type's sizes // a list of all type's sizes
extern int memorySizes[2]; // TODO : PROBLEM DOES'NT COMPILE extern int memorySizes[2];
typedef struct { typedef struct {
char name[NAME_MAX_LENGTH]; char name[NAME_MAX_LENGTH];
@ -47,14 +47,18 @@ void clearOutOfScopeVariable();
/* removes all symbols */ /* removes all symbols */
void flushSymbolTable(); void flushSymbolTable();
/* Adds an element */ /* Adds an element */
void addElement(char* name, enumVarType type); void addElement(char* name, enumVarType type);
/* Adds an element and returns the offset of it */
int addElementAndGetAddress(char* name, enumVarType type);
/* Adds a temporary Int element and returns the offset of it */
int addTempINTAndGetAddress();
/*creates a new structure and updates variables*/ /*creates a new structure and updates variables*/
Symbol createNewStructure(char* name, enumVarType type); Symbol createNewStructure(char* name, enumVarType type);
/*============================ /*============================
Element Edition Element Edition
============================*/ ============================*/
@ -62,6 +66,12 @@ Symbol createNewStructure(char* name, enumVarType type);
/* sets the init state of the symbol to true */ /* sets the init state of the symbol to true */
void setInit(char *name); void setInit(char *name);
/*removes one element*/
void suppressElement(char* name);
/*removes all temporary variables used for INTs*/
void suppressTempINTElement();
/*============================ /*============================
Element Access Element Access
============================*/ ============================*/

33
yacc.y
View file

@ -4,6 +4,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "table.h" #include "table.h"
#include "operations.h"
int t; int t;
%} %}
@ -13,15 +14,16 @@ int yylex (void);
void yyerror (const char *); void yyerror (const char *);
} }
%union {char str[NAME_MAX_LENGTH]; int nbInt; enumVarType type; } %union {char str[NAME_MAX_LENGTH]; int nbInt; int addr; enumVarType type; }
/*loops keywords*/ /*loops keywords*/
%token tWHILE tIF tELSE %token tWHILE tIF tELSE
/*reserved keywords*/ /*reserved keywords*/
%token tRETURN tPRINT %token tRETURN tPRINT
/*types : integers, floats or void*/ /*types : integers, floats or void*/
%token tFLOAT tINT tVOID %token tFLOAT tINT tVOID
/*operations*/ /*operations, mul and div are precedent to sub and add*/
%left tDIV tMUL tADD tSUB %left tSUB tADD
%left tMUL tDIV
/*Assignment*/ /*Assignment*/
%left tASSIGN %left tASSIGN
/*comparisons*/ /*comparisons*/
@ -38,7 +40,8 @@ void yyerror (const char *);
/* represents types with the values used in the table, see table.h */ /* represents types with the values used in the table, see table.h */
%type <type> Type %type <type> Type
%type <addr> Expression
%type <addr> NbOrVariable
%start Program %start Program
%% %%
@ -80,8 +83,8 @@ ConditionalExpression : tID
/*NbOrVariable is either a number or a variable of type int*/ /*NbOrVariable is either a number or a variable of type int*/
NbOrVariable : tID {/* copy */} NbOrVariable : tID { $$ = getOffset($1);}
| tNB {/* Affectation */}; | tNB {$$ = operation_afc_nb_tmp($1);};
/*List of all numerical operators*/ /*List of all numerical operators*/
NumericalOperator : tLE | tGE | tEQ | tNE | tLT | tGT; NumericalOperator : tLE | tGE | tEQ | tNE | tLT | tGT;
@ -95,19 +98,19 @@ IfStatement : tIF Condition InnerBlock
WhileStatement : tWHILE Condition InnerBlock; WhileStatement : tWHILE Condition InnerBlock;
Assignment : tID tASSIGN Expression tSEMI {setInit($1);}; Assignment : tID tASSIGN Expression tSEMI {setInit($1); operation_afc_addr(getOffset($1),$3); suppressTempINTElement();};
/*Expression operation applied on variables or values*/ /*Expression operation applied on variables or values*/
Expression : NbOrVariable Expression : NbOrVariable {$$ = $1;}
| FunctionCall | FunctionCall{$$ = 0;} // TODO : wait untile functions are implemented
| tLPAR Expression tRPAR | tLPAR Expression tRPAR {$$ = $2;}
/* replaced by the four following lines /* replaced by the four following lines
//| Expression Operation Expression //| Expression Operation Expression
*/ */
| Expression tADD Expression | Expression tADD Expression {$$ = operation_add($1, $3);}
| Expression tSUB Expression | Expression tSUB Expression {$$ = operation_sub($1, $3);}
| Expression tMUL Expression | Expression tMUL Expression {$$ = operation_mul($1, $3);}
| Expression tDIV Expression; | Expression tDIV Expression {$$ = operation_divInt($1, $3);};
/*end of added bloat*/ /*end of added bloat*/
Expressions : Expression Expressions : Expression
@ -127,7 +130,7 @@ VarsWithType : VarWithType
| VarWithType tCOMMA VarsWithType; | VarWithType tCOMMA VarsWithType;
/*VarWithType = a variable associated to its type = int a*/ /*VarWithType = a variable associated to its type = int a*/
VarWithType : Type tID; VarWithType : Type tID {addElement($2,$1);setInit($2);};
/*the return type or argument type*/ /*the return type or argument type*/
Type : tINT {$$ = INT;} Type : tINT {$$ = INT;}