projet-traduction-langage/ast.ml
2021-11-24 14:13:45 +01:00

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