189 lines
6.5 KiB
OCaml
189 lines
6.5 KiB
OCaml
|
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
|
||
|
|
||
|
(* 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 *)
|
||
|
| Ident of string
|
||
|
(* 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
|
||
|
|
||
|
(* 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 représentée par son nom et la nouvelle valeur affectée *)
|
||
|
| Affectation of 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
|
||
|
|
||
|
(* 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 fonction list * bloc
|
||
|
|
||
|
end
|
||
|
|
||
|
|
||
|
(* ********************************************* *)
|
||
|
(* AST après la phase d'analyse des identifiants *)
|
||
|
(* ********************************************* *)
|
||
|
module AstTds =
|
||
|
struct
|
||
|
|
||
|
(* 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
|
||
|
| Ident of Tds.info_ast (* 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
|
||
|
|
||
|
(* 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 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 *)
|
||
|
|
||
|
|
||
|
(* 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
|
||
|
|
||
|
(* 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
|
||
|
| Ident of Tds.info_ast
|
||
|
| Booleen of bool
|
||
|
| Entier of int
|
||
|
| Unaire of unaire * expression
|
||
|
| Binaire of binaire * expression * expression
|
||
|
|
||
|
(* 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 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
|
||
|
| 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
|
||
|
|
||
|
(* 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
|