This repository has been archived by the owner on May 12, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ast.ml
231 lines (193 loc) · 7.69 KB
/
ast.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
open Type
(* Interface des arbres abstraits *)
module type Ast =
sig
type affectable
type expression
type typedef
type instruction
type fonction
type programme
end
(* *************************************** *)
(* AST après la phase d'analyse syntaxique *)
(* *************************************** *)
module AstSyntax =
struct
(* Opérateurs unaires de Rat *)
type unaire = Numerateur | Denominateur
(* Opérateurs binaires de Rat *)
type binaire = Fraction | Plus | Mult | Equ | Inf
(*pointeurs*)
type affectable = Ident of string | Deref of affectable | Acces of affectable * string
(* types nommés *)
(* nom - type *)
type typedef = TypedefGlobal of string * typ
(* Expressions de Rat *)
type expression =
(* Appel de fonction représenté par le nom de la fonction et la liste des paramètres réels *)
| AppelFonction of string * expression list
(* Accès à un identifiant représenté par son nom, ou a la valeur d'un pointeur *)
| Affectable of affectable
(* Booléen *)
| Booleen of bool
(* Entier *)
| Entier of int
(* Opération unaire représentée par l'opérateur et l'opérande *)
| Unaire of unaire * expression
(* Opération binaire représentée par l'opérateur, l'opérande gauche et l'opérande droite *)
| Binaire of binaire * expression * expression
(* pointeurs *)
(* récupération de l'adresse d'une variable*)
| Adresse of string
(* Null pointeur *)
| Null
(* pointeur sur une nouvelle variable *)
| New of typ
(* expression structure *)
| StructExpr of expression list
(* Instructions de Rat *)
type bloc = instruction list
and instruction =
(* Déclaration de variable représentée par son type, son nom et l'expression d'initialisation *)
| Declaration of typ * string * expression
(* Affectation d'une variable et la nouvelle valeur affectée *)
| Affectation of affectable * expression
(* Déclaration d'une constante représentée par son nom et sa valeur (entier) *)
| Constante of string * int
(* Affichage d'une expression *)
| Affichage of expression
(* Conditionnelle représentée par la condition, le bloc then et le bloc else *)
| Conditionnelle of expression * bloc * bloc
(*Boucle TantQue représentée par la conditin d'arrêt de la boucle et le bloc d'instructions *)
| TantQue of expression * bloc
(* return d'une fonction *)
| Retour of expression
(* Addition-affectation *)
| AddAff of affectable * expression
(* typedef *)
| TypedefLocal of string * typ
(* Structure des fonctions de Rat *)
(* type de retour - nom - liste des paramètres (association type et nom) - corps de la fonction *)
type fonction = Fonction of typ * string * (typ * string) list * bloc
(* Structure d'un programme Rat *)
(* liste de fonction - programme principal *)
(* update: types nommés *)
type programme = Programme of typedef list * fonction list * bloc
end
(* ********************************************* *)
(* AST après la phase d'analyse des identifiants *)
(* ********************************************* *)
module AstTds =
struct
type affectable = Ident of Tds.info_ast | Deref of affectable | Acces of affectable * Tds.info_ast
(* Expressions existantes dans notre langage *)
(* ~ expression de l'AST syntaxique où les noms des identifiants ont été
remplacés par les informations associées aux identificateurs *)
type expression =
| AppelFonction of Tds.info_ast * expression list
| Affectable of affectable (* le nom de l'identifiant est remplacé par ses informations *)
| Booleen of bool
| Entier of int
| Unaire of AstSyntax.unaire * expression
| Binaire of AstSyntax.binaire * expression * expression
(* pointeurs *)
| Adresse of Tds.info_ast
| Null
| New of typ
| StructExpr of expression list
(* instructions existantes dans notre langage *)
(* ~ instruction de l'AST syntaxique où les noms des identifiants ont été
remplacés par les informations associées aux identificateurs
+ suppression de nœuds (const) *)
type bloc = instruction list
and instruction =
| Declaration of typ * Tds.info_ast * expression (* le nom de l'identifiant est remplacé par ses informations *)
| Affectation of affectable * expression (* le nom de l'identifiant est remplacé par ses informations *)
| Affichage of expression
| Conditionnelle of expression * bloc * bloc
| TantQue of expression * bloc
| Retour of expression
| Empty (* les nœuds ayant disparus: Const *)
| AddAff of affectable * expression
(* Structure des fonctions dans notre langage *)
(* type de retour - informations associées à l'identificateur (dont son nom) - liste des paramètres (association type et information sur les paramètres) - corps de la fonction *)
type fonction = Fonction of typ * Tds.info_ast * (typ * Tds.info_ast) list * bloc
(* Structure d'un programme dans notre langage *)
type programme = Programme of fonction list * bloc
end
(* ******************************* *)
(* AST après la phase de typage *)
(* ******************************* *)
module AstType =
struct
(* Pointeurs *)
type affectable = AstTds.affectable
(* Opérateurs unaires de Rat - résolution de la surcharge *)
type unaire = Numerateur | Denominateur
(* Opérateurs binaires existants dans Rat - résolution de la surcharge *)
type binaire = Fraction | PlusInt | PlusRat | MultInt | MultRat | EquInt | EquBool | InfInt
(* Expressions existantes dans Rat *)
(* = expression de AstTds *)
type expression =
| AppelFonction of Tds.info_ast * expression list
| Affectable of AstTds.affectable
| Booleen of bool
| Entier of int
| Unaire of unaire * expression
| Binaire of binaire * expression * expression
(* pointeurs *)
| Adresse of Tds.info_ast
| Null
| New of typ
| StructExpr of expression list
(* instructions existantes Rat *)
(* = instruction de AstTds + informations associées aux identificateurs, mises à jour *)
(* + résolution de la surcharge de l'affichage *)
type bloc = instruction list
and instruction =
| Declaration of Tds.info_ast * expression
| Affectation of AstTds.affectable * expression
| AffichageInt of expression
| AffichageRat of expression
| AffichageBool of expression
| Conditionnelle of expression * bloc * bloc
| TantQue of expression * bloc
| Retour of expression
| Empty (* les nœuds ayant disparus: Const *)
| AddAffEntier of affectable * expression
| AddAffRat of affectable * expression
(* informations associées à l'identificateur (dont son nom), liste des paramètres, corps *)
type fonction = Fonction of Tds.info_ast * Tds.info_ast list * bloc
(* Structure d'un programme dans notre langage *)
type programme = Programme of fonction list * bloc
let taille_variables_declarees i =
match i with
| Declaration (info,_) ->
begin
match Tds.info_ast_to_info info with
| InfoVar (_,t,_,_) -> getTaille t
| _ -> failwith "internal error"
end
| _ -> 0 ;;
end
(* ******************************* *)
(* AST après la phase de placement *)
(* ******************************* *)
module AstPlacement =
struct
(* Pointeurs *)
type affectable = AstType.affectable
(* Expressions existantes dans notre langage *)
(* = expression de AstType *)
type expression = AstType.expression
(* instructions existantes dans notre langage *)
(* = instructions de AstType *)
type bloc = instruction list
and instruction = AstType.instruction
(* informations associées à l'identificateur (dont son nom), liste de paramètres, corps, expression de retour *)
(* Plus besoin de la liste des paramètres mais on la garde pour les tests du placements mémoire *)
type fonction = Fonction of Tds.info_ast * Tds.info_ast list * bloc
(* Structure d'un programme dans notre langage *)
type programme = Programme of fonction list * bloc
end