réorganisation
This commit is contained in:
parent
38f818afa1
commit
271309e831
28 changed files with 245 additions and 1221 deletions
BIN
.DS_Store
vendored
BIN
.DS_Store
vendored
Binary file not shown.
|
@ -1,2 +1,2 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module classpath="External" external.linked.project.id="projet_systeme" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="Makefile" type="CPP_MODULE" version="4" />
|
||||
<module classpath="External" type="CPP_MODULE" version="4" />
|
|
@ -1,106 +0,0 @@
|
|||
%{
|
||||
#include "analyse_syntaxique.tab.h"
|
||||
int yywrap(void){
|
||||
return 1;
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
|
||||
|
||||
|
||||
ADD "+"
|
||||
SUB "-"
|
||||
MUL "*"
|
||||
DIV "/"
|
||||
tPO "("
|
||||
tPF ")"
|
||||
tAO "{"
|
||||
tAF "}"
|
||||
EOL "\n"
|
||||
EOI ";"
|
||||
SPACE " "
|
||||
TAB "\t"
|
||||
VIRGULE ","
|
||||
AFFECTATION "="
|
||||
EQUAL "=="
|
||||
LT "<"
|
||||
GT ">"
|
||||
LTE "<="
|
||||
GTE ">="
|
||||
tINT "int"
|
||||
tMAIN "main"
|
||||
tPRINT "printf"
|
||||
tRETURN "return"
|
||||
tIF "if"
|
||||
tELSE "else"
|
||||
tWHILE "while"
|
||||
tNOT "!"
|
||||
tAND "&&"
|
||||
tOR "||"
|
||||
tDIFF "!="
|
||||
tAPPERSAND "&"
|
||||
DIGIT [0-9]
|
||||
VARIABLE [A-Za-z0-9_]+
|
||||
CONST "const"
|
||||
DECIMAL {DIGIT}+
|
||||
EXPONENTIEL {DIGIT}+"e"{DIGIT}+
|
||||
ENTIER {DECIMAL}
|
||||
ENTIEREXP {EXPONENTIEL}
|
||||
OPERATION {ADD}|{SUB}|{MUL}|{DIV}
|
||||
COMPARATEUR {EGAL}|{LT}|{GT}
|
||||
SEPARATOR {SPACE}|{TAB}
|
||||
|
||||
%%
|
||||
|
||||
{ADD} {return tADD ;}
|
||||
{SUB} {return tSUB ;}
|
||||
{MUL} {return tMUL ;}
|
||||
{DIV} {return tDIV ;}
|
||||
|
||||
{tPO} {return tPO ;}
|
||||
{tPF} {return tPF ;}
|
||||
{tAO} {return tAO ;}
|
||||
{tAF} {return tAF ;}
|
||||
|
||||
{EOI} {return tPV ;}
|
||||
{SEPARATOR} {}
|
||||
{EOL} {}
|
||||
{VIRGULE} {return tVIRGULE ;}
|
||||
|
||||
{AFFECTATION} {return tAFFECTATION ;}
|
||||
|
||||
{EQUAL} {return tEGAL ;}
|
||||
{tDIFF} {return tDIFF ;}
|
||||
{LT} {return tLT ;}
|
||||
{GT} {return tGT ;}
|
||||
{LTE} {return tLTE ;}
|
||||
{GTE} {return tGTE ;}
|
||||
{tNOT} {return tNOT ;}
|
||||
|
||||
|
||||
{tMAIN} {return tMAIN ;}
|
||||
{tINT} {return tINT ;}
|
||||
{tPRINT} {return tPRINT ;}
|
||||
{tRETURN} {return tRETURN ;}
|
||||
|
||||
{tOR} {return tOR ;}
|
||||
{tAND} {return tAND ;}
|
||||
|
||||
{tIF} {return tIF ;}
|
||||
{tELSE} {return tELSE ;}
|
||||
{tWHILE} {return tWHILE ;}
|
||||
|
||||
{tAPPERSAND} {return tAPPERSAND;}
|
||||
{CONST} {return tCONST ;}
|
||||
{ENTIER} {yylval.nombre = atoi(yytext); return tENTIER ;}
|
||||
{ENTIEREXP} {yylval.nombre = -1; return tENTIEREXP;}
|
||||
{VARIABLE} {strcpy(yylval.id, yytext); return tVAR ;}
|
||||
|
||||
%%
|
||||
|
||||
//int main(void){
|
||||
// yylex();
|
||||
//}
|
||||
|
||||
|
|
@ -1,230 +0,0 @@
|
|||
%union {
|
||||
int nombre;
|
||||
char id[30];
|
||||
}
|
||||
|
||||
%{
|
||||
#include <stdio.h>
|
||||
#include "table_symboles.h"
|
||||
#include "table_fonctions.h"
|
||||
#include "gen_assembleur.h"
|
||||
|
||||
enum Initialised_Variable init;
|
||||
enum Symbole_Type type;
|
||||
enum Return_Type return_type;
|
||||
Table_Symboles table;
|
||||
Table_Fonctions table_fonctions;
|
||||
instructions_array array;
|
||||
int whileCondition;
|
||||
int return_value;
|
||||
%}
|
||||
|
||||
|
||||
%token<nombre> tENTIER
|
||||
%token<nombre> tENTIEREXP
|
||||
|
||||
%type<nombre> E
|
||||
%type<nombre> Return Instructions
|
||||
%type<nombre> Cond
|
||||
%type<nombre> While Else Invocation
|
||||
|
||||
|
||||
%token tADD
|
||||
%token tSUB
|
||||
%token tMUL
|
||||
%token tDIV
|
||||
|
||||
%token<nombre> tPO
|
||||
%token tPF
|
||||
%token tAO
|
||||
%token tAF
|
||||
|
||||
%token tERROR
|
||||
|
||||
%token tAPPERSAND
|
||||
%token tPV
|
||||
%token tVIRGULE
|
||||
%token tAFFECTATION
|
||||
%token tEGAL
|
||||
%token tDIFF
|
||||
%token tLT
|
||||
%token tGT
|
||||
%token tGTE
|
||||
%token tLTE
|
||||
%token tMAIN
|
||||
%token tINT
|
||||
%token tPRINT
|
||||
%token tRETURN
|
||||
%token tOR
|
||||
%token tAND
|
||||
%token<nombre> tIF
|
||||
%token tELSE
|
||||
%token<nombre> tWHILE
|
||||
%token tCONST
|
||||
%token<id> tVAR
|
||||
%token tNOT
|
||||
|
||||
%left tADD
|
||||
%left tSUB
|
||||
%left tMUL
|
||||
%left tDIV
|
||||
%right tEGAL
|
||||
|
||||
|
||||
%%
|
||||
|
||||
/*C : Fonctions Main ;
|
||||
|
||||
Fonctions : ;
|
||||
Fonctions : Fonction Fonctions ;
|
||||
|
||||
Fonction : tINT tVAR tPO Params tPF Body;*/
|
||||
|
||||
C : {generate_instruction_1(&array, JMP, -1);} Fonctions;
|
||||
|
||||
Fonctions: Main;
|
||||
Fonctions: Fonction Fonctions;
|
||||
|
||||
|
||||
Main : tINT tMAIN {update_jmp(&array, 0, array.index); add_function(&table_fonctions, "Main", RET_INT, array.index); table.depth++;} tPO Params tPF Body {print_table(&table);remove_symboles(&table); table.depth--;};
|
||||
Fonction : Function_type tVAR {{add_function(&table_fonctions, $2, return_type, array.index); table.depth++;}} tPO Params tPF Body {print_table(&table);remove_symboles(&table); table.depth--;};
|
||||
|
||||
Function_type: tINT {type = TYPE_INT;} ;
|
||||
Function_type: tINT tMUL {type = TYPE_INT_PTR;};
|
||||
|
||||
Params : {} ;
|
||||
Params : Param SuiteParams ;
|
||||
|
||||
Param : Param_type tVAR {add_symbole_top(&table, $2, type, INITIALISED, table.depth);} ;
|
||||
|
||||
Param_type: tINT {type = TYPE_INT;} ;
|
||||
Param_type: tINT tMUL {type = TYPE_INT_PTR;};
|
||||
|
||||
SuiteParams : tVIRGULE Param SuiteParams ;
|
||||
SuiteParams : ;
|
||||
|
||||
|
||||
Body : tAO Instructions Return tAF {} ;
|
||||
|
||||
Instructions : Instruction Instructions {$$ = array.index;};
|
||||
Instructions : {$$ = array.index;};
|
||||
|
||||
Instruction : Aff ;
|
||||
Instruction : If ;
|
||||
Instruction : While ;
|
||||
Instruction : Print ;
|
||||
Instruction : Decl ;
|
||||
Instruction : Invocation tPV ;
|
||||
|
||||
Decl : Type Valeur SuiteDecl tPV ;
|
||||
|
||||
SuiteDecl: tVIRGULE Valeur SuiteDecl ;
|
||||
SuiteDecl: ;
|
||||
|
||||
Type : tINT {type = TYPE_INT;} ;
|
||||
Type : tCONST tINT {type = TYPE_CONST_INT;} ;
|
||||
Type : tINT tMUL {type = TYPE_INT_PTR;};
|
||||
|
||||
Valeur : tVAR {add_symbole_top(&table, $1, type, INITIALISED, table.depth);} tAFFECTATION E {int varAddr = variable_exists(&table, $1); generate_instruction_2(&array, COP, varAddr, $4); free_temp(&table);};
|
||||
Valeur : tVAR {add_symbole_top(&table, $1, type, NOT_INITIALISED, table.depth);};
|
||||
|
||||
|
||||
Aff : tVAR tAFFECTATION E tPV {int varAddr = variable_exists(&table, $1); generate_instruction_2(&array, COP, varAddr, $3); free_temp(&table); };
|
||||
Aff : tMUL tVAR tAFFECTATION E tPV {int varAddr = variable_exists(&table, $2); generate_instruction_2(&array, COP_STR, varAddr, $4); free_temp(&table); };
|
||||
|
||||
|
||||
E : tENTIER {int vt = new_temp(&table); generate_instruction_2(&array, AFC, vt, $1); $$ = vt;};
|
||||
E : tVAR {int vt = new_temp(&table); int varAddr = variable_exists(&table, $1); generate_instruction_2(&array, COP, vt, varAddr); $$ = vt;};
|
||||
E : E tADD E {generate_instruction_3(&array, ADD, $1, $1, $3); free_temp(&table); $$ = $1;} ;
|
||||
E : E tMUL E {generate_instruction_3(&array, MUL, $1, $1, $3); free_temp(&table); $$ = $1;} ;
|
||||
E : E tSUB E {generate_instruction_3(&array, SOU, $1, $1, $3); free_temp(&table); $$ = $1;} ;
|
||||
E : E tDIV E {generate_instruction_3(&array, DIV, $1, $1, $3); free_temp(&table); $$ = $1;} ;
|
||||
E : tSUB E {printf("Variable negative\n");} ;
|
||||
E : Invocation {
|
||||
//int vt = new_temp(&table);
|
||||
//generate_instruction_2(&array, COP, vt, $1);
|
||||
remove_symboles(&table);
|
||||
table.depth--;
|
||||
$$ = $1;};
|
||||
E : tPO E tPF {printf("Parenthèse\n"); $$ = $2; } ;
|
||||
E : tAPPERSAND tVAR {int vt = new_temp(&table); int varAddr = variable_exists(&table, $2); generate_instruction_2(&array, LEA, vt, varAddr); $$ = vt;};
|
||||
E : tMUL tVAR {int vt = new_temp(&table); int varAddr = variable_exists(&table, $2); generate_instruction_2(&array, COP, vt, varAddr); generate_instruction_2(&array, COP_LD, vt, vt); $$ = vt;};
|
||||
|
||||
|
||||
If : tIF tPO Cond tPF {
|
||||
//gen_jmpf(&table, &array, $3, -1);
|
||||
generate_instruction_2(&array, JMF, $3, -1);
|
||||
free_temp(&table);
|
||||
$1 = array.index;
|
||||
}
|
||||
tAO {table.depth++;} Instructions {generate_instruction_1(&array, JMP, -1);} tAF {remove_symboles(&table); table.depth--;}
|
||||
{
|
||||
int adr_jmp = array.index;
|
||||
update_jmf(&array, $1, adr_jmp);
|
||||
}
|
||||
Else {printf("updating jump\n"); update_jmp(&array, $8, $13);};
|
||||
|
||||
Else : tELSE tAO {table.depth++;} Instructions tAF {remove_symboles(&table); table.depth--;} {$$ = array.index;} ;
|
||||
Else : {$$ = array.index;};
|
||||
Else : tELSE If {$$ = array.index;} ;
|
||||
|
||||
While : tWHILE tPO {
|
||||
$2 = array.index ;
|
||||
} Cond tPF {
|
||||
//gen_jmpf(&table, &array, $4, -1);
|
||||
generate_instruction_2(&array, JMF, $4, -1);
|
||||
free_temp(&table);
|
||||
$1 = array.index;
|
||||
}
|
||||
tAO {table.depth++;} Instructions tAF {remove_symboles(&table); table.depth--;} {
|
||||
int adr_jmp = array.index;
|
||||
update_jmf(&array, $1, adr_jmp);
|
||||
//gen_jmpf(&table, &array, $1, $2);
|
||||
generate_instruction_1(&array, JMP, $2);
|
||||
};
|
||||
|
||||
Cond : E tEGAL E {generate_instruction_3(&array, EQ, $1, $1, $3); free_temp(&table); $$ = $3;};
|
||||
Cond : E tDIFF E {generate_instruction_3(&array, NEQ, $1, $1, $3); free_temp(&table); $$ = $3;} ;
|
||||
Cond : E tLT E {generate_instruction_3(&array, LT, $1, $1, $3); free_temp(&table); $$ = $3;} ;
|
||||
Cond : E tGT E {generate_instruction_3(&array, GT, $1, $1, $3); free_temp(&table); $$ = $3;} ;
|
||||
Cond : E tLTE E {generate_instruction_3(&array, LTE, $1, $1, $3); free_temp(&table); $$ = $3;} ;
|
||||
Cond : E tGTE E {generate_instruction_3(&array, GTE, $1, $1, $3); free_temp(&table); $$ = $3;} ;
|
||||
Cond : E tAND E {generate_instruction_3(&array, AND, $1, $1, $3); free_temp(&table); $$ = $3;} ;
|
||||
Cond : E tOR E {generate_instruction_3(&array, OR, $1, $1, $3); free_temp(&table); $$ = $3;} ;
|
||||
Cond : tNOT Cond {generate_instruction_2(&array, NOT, $2, $2); $$ = $2;} ;
|
||||
Cond : E {$$ = $1; };
|
||||
|
||||
Invocation : tVAR tPO {table.depth++; prepare_function_call(&table); return_value = (table.indexAvailableBottom);} Args tPF
|
||||
{int function_index = function_exists(&table_fonctions, $1);
|
||||
int jmp_addr = (table_fonctions.array[function_index]).start_addr;
|
||||
generate_instruction_2(&array, CALL, jmp_addr, table.indexAvailableTop);
|
||||
$$ = return_value;
|
||||
};
|
||||
|
||||
Args : Arg SuiteArgs ;
|
||||
Args :
|
||||
Arg : E {int arg_addr = prepare_argument_push(&table); generate_instruction_2(&array, COP, arg_addr, $1); free_temp(&table);};
|
||||
SuiteArgs : tVIRGULE Arg SuiteArgs ;
|
||||
SuiteArgs : ;
|
||||
|
||||
Print : tPRINT tPO E tPF tPV {generate_instruction_1(&array, PRI, $3); free_temp(&table);};
|
||||
|
||||
Return : tRETURN E tPV {$$ = generate_instruction_1(&array, RET, $2); free_temp(&table);};
|
||||
|
||||
%%
|
||||
#include <stdio.h>
|
||||
void main(void){
|
||||
//TODO: rajouter gestion des erreurs
|
||||
initialise_table(&table);
|
||||
initialise_function_table(&table_fonctions);
|
||||
initialise_asm(&array);
|
||||
yyparse();
|
||||
print_table(&table);
|
||||
printf("\n");
|
||||
print_fonction_table(&table_fonctions);
|
||||
|
||||
//remove_symboles(&table, 0);
|
||||
//print_table(&table);
|
||||
exportInstructions(&array);
|
||||
}
|
||||
|
BIN
cross_assembleur/.DS_Store
vendored
Normal file
BIN
cross_assembleur/.DS_Store
vendored
Normal file
Binary file not shown.
1
cross_assembleur/STD_LOGIC_VECTOR_output
Normal file
1
cross_assembleur/STD_LOGIC_VECTOR_output
Normal file
|
@ -0,0 +1 @@
|
|||
(0=>"00000111000000010000001000000000", 1=>"00000111000000100000001100000000", 2=>"00000001000000110000000100000010", 3=>"00001000000000010000001100000000", 4=>"00000111000000010000001000000000", 5=>"00000111000000100000001100000000", 6=>"00000011000000110000000100000010", 7=>"00001000000000010000001100000000", 8=>"00000111000000010000001000000000", 9=>"00001000000000010000000100000000", others => "00000000000000000000000000000000")
|
3
cross_assembleur/cross_input.txt
Normal file
3
cross_assembleur/cross_input.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
ADD 1 2 3
|
||||
SOU 1 2 3
|
||||
COP 1 2
|
10
cross_assembleur/cross_output.txt
Normal file
10
cross_assembleur/cross_output.txt
Normal file
|
@ -0,0 +1,10 @@
|
|||
7 1 2 0
|
||||
7 2 3 0
|
||||
1 3 1 2
|
||||
8 1 3 0
|
||||
7 1 2 0
|
||||
7 2 3 0
|
||||
3 3 1 2
|
||||
8 1 3 0
|
||||
7 1 2 0
|
||||
8 1 1 0
|
36
cross_assembleur/main.py
Normal file
36
cross_assembleur/main.py
Normal file
|
@ -0,0 +1,36 @@
|
|||
import sys
|
||||
|
||||
def output_instructions_binary(instructions):
|
||||
file = open("STD_LOGIC_VECTOR_output", "w")
|
||||
file.write("(")
|
||||
for index, instruction in enumerate(instructions):
|
||||
string_instruction = str(index) + "=>"
|
||||
string_instruction+= "\""
|
||||
op = f'{int(instruction[0]):08b}'
|
||||
arg1 = f'{int(instruction[1]):08b}'
|
||||
arg2 = f'{int(instruction[2]):08b}'
|
||||
arg3 = f'{int(instruction[3]):08b}'
|
||||
string_instruction += op + arg1 + arg2 + arg3
|
||||
string_instruction += "\", "
|
||||
file.write(string_instruction)
|
||||
file.write("others => \"00000000000000000000000000000000\")")
|
||||
file.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) != 2:
|
||||
print("Please only input one file name")
|
||||
exit(0)
|
||||
|
||||
filename = sys.argv[1]
|
||||
f = open(filename, "r")
|
||||
lines = f.readlines()
|
||||
lines = [line.strip() for line in lines]
|
||||
instructions = [line.split(" ") for line in lines]
|
||||
|
||||
output_instructions_binary(instructions)
|
||||
f.close()
|
||||
|
||||
|
||||
|
||||
|
17
cross_assembleur/makefile
Executable file
17
cross_assembleur/makefile
Executable file
|
@ -0,0 +1,17 @@
|
|||
SRCC:= ./src/*.c
|
||||
|
||||
all: cross_assembler
|
||||
|
||||
cross_assembler: src/cross.y src/cross.l src/cross_instructions.c
|
||||
yacc -d ./src/cross.y
|
||||
lex ./src/cross.l
|
||||
gcc lex.yy.c y.tab.c ./src/cross_instructions.c -Isrc -o cross_assembler
|
||||
|
||||
run: cross_assembler
|
||||
./cross_assembler < cross_input.txt
|
||||
|
||||
export_binary: run
|
||||
python3 main.py cross_output.txt
|
||||
|
||||
clean:
|
||||
rm -f lex.yy.c cross_assembler y.tab.h y.tab.c *.o
|
BIN
cross_assembleur/src/.DS_Store
vendored
Normal file
BIN
cross_assembleur/src/.DS_Store
vendored
Normal file
Binary file not shown.
32
cross_assembleur/src/cross.l
Executable file
32
cross_assembleur/src/cross.l
Executable file
|
@ -0,0 +1,32 @@
|
|||
%{
|
||||
#include "y.tab.h"
|
||||
%}
|
||||
|
||||
vSEP [ \t\r\n]
|
||||
|
||||
%%
|
||||
|
||||
ADD {return tADD;}
|
||||
MUL {return tMUL;}
|
||||
SOU {return tSOU;}
|
||||
DIV {return tDIV;}
|
||||
COP {return tCOP;}
|
||||
AFC {return tAFC;}
|
||||
|
||||
-?[0-9]+ {
|
||||
yylval.nb = atoi(yytext);
|
||||
return tNB;
|
||||
}
|
||||
|
||||
|
||||
{vSEP} {}
|
||||
|
||||
. {
|
||||
fprintf(stderr, "ERROR lex : Unknown pattern %s", yytext);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
%%
|
||||
|
||||
int yywrap(void) { return 1; }
|
||||
//int main(int argc, char *argv[]) { while (yylex()!=0) ; return 0; }
|
88
cross_assembleur/src/cross.y
Executable file
88
cross_assembleur/src/cross.y
Executable file
|
@ -0,0 +1,88 @@
|
|||
%{
|
||||
#include <stdio.h>
|
||||
#include "cross_instructions.h"
|
||||
int yylex();
|
||||
void yyerror(char*);
|
||||
int yydebug = 1;
|
||||
extern int yylineno;
|
||||
|
||||
reg_instructions reg_array;
|
||||
%}
|
||||
|
||||
/* Union for yylval */
|
||||
%union {
|
||||
int nb;
|
||||
}
|
||||
|
||||
%token tADD tMUL tSOU tDIV tCOP tAFC
|
||||
%token <nb> tNB
|
||||
|
||||
%%
|
||||
|
||||
%start File;
|
||||
|
||||
File:
|
||||
Instructions;
|
||||
|
||||
Instructions:
|
||||
/* epsilon */
|
||||
| Instructions Instruction
|
||||
;
|
||||
|
||||
Instruction:
|
||||
tADD tNB tNB tNB
|
||||
{
|
||||
add_reg_oriented_instructions(®_array,LOAD, 1, $3, 0);
|
||||
add_reg_oriented_instructions(®_array,LOAD, 2, $4, 0);
|
||||
add_reg_oriented_instructions(®_array,ADD, 3, 1, 2);
|
||||
add_reg_oriented_instructions(®_array,STORE, $2, 3, 0);
|
||||
}
|
||||
| tMUL tNB tNB tNB
|
||||
{
|
||||
add_reg_oriented_instructions(®_array,LOAD, 1, $3, 0);
|
||||
add_reg_oriented_instructions(®_array,LOAD, 2, $4, 0);
|
||||
add_reg_oriented_instructions(®_array,MUL, 3, 1, 2);
|
||||
add_reg_oriented_instructions(®_array,STORE, $2, 3, 0);
|
||||
}
|
||||
| tSOU tNB tNB tNB
|
||||
{
|
||||
add_reg_oriented_instructions(®_array,LOAD, 1, $3, 0);
|
||||
add_reg_oriented_instructions(®_array,LOAD, 2, $4, 0);
|
||||
add_reg_oriented_instructions(®_array,SOU, 3, 1, 2);
|
||||
add_reg_oriented_instructions(®_array,STORE, $2, 3, 0);
|
||||
}
|
||||
| tDIV tNB tNB tNB
|
||||
{
|
||||
add_reg_oriented_instructions(®_array,LOAD, 1, $3, 0);
|
||||
add_reg_oriented_instructions(®_array,LOAD, 2, $4, 0);
|
||||
add_reg_oriented_instructions(®_array,DIV, 3, 1, 2);
|
||||
add_reg_oriented_instructions(®_array,STORE, $2, 3, 0);
|
||||
}
|
||||
| tCOP tNB tNB
|
||||
{
|
||||
add_reg_oriented_instructions(®_array,LOAD, 1, $3, 0);
|
||||
add_reg_oriented_instructions(®_array,STORE, $2, 1, 0);
|
||||
}
|
||||
| tAFC tNB tNB
|
||||
{
|
||||
add_reg_oriented_instructions(®_array,AFC, 1, $3, 0);
|
||||
add_reg_oriented_instructions(®_array,STORE, $2, 1, 0);
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
%%
|
||||
|
||||
void yyerror(char* str) {
|
||||
extern int yylineno;
|
||||
fprintf(stderr, "ERROR yyparse : Line %d: %s\n", yylineno, str);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
init_reg_oriented_instructions(®_array);
|
||||
yyparse();
|
||||
printf("INFO yyparse : Parsing End\n");
|
||||
output_reg_oriented_instructions(®_array);
|
||||
return 0;
|
||||
}
|
||||
|
23
cross_assembleur/src/cross_instructions.c
Executable file
23
cross_assembleur/src/cross_instructions.c
Executable file
|
@ -0,0 +1,23 @@
|
|||
#include <stdio.h>
|
||||
#include "cross_instructions.h"
|
||||
|
||||
void init_reg_oriented_instructions(reg_instructions * instructions_array){
|
||||
instructions_array->index = 0;
|
||||
}
|
||||
|
||||
void add_reg_oriented_instructions(reg_instructions * instructions_array, int operation, int arg1, int arg2, int arg3) {
|
||||
struct reg_instruction ins = {operation, arg1, arg2, arg3};
|
||||
instructions_array->reg_instructions[instructions_array->index] = ins;
|
||||
instructions_array->index++;
|
||||
}
|
||||
|
||||
void output_reg_oriented_instructions(reg_instructions * instructions_array){
|
||||
FILE *file;
|
||||
file = fopen("cross_output.txt", "w");
|
||||
struct reg_instruction instru;
|
||||
for (int i = 0; i < instructions_array->index; i++){
|
||||
instru = instructions_array->reg_instructions[i];
|
||||
fprintf(file, "%d %d %d %d\n", instru.ins, instru.arg1, instru.arg2, instru.arg3);
|
||||
}
|
||||
|
||||
}
|
33
cross_assembleur/src/cross_instructions.h
Normal file
33
cross_assembleur/src/cross_instructions.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
#ifndef __INSTRUCTIONS_H__
|
||||
#define __INSTRUCTIONS_H__
|
||||
|
||||
#define ADD 1
|
||||
#define MUL 2
|
||||
#define SOU 3
|
||||
#define DIV 4
|
||||
#define COP 5
|
||||
#define AFC 6
|
||||
#define LOAD 7
|
||||
#define STORE 8
|
||||
|
||||
#define MAX_SIZE 256
|
||||
|
||||
struct reg_instruction {
|
||||
char ins;
|
||||
int arg1;
|
||||
int arg2;
|
||||
int arg3;
|
||||
};
|
||||
|
||||
typedef struct reg_instructions{
|
||||
struct reg_instruction reg_instructions[MAX_SIZE];
|
||||
int index;
|
||||
} reg_instructions;
|
||||
|
||||
void init_reg_oriented_instructions(reg_instructions * instructions_array);
|
||||
|
||||
void add_reg_oriented_instructions(reg_instructions * instructions_array, int operation, int arg1, int arg2, int arg3);
|
||||
|
||||
void output_reg_oriented_instructions(reg_instructions * instructions_array);
|
||||
|
||||
#endif // #ifndef __INSTRUCTIONS_H__
|
357
gen_assembleur.c
357
gen_assembleur.c
|
@ -1,357 +0,0 @@
|
|||
#include "gen_assembleur.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
char * operationName(enum operation op){
|
||||
switch(op){
|
||||
case EQ:
|
||||
return "EQ";
|
||||
case NEQ:
|
||||
return "NEQ";
|
||||
case LT:
|
||||
return "LT";
|
||||
case GT:
|
||||
return "GT";
|
||||
case LTE:
|
||||
return "LTE";
|
||||
case GTE:
|
||||
return "GTE";
|
||||
case ADD:
|
||||
return "ADD";
|
||||
case SOU:
|
||||
return "SOU";
|
||||
case DIV:
|
||||
return "DIV";
|
||||
case MUL:
|
||||
return "MUL";
|
||||
case COP:
|
||||
return "COP";
|
||||
case AFC:
|
||||
return "AFC";
|
||||
case RET:
|
||||
return "RET";
|
||||
case JMF:
|
||||
return "JPF";
|
||||
case JMP:
|
||||
return "JMP";
|
||||
case AND:
|
||||
return "AND";
|
||||
case OR:
|
||||
return "OR";
|
||||
case NOT:
|
||||
return "NOT";
|
||||
case PRI:
|
||||
return "PRI";
|
||||
case LEA:
|
||||
return "LEA";
|
||||
case COP_LD:
|
||||
return "COP_LD";
|
||||
case COP_STR:
|
||||
return "COP_STR";
|
||||
case RET_FUN:
|
||||
return "RET_FUN";
|
||||
case CALL:
|
||||
return "CALL";
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
void initialise_asm(instructions_array * array){
|
||||
array->index = 0;
|
||||
}
|
||||
|
||||
int add_instruction(instructions_array * array, instruction * instru){
|
||||
if (array->index >= INSTRUCTION_TABLE_SIZE){
|
||||
return 1;
|
||||
}
|
||||
array->array[array->index] = *instru;
|
||||
array->index++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int new_temp(Table_Symboles * table){
|
||||
int ret_addr ;
|
||||
if(add_symbole_bottom(table) == -1) {
|
||||
return -1;
|
||||
}
|
||||
ret_addr = table->indexAvailableBottom + 1;
|
||||
return ret_addr;
|
||||
}
|
||||
|
||||
int generate_instruction_0(instructions_array * array, enum operation op){
|
||||
instruction instru;
|
||||
char * opName = operationName(op);
|
||||
|
||||
instru.operation = op;
|
||||
|
||||
printf("%d\t %s\n", array->index, opName);
|
||||
|
||||
if (add_instruction(array, &instru) != 0){
|
||||
//TODO: Error handling
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int generate_instruction_1(instructions_array * array, enum operation op, int arg1){
|
||||
instruction instru;
|
||||
char * opName = operationName(op);
|
||||
|
||||
instru.operation = op;
|
||||
instru.reg1 = arg1;
|
||||
|
||||
printf("%d\t %s %d\n", array->index, opName, instru.reg1);
|
||||
|
||||
if (add_instruction(array, &instru) != 0){
|
||||
//TODO: Error handling
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int generate_instruction_2(instructions_array * array, enum operation op, int arg1, int arg2){
|
||||
instruction instru;
|
||||
char * opName = operationName(op);
|
||||
|
||||
instru.operation = op;
|
||||
instru.reg1 = arg1;
|
||||
instru.reg2 = arg2;
|
||||
|
||||
printf("%d\t %s %d %d\n", array->index, opName, instru.reg1, instru.reg2);
|
||||
|
||||
if (add_instruction(array, &instru) != 0){
|
||||
//TODO: Error handling
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int generate_instruction_3(instructions_array * array, enum operation op, int arg1, int arg2, int arg3){
|
||||
instruction instru;
|
||||
char * opName = operationName(op);
|
||||
|
||||
instru.operation = op;
|
||||
instru.reg1 = arg1;
|
||||
instru.reg2 = arg2;
|
||||
instru.reg3 = arg3;
|
||||
|
||||
printf("%d\t %s %d %d %d\n", array->index, opName, instru.reg1, instru.reg2, instru.reg3);
|
||||
|
||||
if (add_instruction(array, &instru) != 0){
|
||||
//TODO: Error handling
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void update_jmf(instructions_array * array, int instru_index, int adr_jmp){
|
||||
array->array[instru_index - 1].reg2 = adr_jmp;
|
||||
printf("%d\t JMP %d %d\n", (instru_index - 1), array->array[instru_index].reg1, array->array[instru_index].reg2);
|
||||
}
|
||||
|
||||
void update_jmp(instructions_array * array, int instru_index, int adr_jmp){
|
||||
array->array[instru_index].reg1 = adr_jmp;
|
||||
printf("%d\t JMP %d\n", (instru_index - 1), array->array[instru_index].reg1);
|
||||
}
|
||||
|
||||
void exportInstructions(instructions_array * array){
|
||||
FILE *file;
|
||||
file = fopen("instructions.txt", "w");
|
||||
instruction instru;
|
||||
enum operation op;
|
||||
|
||||
for (int i = 0; i < array->index; i++){
|
||||
instru = array->array[i];
|
||||
op = instru.operation;
|
||||
switch (op) {
|
||||
//0 parameters
|
||||
case RET_FUN:
|
||||
fprintf(file, "%s\n", operationName(op));
|
||||
break;
|
||||
//1 parameter
|
||||
case JMP:
|
||||
case PRI:
|
||||
case RET:
|
||||
fprintf(file, "%s %d\n", operationName(op), instru.reg1);
|
||||
break;
|
||||
//2 parameters
|
||||
case JMF:
|
||||
case NOT:
|
||||
case AFC:
|
||||
case COP:
|
||||
case LEA:
|
||||
case CALL:
|
||||
fprintf(file, "%s %d %d\n", operationName(op), instru.reg1, instru.reg2);
|
||||
break;
|
||||
case COP_LD:
|
||||
fprintf(file, "%s %d [%d]\n", operationName(op), instru.reg1, instru.reg2);
|
||||
break;
|
||||
case COP_STR:
|
||||
fprintf(file, "%s [%d] %d\n", operationName(op), instru.reg1, instru.reg2);
|
||||
break;
|
||||
//3 parameters
|
||||
case ADD:
|
||||
case SOU:
|
||||
case DIV:
|
||||
case MUL:
|
||||
case AND:
|
||||
case OR:
|
||||
case EQ:
|
||||
case NEQ:
|
||||
case LT:
|
||||
case LTE:
|
||||
case GT:
|
||||
case GTE:
|
||||
fprintf(file, "%s %d %d %d\n", operationName(op), instru.reg1, instru.reg2, instru.reg3);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
/*int gen_print(Table_Symboles * table, instructions_array * array, int arg1){
|
||||
instruction instru;
|
||||
instru.operation = PRI;
|
||||
instru.reg1 = arg1;
|
||||
|
||||
printf("%d\t PRI %d\n", array->index, instru.reg1);
|
||||
|
||||
if (array->index < INSTRUCTION_TABLE_SIZE){
|
||||
array->array[array->index] = instru;
|
||||
array->index++;
|
||||
}
|
||||
|
||||
free_temp(table);
|
||||
}*/
|
||||
|
||||
/*void gen_arithmetique(instructions_array * array, enum operation op, int arg1, int arg2){
|
||||
instruction instru;
|
||||
instru.reg1 = arg1;
|
||||
instru.reg2 = arg1;
|
||||
instru.reg3 = arg2;
|
||||
|
||||
char * opName = operationName(op);
|
||||
printf("%d\t %s %d %d %d\n", array->index, opName, arg1, arg1, arg2);
|
||||
|
||||
if (array->index < INSTRUCTION_TABLE_SIZE){
|
||||
array->array[array->index] = instru;
|
||||
array->index++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int gen_var(Table_Symboles * table, instructions_array * array, char * varName){
|
||||
int vt = new_temp(table);
|
||||
int varAddr = variable_exists(table, varName);
|
||||
|
||||
//vérifier que non null
|
||||
instruction instru;
|
||||
instru.operation = COP;
|
||||
instru.reg1 = vt;
|
||||
instru.reg2 = varAddr;
|
||||
|
||||
printf("%d\t COP %d %d\n", array->index, vt, varAddr);
|
||||
|
||||
if (array->index < INSTRUCTION_TABLE_SIZE){
|
||||
array->array[array->index] = instru;
|
||||
array->index++;
|
||||
}
|
||||
|
||||
return vt;
|
||||
|
||||
}
|
||||
|
||||
int gen_entier(Table_Symboles * table, instructions_array * array, int entier){
|
||||
int vt = new_temp(table);
|
||||
|
||||
//vérifier que non null
|
||||
instruction instru;
|
||||
instru.operation = AFC;
|
||||
instru.reg1 = vt;
|
||||
instru.reg2 = entier;
|
||||
|
||||
printf("%d\t AFC %d %d\n", array->index, vt, entier);
|
||||
|
||||
if (array->index < INSTRUCTION_TABLE_SIZE){
|
||||
array->array[array->index] = instru;
|
||||
array->index++;
|
||||
}
|
||||
|
||||
return vt;
|
||||
}
|
||||
|
||||
int gen_condition(Table_Symboles * table, instructions_array * array, enum operation op, int arg1, int arg2){
|
||||
|
||||
char * opName = operationName(op);
|
||||
|
||||
instruction instru;
|
||||
instru.operation = op;
|
||||
instru.reg1 = arg1;
|
||||
instru.reg2 = arg1;
|
||||
if (op != NOT){
|
||||
instru.reg3 = arg2;
|
||||
printf("%d\t %s %d %d %d\n", array->index, opName, instru.reg1, instru.reg2, instru.reg3);
|
||||
free_temp(table);
|
||||
} else {
|
||||
printf("%d\t %s %d %d \n", array->index, opName, instru.reg1, instru.reg2);
|
||||
}
|
||||
|
||||
if (array->index < INSTRUCTION_TABLE_SIZE){
|
||||
array->array[array->index] = instru;
|
||||
array->index++;
|
||||
}
|
||||
|
||||
return instru.reg1;
|
||||
}
|
||||
|
||||
int gen_return(Table_Symboles * table, instructions_array * array, int adr){
|
||||
|
||||
//vérifier que non null
|
||||
instruction instru;
|
||||
instru.operation = RET;
|
||||
instru.reg1 = adr;
|
||||
|
||||
printf("%d\t RET %d\n", array->index, adr);
|
||||
|
||||
if (array->index < INSTRUCTION_TABLE_SIZE){
|
||||
array->array[array->index] = instru;
|
||||
array->index++;
|
||||
}
|
||||
|
||||
//free_temp(table);
|
||||
|
||||
return adr;
|
||||
}
|
||||
|
||||
int gen_jmpf(Table_Symboles * table, instructions_array * array, int cond, int dest){
|
||||
//vérifier que non null
|
||||
instruction instru;
|
||||
instru.operation = JMF;
|
||||
instru.reg1 = cond;
|
||||
instru.reg2 = dest;
|
||||
|
||||
printf("%d\t JMPF %d %d\n", array->index, instru.reg1 , instru.reg2);
|
||||
|
||||
if (array->index < INSTRUCTION_TABLE_SIZE){
|
||||
array->array[array->index] = instru;
|
||||
array->index++;
|
||||
}
|
||||
|
||||
//free_temp(table);
|
||||
|
||||
return cond;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
121
gen_assembleur.h
121
gen_assembleur.h
|
@ -1,121 +0,0 @@
|
|||
#ifndef GEN_ASSEMBLEUR_H
|
||||
#define GEN_ASSEMBLEUR_H
|
||||
|
||||
#define INSTRUCTION_TABLE_SIZE 1000
|
||||
|
||||
#include "table_symboles.h"
|
||||
|
||||
enum operation{ADD, SOU, MUL, DIV, COP, AFC, RET, JMF, JMP, EQ, NEQ, LT, GT, LTE,
|
||||
GTE, AND, OR, NOT, PRI, LEA, COP_LD, COP_STR, CALL, RET_FUN};
|
||||
|
||||
typedef struct instruction{
|
||||
enum operation operation;
|
||||
int reg1;
|
||||
int reg2;
|
||||
int reg3;
|
||||
}instruction;
|
||||
|
||||
//table des instructions
|
||||
typedef struct instructions_array{
|
||||
instruction array[INSTRUCTION_TABLE_SIZE];
|
||||
int index;
|
||||
} instructions_array;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param op operation
|
||||
* @return returns the string that corresponds to the enum operation op
|
||||
*/
|
||||
char * operationName(enum operation op);
|
||||
|
||||
/**
|
||||
* Initialises the instructions array
|
||||
* @param array
|
||||
*/
|
||||
void initialise_asm(instructions_array * array);
|
||||
|
||||
//renvoie l'index (ou valeur?) de la premiere @ dispo
|
||||
/**
|
||||
* Fetch address of a temporary variable
|
||||
* @param table
|
||||
* @return first available temp address
|
||||
*/
|
||||
int new_temp(Table_Symboles * table);
|
||||
|
||||
/**
|
||||
* Adds intruction to instruction array
|
||||
* @param array
|
||||
* @param intru
|
||||
* @return 0 if instruction was added successfully, -1 if not
|
||||
*/
|
||||
int add_instruction(instructions_array * array, instruction * intru);
|
||||
|
||||
/**
|
||||
* Generates intruction with no parameter
|
||||
* @param array
|
||||
* @param op
|
||||
* @return
|
||||
*/
|
||||
int generate_instruction_0(instructions_array * array, enum operation op);
|
||||
|
||||
/**
|
||||
* Generates intruction with one parameter
|
||||
* @param array
|
||||
* @param op
|
||||
* @param arg1
|
||||
* @return
|
||||
*/
|
||||
int generate_instruction_1(instructions_array * array, enum operation op, int arg1);
|
||||
|
||||
/**
|
||||
* Generates intruction with two parameters
|
||||
* @param array
|
||||
* @param op
|
||||
* @param arg1
|
||||
* @param arg2
|
||||
* @return
|
||||
*/
|
||||
int generate_instruction_2(instructions_array * array, enum operation op, int arg1, int arg2);
|
||||
|
||||
/**
|
||||
* Generates intruction with three parameters
|
||||
* @param array
|
||||
* @param op
|
||||
* @param arg1
|
||||
* @param arg2
|
||||
* @param arg3
|
||||
* @return
|
||||
*/
|
||||
int generate_instruction_3(instructions_array * array, enum operation op, int arg1, int arg2, int arg3);
|
||||
|
||||
/**
|
||||
* Updates the JMF instruction with the correct jump destination address
|
||||
* @param array
|
||||
* @param instru_index
|
||||
* @param adr_jmp
|
||||
*/
|
||||
void update_jmf(instructions_array * array, int instru_index, int adr_jmp);
|
||||
|
||||
void update_jmp(instructions_array * array, int instru_index, int adr_jmp);
|
||||
|
||||
|
||||
|
||||
|
||||
void exportInstructions(instructions_array * array);
|
||||
|
||||
/*
|
||||
void gen_arithmetique(instructions_array * array, enum operation op, int arg1, int arg2);
|
||||
|
||||
int gen_var(Table_Symboles * table, instructions_array * array, char * varName);
|
||||
|
||||
int gen_entier(Table_Symboles * table, instructions_array * array, int entier);
|
||||
|
||||
int gen_return(Table_Symboles * table, instructions_array * array, int adr);
|
||||
|
||||
int gen_jmpf(Table_Symboles * table, instructions_array * array, int cond, int dest);
|
||||
|
||||
int gen_condition(Table_Symboles * table, instructions_array * array, enum operation op, int arg1, int arg2);
|
||||
|
||||
int gen_print(Table_Symboles * table, instructions_array * array, int arg1);
|
||||
*/
|
||||
#endif
|
|
@ -1,26 +0,0 @@
|
|||
JMP 8
|
||||
COP 255 0
|
||||
COP_LD 255 [255]
|
||||
COP 1 255
|
||||
COP 255 1
|
||||
PRI 255
|
||||
AFC 255 1
|
||||
RET 255
|
||||
AFC 255 21
|
||||
COP 0 255
|
||||
LEA 255 0
|
||||
COP 1 255
|
||||
COP 255 1
|
||||
COP 5 255
|
||||
CALL 1 6
|
||||
COP 2 255
|
||||
COP 255 2
|
||||
PRI 255
|
||||
LEA 255 2
|
||||
COP 1 255
|
||||
AFC 255 2
|
||||
COP_STR [1] 255
|
||||
COP 255 2
|
||||
PRI 255
|
||||
AFC 255 0
|
||||
RET 255
|
BIN
interpreter/.DS_Store
vendored
BIN
interpreter/.DS_Store
vendored
Binary file not shown.
Binary file not shown.
|
@ -8,7 +8,7 @@ interpreter: ./src/interpreter.y ./src/interpreter.l ./src/instructions.c
|
|||
gcc lex.yy.c y.tab.c ./src/instructions.c -Isrc -o interpreter
|
||||
|
||||
run: interpreter
|
||||
./interpreter < input.txt
|
||||
./interpreter < interpreter_input.txt
|
||||
|
||||
clean:
|
||||
rm -f lex.yy.c interpreter y.tab.h y.tab.c *.o
|
||||
|
|
22
script.sh
22
script.sh
|
@ -1,22 +0,0 @@
|
|||
bison -d -t analyse_syntaxique.y -v
|
||||
flex analyse_lexicale.lex
|
||||
gcc -w *.c -ly
|
||||
echo "
|
||||
int fonction1(int * a){
|
||||
int b = *a;
|
||||
printf(b);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(){
|
||||
int l = 21;
|
||||
int * p = &l;
|
||||
int c = fonction1(p);
|
||||
printf(c);
|
||||
p = &c;
|
||||
*p = 2;
|
||||
printf(c);
|
||||
|
||||
return 0;
|
||||
}
|
||||
" | ./a.out
|
|
@ -1,59 +0,0 @@
|
|||
#include "table_fonctions.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void initialise_function_table(Table_Fonctions * table){
|
||||
table->depth = 1;
|
||||
}
|
||||
|
||||
void add_function(Table_Fonctions * table, char * function_name, enum Return_Type return_type, int start_addr){
|
||||
Fonction fonction;
|
||||
strcpy(fonction.function_name,function_name);
|
||||
fonction.start_addr = start_addr;
|
||||
fonction.type = return_type;
|
||||
fonction.function_depth = table->depth;
|
||||
table->array[table->depth] = fonction;
|
||||
table->depth++;
|
||||
}
|
||||
|
||||
void print_function(Fonction * fonction){
|
||||
char * function_name = fonction->function_name;
|
||||
int start_addr = fonction->start_addr;
|
||||
int depth = fonction->function_depth;
|
||||
int return_type = fonction->type;
|
||||
char typeStr[20];
|
||||
if (return_type == RET_INT){
|
||||
strcpy(typeStr, "INT");
|
||||
} else if (return_type == RET_INT_PTR){
|
||||
strcpy(typeStr, "INT_PTR");
|
||||
}
|
||||
printf("%-20s\t\t %-12s\t\t %-12d\t %-12d\n", function_name, typeStr, start_addr, depth);
|
||||
}
|
||||
|
||||
void print_fonction_table(Table_Fonctions * table) {
|
||||
printf("%-20s\t\t %-12s\t\t %-12s\t %-20s\n", "Function Name", "Return Type", "Start Address", "Depth");
|
||||
Fonction fonction;
|
||||
for (int i = 1; i < table->depth; i++) {
|
||||
fonction = table->array[i];
|
||||
print_function(&fonction);
|
||||
}
|
||||
}
|
||||
|
||||
int function_exists(Table_Fonctions * table, char * func_name){
|
||||
for (int i = 0; i < table->depth; i++){
|
||||
if (strcmp(table->array[i].function_name, func_name) == 0){
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
int main(){
|
||||
Table_Fonctions table;
|
||||
initialise_function_table(&table);
|
||||
add_function(&table, "Fonction1", 0, 7);
|
||||
add_function(&table, "Fonction2", 1, 23);
|
||||
print_fonction_table(&table);
|
||||
return 1;
|
||||
}*/
|
|
@ -1,35 +0,0 @@
|
|||
//
|
||||
// Created by Nahom Belay on 29/04/2021.
|
||||
//
|
||||
|
||||
#ifndef PROJET_SYSTEME_TABLE_FONCTIONS_H
|
||||
#define PROJET_SYSTEME_TABLE_FONCTIONS_H
|
||||
|
||||
#define FUNCTION_TABLE_SIZE 50
|
||||
#define FUNCTION_NAME_SIZE 30
|
||||
|
||||
enum Return_Type {RET_INT , RET_INT_PTR};
|
||||
|
||||
typedef struct Fonction {
|
||||
char function_name[FUNCTION_NAME_SIZE];
|
||||
int start_addr ;
|
||||
enum Return_Type type;
|
||||
int function_depth;
|
||||
} Fonction;
|
||||
|
||||
typedef struct Table_Fonctions {
|
||||
Fonction array[FUNCTION_TABLE_SIZE];
|
||||
int depth;
|
||||
} Table_Fonctions;
|
||||
|
||||
void initialise_function_table(Table_Fonctions * table);
|
||||
|
||||
void add_function(Table_Fonctions * table, char * function_name, enum Return_Type return_type, int start_addr);
|
||||
|
||||
void print_fonction_table(Table_Fonctions * table);
|
||||
|
||||
int function_exists(Table_Fonctions * table, char * func_name);
|
||||
|
||||
|
||||
|
||||
#endif //PROJET_SYSTEME_TABLE_FONCTIONS_H
|
152
table_symboles.c
152
table_symboles.c
|
@ -1,152 +0,0 @@
|
|||
#include "table_symboles.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void initialise_table(Table_Symboles * table){
|
||||
table->indexAvailableBottom = TABLE_SIZE - 1;
|
||||
table->indexAvailableTop = 0;
|
||||
table->depth = 0;
|
||||
}
|
||||
|
||||
int variable_exists(Table_Symboles * table, char * varName){
|
||||
for (int i = 0; i < table->indexAvailableTop; i++){
|
||||
if (strcmp(varName, table->array[i].Variable_Name) == 0){
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = (table->indexAvailableBottom + 1); i < TABLE_SIZE; i++){
|
||||
if (strcmp(varName, table->array[i].Variable_Name) == 0){
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int add_symbole_top(Table_Symboles * table, char * varName, enum Symbole_Type type, enum Initialised_Variable init, int depth){
|
||||
Symbole symbole;
|
||||
strcpy(symbole.Variable_Name, varName);
|
||||
symbole.addr = table->indexAvailableTop;
|
||||
symbole.init = init;
|
||||
symbole.type = type;
|
||||
symbole.symbole_depth = table->depth;
|
||||
if (table->indexAvailableTop >= table->indexAvailableBottom){
|
||||
return -1;
|
||||
} else if (variable_exists(table, varName) != 0){
|
||||
return -2;
|
||||
} else {
|
||||
table->array[table->indexAvailableTop] = symbole;
|
||||
table->indexAvailableTop++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int add_symbole_bottom(Table_Symboles * table){
|
||||
Symbole symbole;
|
||||
symbole.addr = table->indexAvailableBottom;
|
||||
//symbole.symbole_depth = -1;
|
||||
if (table->indexAvailableTop >= table->indexAvailableBottom){
|
||||
return -1;
|
||||
} else {
|
||||
table->array[table->indexAvailableBottom] = symbole;
|
||||
table->indexAvailableBottom--;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int remove_symboles(Table_Symboles * table){
|
||||
if (table->indexAvailableTop > 0){
|
||||
while(table->indexAvailableTop > 0){
|
||||
if (table->array[table->indexAvailableTop-1].symbole_depth == table->depth){
|
||||
table->indexAvailableTop--;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//TODO: vérifier qu'il n'y a pas de varaibles temporarires au moment de changement de profondeur
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_temp(Table_Symboles * table){
|
||||
table->indexAvailableBottom++;
|
||||
if (table->indexAvailableBottom >= TABLE_SIZE){
|
||||
printf("Huge error\n");
|
||||
table->indexAvailableBottom--;
|
||||
}
|
||||
}
|
||||
|
||||
int prepare_function_call(Table_Symboles * table){
|
||||
prepare_argument_push(table);
|
||||
prepare_argument_push(table);
|
||||
}
|
||||
|
||||
int prepare_argument_push(Table_Symboles * table){
|
||||
Symbole symbole;
|
||||
symbole.addr = table->indexAvailableTop;
|
||||
symbole.symbole_depth = table->depth;
|
||||
if (table->indexAvailableTop < table->indexAvailableBottom){
|
||||
table->array[table->indexAvailableTop] = symbole;
|
||||
table->indexAvailableTop++;
|
||||
return (table->indexAvailableTop) - 1 ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int initialise_symbole(Table_Symboles * table, char * varName){
|
||||
int index = variable_exists(table, varName);
|
||||
if (index == -1){
|
||||
return -1;
|
||||
} else {
|
||||
table->array[index].init = INITIALISED;
|
||||
}
|
||||
}
|
||||
|
||||
void print_symbole(Symbole * symbole){
|
||||
char * var = symbole->Variable_Name;
|
||||
int addr = symbole->addr;
|
||||
enum Symbole_Type type = symbole->type;
|
||||
char typeStr[20];
|
||||
if (type == TYPE_INT){
|
||||
strcpy(typeStr, "INT");
|
||||
} else if (type == TYPE_CONST_INT){
|
||||
strcpy(typeStr, "CONST_INT");
|
||||
} else if (type == TYPE_INT_PTR) {
|
||||
strcpy(typeStr, "INT_PTR");
|
||||
} else {
|
||||
strcpy(typeStr, "Error type");
|
||||
}
|
||||
enum Initialised_Variable init = symbole->init;
|
||||
char initStr[20];
|
||||
if (init == INITIALISED){
|
||||
strcpy(initStr,"INITIALISED");
|
||||
} else{
|
||||
strcpy(initStr,"NOT_INITIALISED");
|
||||
}
|
||||
int depth = symbole->symbole_depth;
|
||||
printf("%-20s\t\t %-12s\t\t %-12d\t %-20s\t %-12d\n", var, typeStr, addr, initStr, depth);
|
||||
}
|
||||
|
||||
void print_table(Table_Symboles * table){
|
||||
printf("%-20s\t\t %-12s\t\t %-12s\t %-20s\t %-12s\n", "Variable Name", "Type", "Address", "Initialised", "Depth");
|
||||
int indexTop = table->indexAvailableTop;
|
||||
int indexBottom = table->indexAvailableBottom;
|
||||
Symbole symbole;
|
||||
for (int i = 0; i < indexTop; i++){
|
||||
symbole = table->array[i];
|
||||
print_symbole(&symbole);
|
||||
}
|
||||
if (table->indexAvailableBottom != TABLE_SIZE - 1){
|
||||
printf("%-20s\t\t %-12s\t\t %-12s\t %-20s\t %-12s\n", "...", "...", "...", "...", "...");
|
||||
for (int i = (indexBottom + 1); i < TABLE_SIZE; i++){
|
||||
symbole = table->array[i];
|
||||
print_symbole(&symbole);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
#ifndef TABLE_SYMBOLES_H
|
||||
#define TABLE_SYMBOLES_H
|
||||
|
||||
#define TABLE_SIZE 256
|
||||
#define VARIABLE_SIZE 30
|
||||
|
||||
enum Symbole_Type {TYPE_INT , TYPE_CONST_INT, TYPE_INT_PTR};
|
||||
enum Initialised_Variable{INITIALISED , NOT_INITIALISED};
|
||||
|
||||
typedef struct Symboles {
|
||||
char Variable_Name[VARIABLE_SIZE];
|
||||
int addr ;
|
||||
enum Symbole_Type type;
|
||||
enum Initialised_Variable init;
|
||||
int symbole_depth;
|
||||
} Symbole;
|
||||
|
||||
typedef struct Table_Symboles {
|
||||
Symbole array[TABLE_SIZE];
|
||||
int indexAvailableTop;
|
||||
int indexAvailableBottom;
|
||||
int depth;
|
||||
} Table_Symboles;
|
||||
|
||||
/**
|
||||
* Initialises indexAvailableTop at 0 and indexAvailableBottom at TABLE_SIZE - 1
|
||||
* @param table
|
||||
*/
|
||||
void initialise_table(Table_Symboles * table);
|
||||
|
||||
/**
|
||||
* Adds a symbole at the top (regular varaibles)
|
||||
* @param table
|
||||
* @param varName
|
||||
* @param type
|
||||
* @param init
|
||||
* @return if symbole added successfully, -1 if the table is full and -2 if the varaible already exists in the table
|
||||
*/
|
||||
int add_symbole_top(Table_Symboles * table, char * varName, enum Symbole_Type type , enum Initialised_Variable init, int depth);
|
||||
|
||||
/**
|
||||
* Adds a symbole at the bottom (temp variables)
|
||||
* @param table
|
||||
* @return 0 if symbole added successfully, -1 if the table is full and -2 if the varaible already exists in the table
|
||||
*/
|
||||
int add_symbole_bottom(Table_Symboles * table);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Verifies if a varaible name is already present in the table to avoid duplicates
|
||||
* @param table
|
||||
* @param varName
|
||||
* @return -1 if the varaible name exists, 0 if it doesn't
|
||||
*/
|
||||
int variable_exists(Table_Symboles * table, char * varName);
|
||||
|
||||
/**
|
||||
* Removes symbole from table having certain depth
|
||||
* @param table
|
||||
* @return -1 if the symbole isn't in the table, 0 otherwise
|
||||
*/
|
||||
int remove_symboles(Table_Symboles * table);
|
||||
|
||||
|
||||
void free_temp(Table_Symboles * table);
|
||||
|
||||
int prepare_function_call(Table_Symboles * table);
|
||||
|
||||
int prepare_argument_push(Table_Symboles * table);
|
||||
|
||||
|
||||
/**
|
||||
* Initialises an already exisiting symbole
|
||||
* @param table
|
||||
* @param varName
|
||||
* @return -1 if the symbole isn't in the table, 0 otherwise
|
||||
*/
|
||||
int initialise_symbole(Table_Symboles * table, char * varName);
|
||||
|
||||
|
||||
/**
|
||||
* Prints a symbole with this format
|
||||
* varName | Type | Address | Initialised/Not_Initialised
|
||||
* @param symbole
|
||||
*/
|
||||
void print_symbole(Symbole * symbole);
|
||||
|
||||
/**
|
||||
* Prints the table
|
||||
* @param table
|
||||
*/
|
||||
void print_table(Table_Symboles * table);
|
||||
|
||||
#endif
|
16
test_file
16
test_file
|
@ -1,16 +0,0 @@
|
|||
int fonction1(int * a){
|
||||
int b = *a;
|
||||
printf(b);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(){
|
||||
int l = 21;
|
||||
int * p = &l;
|
||||
int c = fonction1(p);
|
||||
printf(c);
|
||||
p = &c;
|
||||
*p = 2;
|
||||
printf(c);
|
||||
|
||||
return 0;
|
BIN
xilinx/.DS_Store
vendored
BIN
xilinx/.DS_Store
vendored
Binary file not shown.
Loading…
Reference in a new issue