1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[@@@ocaml.text "/*"]
(** Copyright 2021-2026, Kakadu and contributors *)
(** SPDX-License-Identifier: LGPL-3.0-or-later *)
[@@@ocaml.text "/*"]
(* Pretty printer goes here *)
open Ast
let pp =
let open Format in
let rec pp fmt = function
| Int n -> fprintf fmt "%d" n
| Var s -> fprintf fmt "%s" s
| App (l, r) -> fprintf fmt "(%a %a)" pp l pp r
| Abs (x, t) -> fprintf fmt "(fun %s -> %a)" x pp t
| Binop (op, l, r) ->
let bop =
match op with
| Plus -> "+"
| Minus -> "-"
| Times -> "*"
| Divide -> "/"
| Eq -> "="
| Neq -> "<>"
| Lt -> "<"
| Gt -> ">"
| Le -> "<="
| Ge -> ">="
in
fprintf fmt "(%a %s %a)" pp l bop pp r
| Neg e -> fprintf fmt "(-%a)" pp e
| If (c, t, e) -> fprintf fmt "(if %a then %a else %a)" pp c pp t pp e
| Let (Nonrec, n, e1, e2) -> fprintf fmt "(let %s = %a in %a)" n pp e1 pp e2
| Let (Rec, n, e1, e2) -> fprintf fmt "(let rec %s = %a in %a)" n pp e1 pp e2
in
pp
;;
let pp_hum = pp
let ast_to_string expr = Format.asprintf "%a" pp expr