|
@@ -0,0 +1,109 @@
|
|
1
|
+/* TABLE DES SYMBOLE DU COMPILATEUR (PILE)
|
|
2
|
+
|
|
3
|
+-----------------------------------------------------
|
|
4
|
+| symbole | adresse | type | initialisé |
|
|
5
|
+-----------------------------------------------------
|
|
6
|
+| | | | |
|
|
7
|
+| | | | |
|
|
8
|
+| | | | |
|
|
9
|
+| i | 0x777756b8 | int | false |
|
|
10
|
+| size | 0x777756b8 | int | true |
|
|
11
|
+-----------------------------------------------------
|
|
12
|
+
|
|
13
|
+Types pour l'implémentation :
|
|
14
|
+ - enum type_t : [int]
|
|
15
|
+ - struct symbole : {
|
|
16
|
+ char nom[30];
|
|
17
|
+ uintptr_t adresse;
|
|
18
|
+ enum type_t type;
|
|
19
|
+ char initialized;
|
|
20
|
+ }
|
|
21
|
+
|
|
22
|
+Opérations possible :
|
|
23
|
+ - init -> pile * -> void
|
|
24
|
+ - push -> symbole -> pile * -> void
|
|
25
|
+ - pop -> pile * -> symbole
|
|
26
|
+ - exist -> pile * -> symbole -> char
|
|
27
|
+ - initialized -> pile * -> symbole -> char */
|
|
28
|
+
|
|
29
|
+#include "table_symboles.h"
|
|
30
|
+#include <stdlib.h>
|
|
31
|
+#include <string.h>
|
|
32
|
+#include <stdio.h>
|
|
33
|
+
|
|
34
|
+struct element_t {
|
|
35
|
+ struct symbole_t symbole;
|
|
36
|
+ struct element_t * suivant;
|
|
37
|
+};
|
|
38
|
+
|
|
39
|
+struct pile_t {
|
|
40
|
+ int taille;
|
|
41
|
+ struct element_t * first;
|
|
42
|
+};
|
|
43
|
+
|
|
44
|
+char * type_to_string(enum type_t type) {
|
|
45
|
+ if (type == INT) {
|
|
46
|
+ return "int";
|
|
47
|
+ } else {
|
|
48
|
+ return "unknown";
|
|
49
|
+ }
|
|
50
|
+}
|
|
51
|
+
|
|
52
|
+void init(struct pile_t * pile) {
|
|
53
|
+ pile->first = NULL;
|
|
54
|
+ pile->taille = 0;
|
|
55
|
+}
|
|
56
|
+
|
|
57
|
+void push(struct symbole_t symbole, struct pile_t * pile) {
|
|
58
|
+ struct element_t * aux = malloc(sizeof(struct element_t));
|
|
59
|
+ aux->symbole = symbole;
|
|
60
|
+ aux->suivant = pile->first;
|
|
61
|
+ pile->first = aux;
|
|
62
|
+ pile->taille++;
|
|
63
|
+}
|
|
64
|
+
|
|
65
|
+struct symbole_t pop(struct pile_t * pile) {
|
|
66
|
+ struct symbole_t retour = {"", 0, UNKNOWN, -1};
|
|
67
|
+ struct element_t * aux;
|
|
68
|
+ if (pile->taille > 0) {
|
|
69
|
+ aux = pile->first;
|
|
70
|
+ pile->first = pile->first->suivant;
|
|
71
|
+ retour = aux->symbole;
|
|
72
|
+ free(aux);
|
|
73
|
+ pile->taille--;
|
|
74
|
+ }
|
|
75
|
+ return retour;
|
|
76
|
+}
|
|
77
|
+
|
|
78
|
+char status(char * nom, struct pile_t pile) {
|
|
79
|
+ char retour = 0;
|
|
80
|
+ struct element_t * aux = pile.first;
|
|
81
|
+ int i;
|
|
82
|
+ for (i=0; i < pile.taille; i++) {
|
|
83
|
+ if (!strcmp(nom, aux->symbole.nom)) {
|
|
84
|
+ if (aux->symbole.initialized) {
|
|
85
|
+ retour = 1;
|
|
86
|
+ } else {
|
|
87
|
+ retour = 2;
|
|
88
|
+ }
|
|
89
|
+ break;
|
|
90
|
+ } else {
|
|
91
|
+ aux = aux->suivant;
|
|
92
|
+ }
|
|
93
|
+ }
|
|
94
|
+ return retour;
|
|
95
|
+}
|
|
96
|
+
|
|
97
|
+void print(struct pile_t pile) {
|
|
98
|
+ printf("Affichage de la Table des Symboles\n\tSize : %d\n\tContenu : \n", pile.taille);
|
|
99
|
+ struct element_t * aux = pile.first;
|
|
100
|
+ int i;
|
|
101
|
+ for (i=0; i < pile.taille; i++) {
|
|
102
|
+ if (aux->symbole.initialized) {
|
|
103
|
+ printf("\t\t{nom:%s, adresse:%p, type:%s, initialized:OUI}\n", aux->symbole.nom, (void *)(aux->symbole.adresse), type_to_string(aux->symbole.type));
|
|
104
|
+ } else {
|
|
105
|
+ printf("\t\t{nom:%s, adresse:%p, type:%s, initialized:NON}\n", aux->symbole.nom, (void *)(aux->symbole.adresse), type_to_string(aux->symbole.type));
|
|
106
|
+ }
|
|
107
|
+ aux = aux->suivant;
|
|
108
|
+ }
|
|
109
|
+}
|