-
Notifications
You must be signed in to change notification settings - Fork 0
/
ast.ml
241 lines (201 loc) · 7.92 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
232
233
234
235
236
237
238
239
240
241
open Type
(* Interface des arbres abstraits *)
module type Ast =
sig
type expression
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
(* Affectable de Rat*)
type affectable =
(* Accès à un identifiant représenté par son nom *)
| Ident of string
(* Accès à la valeur d'un affectable *)
| Dref of affectable
(* Accès à un champ de l’enregistrement*)
| Champ of affectable * string
(* 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
(* 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
(* Affectable*)
| Affectable of affectable
(* Constante Null*)
| Null
(* Le nouveau type*)
| NouveauType of typ
(* Adresse d'un id*)
| Adresse of string
(* Creation d’un enregistrement avec la liste des valeurs de ses champs*)
| ListeChamp 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
(* 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
(* Affectation d'un affectable représentée par son affectable et la nouvelle valeur affectée*)
| AffectationPointeur of affectable * expression
(* Assignation d'addition entre un infectable et une expression*)
| AssignationAdd of affectable * expression
(* Définition locale (à un bloc) d’un type nommée ́*)
| DeclarationTypeNomme 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 *)
type programme = Programme of (instruction list) list * fonction list * bloc
end
(* ********************************************* *)
(* AST après la phase d'analyse des identifiants *)
(* ********************************************* *)
module AstTds =
struct
(* Affectable de Rat*)
type affectable =
(* Accès à un identifiant représenté par son nom *)
| Ident of Tds.info_ast
(* Accès à la valeur d'un affectable *)
| Dref of affectable
| EntierCons of int
| Champ of affectable * string
(* 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
| Booleen of bool
| Entier of int
| Unaire of AstSyntax.unaire * expression
| Binaire of AstSyntax.binaire * expression * expression
| Affectable of affectable
| Null
| NouveauType of typ
| Adresse of Tds.info_ast
| ListeChamp 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 *)
| Affichage of expression
| Conditionnelle of expression * bloc * bloc
| TantQue of expression * bloc
| Retour of expression
| Empty (* les nœuds ayant disparus: Const *)
| AffectationPointeur 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
(* Affectable de Rat*)
type affectable =
(* Accès à un identifiant représenté par son nom *)
| Ident of Tds.info_ast
(* Accès à la valeur d'un affectable *)
| Dref of affectable
| EntierCons of int
| Champ of affectable * string
(* 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 | Inf
(* Expressions existantes dans Rat *)
(* = expression de AstTds *)
type expression =
| AppelFonction of Tds.info_ast * expression list
| Booleen of bool
| Entier of int
| Unaire of unaire * expression
| Binaire of binaire * expression * expression
| Affectable of affectable
| Null
| NouveauType of typ
| Adresse of Tds.info_ast
| ListeChamp 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
| AffichageInt of expression
| AffichageRat of expression
| AffichageBool of expression
| Conditionnelle of expression * bloc * bloc
| TantQue of expression * bloc
| Retour of expression
| AffectationPointeur of affectable * expression
| Empty (* les nœuds ayant disparus: Const *)
(* 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
(* Affectable existantes dans notre langage *)
(* = affectable de AstType *)
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