aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/symboltable.c85
-rw-r--r--src/symboltable.h10
-rw-r--r--src/tpc.y64
3 files changed, 117 insertions, 42 deletions
diff --git a/src/symboltable.c b/src/symboltable.c
index 3f22b44..cdbd442 100644
--- a/src/symboltable.c
+++ b/src/symboltable.c
@@ -2,55 +2,92 @@
2 2
3extern int lineno; /* from lexical analyser */ 3extern int lineno; /* from lexical analyser */
4 4
5SymbolTable symbol_table = {{{{0},0}},MAXSYMBOLS,0}; 5SymbolTable glo_symbol_table = {{{{0},0}},MAXSYMBOLS,0};
6SymbolTable loc_symbol_table = {{{{0},0}},MAXSYMBOLS,0};
6 7
7void addVar(const char name[], int type) { 8void glo_addVar(const char name[], int type) {
8 int count; 9 int count;
9 for (count = 0; count < symbol_table.size; count++) { 10 for (count = 0; count < glo_symbol_table.size; count++) {
10 if (!strcmp(symbol_table.entries[count].name, name)) { 11 if (!strcmp(glo_symbol_table.entries[count].name, name)) {
11 printf("semantic error, redefinition of variable %s near line %d\n", name, 12 fprintf(stderr,"semantic error, redefinition of variable %s near line %d\n", name,
12 lineno); 13 lineno);
13 return; 14 return;
14 } 15 }
15 } 16 }
16 if (++symbol_table.size > symbol_table.maxsize) { 17 if (++glo_symbol_table.size > glo_symbol_table.maxsize) {
17 printf("too many variables near line %d\n", lineno); 18 fprintf(stderr,"too many variables near line %d\n", lineno);
18 exit(1); 19 exit(1);
19 } 20 }
20 strcpy(symbol_table.entries[symbol_table.size - 1].name, name); 21 strcpy(glo_symbol_table.entries[glo_symbol_table.size - 1].name, name);
21 symbol_table.entries[symbol_table.size - 1].type = type; 22 glo_symbol_table.entries[glo_symbol_table.size - 1].type = type;
23 glo_symbol_table.entries[glo_symbol_table.size - 1].addr = (glo_symbol_table.size - 1)*8;
22} 24}
23 25
24void lookup(const char name[]) { 26//Verifies that the variable exists and returns the type
27int glo_lookup(const char name[]) {
25 int count; 28 int count;
26 29
27 for (count = 0; count < symbol_table.size; count++) { 30 for (count = 0; count < glo_symbol_table.size; count++) {
28 if (!strcmp(symbol_table.entries[count].name, name)) { 31 if (!strcmp(glo_symbol_table.entries[count].name, name)) {
29 return; 32 return glo_symbol_table.entries[count].type;
30 } 33 }
31 } 34 }
32 printf("No definition of the variable %s near line %d\n", name, 35 fprintf(stderr,"No definition of the variable %s near line %d\n", name,
33 lineno); 36 lineno);
37 return -1;
34} 38}
35 39
36void display_table(){ 40
41void glo_display_table(){
37 int count; 42 int count;
38 for (count=0;count<symbol_table.size;count++) { 43 for (count=0;count<glo_symbol_table.size;count++) {
39 if(symbol_table.entries[count].type == INT) 44 if(glo_symbol_table.entries[count].type == INT)
40 printf("entier: %s, pos: %d \n", symbol_table.entries[count].name, symbol_table.entries[count].addr); 45 printf("entier: %s, pos: %d \n", glo_symbol_table.entries[count].name, glo_symbol_table.entries[count].addr);
41 else 46 else
42 printf("caractere: %s, pos: %d \n", symbol_table.entries[count].name, symbol_table.entries[count].addr); 47 printf("caractere: %s, pos: %d \n", glo_symbol_table.entries[count].name, glo_symbol_table.entries[count].addr);
43 } 48 }
44 printf("\n"); 49 printf("\n");
45} 50}
46 51
47int get_type(const char name[]){
48 int count;
49 52
50 for (count = 0; count < symbol_table.size; count++) { 53void loc_addVar(const char name[], int type) {
51 if (!strcmp(symbol_table.entries[count].name, name)) { 54 int count;
52 return symbol_table.entries[count].type; 55 for (count = 0; count < loc_symbol_table.size; count++) {
56 if (!strcmp(loc_symbol_table.entries[count].name, name)) {
57 fprintf(stderr,"semantic error, redefinition of variable %s near line %d\n", name,
58 lineno);
59 return;
53 } 60 }
54 } 61 }
62 if (++glo_symbol_table.size > glo_symbol_table.maxsize) {
63 fprintf(stderr,"too many variables near line %d\n", lineno);
64 exit(1);
65 }
66 strcpy(glo_symbol_table.entries[glo_symbol_table.size - 1].name, name);
67 glo_symbol_table.entries[glo_symbol_table.size - 1].type = type;
68 glo_symbol_table.entries[glo_symbol_table.size - 1].addr = (glo_symbol_table.size - 1)*8;
69}
70
71
72int loc_lookup(const char name[]) {
73 int count;
74
75 for (count = 0; count < loc_symbol_table.size; count++) {
76 if (!strcmp(loc_symbol_table.entries[count].name, name)) {
77 return loc_symbol_table.entries[count].type;
78 }
79 }
80 fprintf(stderr,"No definition of the variable %s near line %d\n", name,
81 lineno);
55 return -1; 82 return -1;
83}
84void loc_display_table(){
85 int count;
86 for (count=0;count<loc_symbol_table.size;count++) {
87 if(loc_symbol_table.entries[count].type == INT)
88 printf("entier: %s, pos: %d \n", loc_symbol_table.entries[count].name, loc_symbol_table.entries[count].addr);
89 else
90 printf("caractere: %s, pos: %d \n", loc_symbol_table.entries[count].name, loc_symbol_table.entries[count].addr);
91 }
92 printf("\n");
56} \ No newline at end of file 93} \ No newline at end of file
diff --git a/src/symboltable.h b/src/symboltable.h
index 02e47a4..bd7a373 100644
--- a/src/symboltable.h
+++ b/src/symboltable.h
@@ -24,8 +24,10 @@ typedef struct {
24} SymbolTable; 24} SymbolTable;
25 25
26 26
27void addVar(const char name[], int type); 27void glo_addVar(const char name[], int type);
28void lookup(const char name[]); 28int glo_lookup(const char name[]);
29void display_table(); 29void glo_display_table();
30int get_type(const char name[]); 30void loc_addVar(const char name[], int type);
31int loc_lookup(const char name[]);
32void loc_display_table();
31#endif \ No newline at end of file 33#endif \ No newline at end of file
diff --git a/src/tpc.y b/src/tpc.y
index 3b902be..e7b5249 100644
--- a/src/tpc.y
+++ b/src/tpc.y
@@ -11,6 +11,9 @@ extern int lineno;
11int yylex(); 11int yylex();
12void yyerror(char *); 12void yyerror(char *);
13 13
14#define GLOBAL 0
15#define LOCAL 1
16static int status = GLOBAL;
14%} 17%}
15 18
16%union { 19%union {
@@ -31,15 +34,48 @@ void yyerror(char *);
31%token OR AND CONST IF ELSE WHILE RETURN VOID PRINT READC READE 34%token OR AND CONST IF ELSE WHILE RETURN VOID PRINT READC READE
32%token <type> TYPE 35%token <type> TYPE
33 36
34%type <num> Exp EB TB FB M E T F LValue 37%type <num> Exp EB TB FB M E T F
38%type <ident> LValue
35 39
36%left ',' 40%left ','
37%precedence ')' 41%precedence ')'
38%precedence ELSE 42%precedence ELSE
39 43
40%% 44%%
41Prog: 45Prog:{printf("section .data\n");
42 DeclConsts DeclVars DeclFoncts {display_table();} 46 printf("format_entier db \"%%d \n\", 10,0");
47 printf("section .bss\nsection .text\nglobal _start\n");
48 printf("print:\n");
49 printf("push rbp\n");
50 printf("mov rbp, rsp\n");
51
52 printf("push rax\n");
53 printf("push rcx\n");
54 printf("push rdx\n");
55 printf("push rdi\n");
56 printf("push rsi\n");
57 printf("push r8\n");
58
59 printf("mov r8, rdx \n");
60 printf("mov rcx, rcx\n");
61 printf("mov rdx, rbx\n");
62 printf(" mov rdi, format_entier\n");
63 printf(" mov rax, 0\n");
64 printf(" call printf WRT ..plt\n");
65
66 printf("pop r8\n");
67 printf("pop rsi\n");
68 printf("pop rdi\n");
69 printf("pop rdx\n");
70 printf("pop rcx\n");
71 printf("pop rax\n");
72
73 printf("pop rbp\n");
74 printf("ret\n");
75 }
76 DeclConsts DeclVars DeclFoncts {
77
78 glo_display_table();}
43 ; 79 ;
44DeclConsts: 80DeclConsts:
45 DeclConsts CONST ListConst ';' 81 DeclConsts CONST ListConst ';'
@@ -62,8 +98,8 @@ DeclVars:
62 | 98 |
63 ; 99 ;
64Declarateurs: 100Declarateurs:
65 Declarateurs ',' Declarateur {addVar($<ident>3, $<type>0);} 101 Declarateurs ',' Declarateur {glo_addVar($<ident>3, $<type>0);}
66 | Declarateur {addVar($<ident>1, $<type>0);} 102 | Declarateur {glo_addVar($<ident>1, $<type>0);}
67 ; 103 ;
68Declarateur: 104Declarateur:
69 IDENT 105 IDENT
@@ -74,7 +110,7 @@ DeclFoncts:
74 | DeclFonct 110 | DeclFonct
75 ; 111 ;
76DeclFonct: 112DeclFonct:
77 EnTeteFonct Corps 113 EnTeteFonct {status = LOCAL;} Corps {status = GLOBAL;}
78 ; 114 ;
79EnTeteFonct: 115EnTeteFonct:
80 TYPE IDENT '(' Parametres ')' 116 TYPE IDENT '(' Parametres ')'
@@ -85,8 +121,8 @@ Parametres:
85 | ListTypVar 121 | ListTypVar
86 ; 122 ;
87ListTypVar: 123ListTypVar:
88 ListTypVar ',' TYPE IDENT {addVar($<ident>4, $<type>3);} 124 ListTypVar ',' TYPE IDENT {glo_addVar($<ident>4, $<type>3);}
89 | TYPE IDENT {addVar($<ident>2, $<type>1);} 125 | TYPE IDENT {glo_addVar($<ident>2, $<type>1);}
90 ; 126 ;
91Corps: 127Corps:
92 '{' DeclConsts DeclVars SuiteInstr '}' 128 '{' DeclConsts DeclVars SuiteInstr '}'
@@ -99,8 +135,8 @@ Instr:
99 | ';' 135 | ';'
100 | RETURN Exp ';' 136 | RETURN Exp ';'
101 | RETURN ';' 137 | RETURN ';'
102 | READE '(' IDENT ')' ';' {lookup($<ident>3);} 138 | READE '(' IDENT ')' ';' {glo_lookup($<ident>3);}