Browse Source

Implémentation table des symboles

Paul Faure 3 years ago
parent
commit
3f2aa96c19
2 changed files with 157 additions and 0 deletions
  1. 109
    0
      Analyse_Lexicale/table_symboles.c
  2. 48
    0
      Analyse_Lexicale/table_symboles.h

+ 109
- 0
Analyse_Lexicale/table_symboles.c View File

@@ -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
+}

+ 48
- 0
Analyse_Lexicale/table_symboles.h View File

@@ -0,0 +1,48 @@
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
+	- status -> nom -> pile -> char					*/
27
+
28
+#include <stdint.h>
29
+
30
+enum type_t {UNKNOWN, INT};
31
+
32
+struct symbole_t {
33
+	char nom[30];
34
+	uintptr_t adresse;
35
+	enum type_t type;
36
+	char initialized;
37
+};
38
+
39
+struct pile_t;
40
+
41
+
42
+
43
+void init(struct pile_t * pile);
44
+void push(struct symbole_t symbole, struct pile_t * pile);
45
+struct symbole_t pop(struct pile_t * pile);
46
+// renvoi 0 si nom n'existe pas, 2 si nom existe sans etre initialisée, 1 sinon
47
+char status(char * nom, struct pile_t pile);
48
+void print(struct pile_t pile);

Loading…
Cancel
Save