Le Mini-Ml est un sous ensemble de ML, il est composé de 2 parties :
- Les types
- Les expressions
Utilise Ocamllex et génère des Token définis dans le parser.
Utilise Menhir, prend les token générés par le lexer et crée des expressions qui respectent la grammaire.
Parcourt les définitions de types pour voir si les types sont connus.
Vérifie le bon typage du programme sans polymorphisme et sans contrainte.
/!\ Ne fonctionne plus
Détermine les types des expressions et vérifie les contraintes, si elles ne sont pas respectées il produit une erreur.
(Utilisation de l'algo W 1)
les types sont les suivants :
int
: les entiersbool
: les booléenschar
: les charactèresstring
: les chaines de charactèresunit
: l'unité
type s = {id1 = e1; ...; idn = en;}
: Structurestype s = | Enum1 |Enum2 ...
: Types énuméréstype s = | Cons1 of t1 * ... * tn | ... | Const n
: Types algébriquestype 'a s = | Some of 'a
: Types algébriques paramétré
Les expressions sont les suivantes :
n
: un entiertrue
: un booléen vraifalse
: un booléen faux'c'
: un charactère"..."
: une chaine de charactèreString.length s
: taille de la chaine de charactère ss.[i]
: récupère le i ème charactère de la chaine de charactère s()
: l'unitéref e
: une ref vers e!e
: la valeur à l'adresse eid := e
: place la valeur de e dans l'adresse ide1 ~ e2
: Les expression binaires- ~ est un opérateur binaire parmis
+
,-
,*
,/
,mod
,==
,!=
,<
,<=
,>
,>=
,&&
,||
- l'égalité structurelle et la négation
=
,<>
- ~ est un opérateur binaire parmis
~ e
: Les expression unaires- ~ est un opérateur unaire parmis
-
,not
- ~ est un opérateur unaire parmis
if e1 then e2 else e3
: l'expression conditionnellelet x = e1 in e2
: l'expression de déclaration de variablelet rec x = e1 in e2
: l'expression de déclaration de fonction récursivefun x -> e
: l'expression de déclaration de fonction anonymefun () -> e
: fonction avec type unit en entréee1 e2
: l'expression d'appel de fonction{a1 = e1; ...; an = en;}
: l'expression de création de structuree.a
: l'expression d'accès à un champ de structuree1.a <- e2
: l'expression d'écriture à un champ de structure[| e1; ...; en |]
: tableau mutableArray.make n e
: tableau de taille n contentant la valeur de eArray.length a
: taille du tableau ae.(i)
: case i du tableu et.(i) <- e
: chnage la valeur de la case i du tableau t en la valeur de eEnum
: Construction d'une variable enumConstr(e1, ...)
: Construction d'une variable algébriquematch e with | p1 -> e1 ... | pn -> en
: pattern matching sur e avec les pattern pi
pattern :=
| Jok
| Var of string
| Int of int
| Bool of true
| Construct of (string, pattern list)
On peut affiches les valeur avec :
print_int n
print_book b
print_char c
print_string s
print_endline s
print_newline ()
Quand il y a une erreur la ligne et la colonne est toujour indiqué et affiché comme ça:
File "file", line l, character n-n:
l| .............
^^^
Error: ....
compilation:
dune build
lancement:
dune exec -- miniml file.mml [-a] # exécute le code (-a affiche les adresse dans le tas)
dune exec -- debug file.mml # affiche l'AST
mmllexer | mmlparser | typechecker | interpreter | |
---|---|---|---|---|
Arithmétique | X | X | X | X |
Variables | X | X | X | X |
Fonctions | X | X | X | X |
Structures | X | X | X | X |
Récursion | X | X | X | X |
Footnotes
-
B. Heeren, J. Hage, and S. D. Swierstra. Generalizing Hindley-Milner type inference algorithms. Technical Report UU-CS-2002-031, Institute of Information and Computing Science, University Utrecht, Netherlands, July 2002. ↩