From ba9e13e5b8f6431071b87ab701d2de1fc6eadc98 Mon Sep 17 00:00:00 2001 From: Guillotin Damien Date: Sat, 11 Dec 2021 12:30:54 +0100 Subject: [PATCH] feat: debut des pointeurs --- src/ast.ml | 19 +++++++++++++++++-- src/type.ml | 9 ++++++--- src/type.mli | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/ast.ml b/src/ast.ml index 2885d31..b9b8dfd 100644 --- a/src/ast.ml +++ b/src/ast.ml @@ -5,6 +5,7 @@ module type Ast = sig type expression type instruction + type affectable type fonction type programme end @@ -22,6 +23,12 @@ type unaire = Numerateur | Denominateur (* Opérateurs binaires de Rat *) type binaire = Fraction | Plus | Mult | Equ | Inf +type affectable = + (* Dé-référencement d'un affectable *) + | Dref of affectable + (* Identifiant *) + | Ident of 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 *) @@ -36,14 +43,22 @@ type expression = | 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 représenté par son affectable *) + | Affectable of affectable + (* Null *) + | Null + (* Nouveau type *) + | NewType of typ + (* Adresse *) + | Adresse of string (* 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 + (* Affectation d'un affectable à une expression *) + | 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 *) diff --git a/src/type.ml b/src/type.ml index 020017d..ac01184 100644 --- a/src/type.ml +++ b/src/type.ml @@ -1,18 +1,20 @@ -type typ = Bool | Int | Rat | Undefined +type typ = Bool | Int | Rat | Pointeur of typ | Undefined -let string_of_type t = +let rec string_of_type t = match t with | Bool -> "Bool" | Int -> "Int" | Rat -> "Rat" + | Pointeur(t_p) -> "Poi " ^ string_of_type t_p | Undefined -> "Undefined" -let est_compatible t1 t2 = +let rec est_compatible t1 t2 = match t1, t2 with | Bool, Bool -> true | Int, Int -> true | Rat, Rat -> true + | Pointeur(t_p1), Pointeur(t_p2) -> est_compatible t_p1 t_p2 | _ -> false let%test _ = est_compatible Bool Bool @@ -50,6 +52,7 @@ let getTaille t = | Int -> 1 | Bool -> 1 | Rat -> 2 + | Pointeur(_) -> 1 | Undefined -> 0 let%test _ = getTaille Int = 1 diff --git a/src/type.mli b/src/type.mli index e1d267c..2c30e5c 100644 --- a/src/type.mli +++ b/src/type.mli @@ -1,5 +1,5 @@ (* Types manipulés dans Rat *) -type typ = Bool | Int | Rat | Undefined +type typ = Bool | Int | Rat | Pointeur of typ | Undefined (* string_of_type : typ -> string *) (* transforme un typ en chaîne de caractère *)