Bonjour à tous,
Tout d'abord je tiens à m'excuser si je ne suis pas dans la bonne catégorie.
Dans l'un de mes cours portant sur l'usage de Ocaml / Mincaml il m'est demandé de réaliser un "Unparser" qui prend un Abstract Syntaxt Tree (AST) et renvoie le programme en Ocaml correspondant (si possible bien indenté mais pour l'instant je n'y suis pas encore).
J'ai pour exemple cette string:
"let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 1) in print(fib 5)"
qui me donne comme AST ceci:
1 2 3 4 5 6 7 8
| LetRec
({name = ("fib", Var {contents = None});
args = [("n", Var {contents = None})];
body =
If (Not (LE (Syntax.Int 2, Syntax.Var "n")), Syntax.Int 1,
Add (App (Syntax.Var "fib", [Sub (Syntax.Var "n", Syntax.Int 1)]),
App (Syntax.Var "fib", [Sub (Syntax.Var "n", Syntax.Int 1)])))},
App (Syntax.Var "print", [App (Syntax.Var "fib", [Syntax.Int 5])])) |
Mon souci est le suivant. Je n'arrive pas à trouver comment réaliser mon pattern matching pour "découper" cet AST de telle sorte que j'obtienne une string "LetRec" ^ "reste de l'AST". Les pattern matching usuels sur des listes ne s'appliquent pas ici puisque mon AST est de type Syntax.t et je ne trouve pas de solution à mon souci. Le but étant ensuite d'appeler récursivement mon unparser sur le reste de l'AST.
Si quelqu'un a un conseil pour m'aider à avancer, je lui en serais plus que reconnaissant !
Partager