-
Notifications
You must be signed in to change notification settings - Fork 1
/
syntax.ml
124 lines (123 loc) · 4.48 KB
/
syntax.ml
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
type t = (* MinCamlの構文を表現するデータ型 (caml2html: syntax_t) *)
| Unit
| Bool of bool
| Int of int
| Float of float
| Not of t
| Neg of t
| Add of t * t
| Sub of t * t
| Mul of t * t
| Div of t * t
| FNeg of t
| FAdd of t * t
| FSub of t * t
| FMul of t * t
| FDiv of t * t
| Eq of t * t
| LE of t * t
| If of t * t * t
| Let of (Id.t * Type.t) * t * t
| Var of Id.t
| LetRec of fundef * t
| App of t * t list
| Tuple of t list
| LetTuple of (Id.t * Type.t) list * t * t
| Array of t * t
| Get of t * t
| Put of t * t * t
and fundef = { name : Id.t * Type.t; args : (Id.t * Type.t) list; body : t }
let rec print_t stx =
match stx with
| Unit -> print_string "UNIT"
| Bool b -> print_string ("BOOL " ^ (string_of_bool b))
| Int i -> (print_string "INT ";
print_int i)
| Float x -> (print_string "FLOAT ";
print_float x)
| Not t -> (print_string "NOT ";
print_t t)
| Neg t -> (print_string "NEG ";
print_t t)
| FNeg t -> (print_string "FNEG ";
print_t t)
| Add (t1, t2) -> (print_t t1;
print_string " + ";
print_t t2)
| Sub (t1, t2) -> (print_t t1;
print_string " - ";
print_t t2)
| Mul (t1, t2) -> (print_t t1;
print_string " * ";
print_t t2)
| Div (t1, t2) -> (print_t t1;
print_string " / ";
print_t t2)
| FAdd (t1, t2) -> (print_t t1;
print_string " +. ";
print_t t2)
| FSub (t1, t2) -> (print_t t1;
print_string " -. ";
print_t t2)
| FMul (t1, t2) -> (print_t t1;
print_string " *. ";
print_t t2)
| FDiv (t1, t2) -> (print_t t1;
print_string " /. ";
print_t t2)
| Eq (t1, t2) -> (print_t t1;
print_string " = ";
print_t t2)
| LE (t1, t2) -> (print_t t1;
print_string " <= ";
print_t t2)
| If (t1, t2, t3) -> (print_string "IF ";
print_t t1;
print_string " THEN ";
print_t t2;
print_string " ELSE ";
print_t t3)
| Let ((s, _), t2, t3) -> (print_string ("LET " ^ s ^ " = ");
print_t t2;
print_string " IN ";
print_t t3)
| Var s -> print_string ("VAR " ^ s)
| LetRec (fd, t) -> (print_string ("LET REC " ^ (fst fd.name) ^ "(" ^ (fst (List.hd fd.args)));
List.iter (fun (s, _) ->
print_string (", " ^ s)) (List.tl fd.args);
print_string ") = ";
print_t fd.body;
print_string " IN ";
print_t t)
| App (t1, t2::ts) -> (print_t t1;
print_string "(";
print_t t2;
List.iter (fun t' ->
print_string ", ";
print_t t') ts;
print_string ")")
| Tuple (t::ts) -> (print_string "[";
print_t t;
List.iter (fun t' ->
print_string ", ";
print_t t') ts;
print_string "]")
| LetTuple (s::ss, t1, t2) -> (print_string ("LET (" ^ (fst s));
List.iter (fun (s', _) ->
print_string (", " ^ s')) ss;
print_string ") = ";
print_t t1;
print_string " IN ";
print_t t2)
| Array (t1, t2) -> (print_string "ARRAY_CREATE ";
print_t t1;
print_t t2)
| Get (t1, t2) -> (print_t t1;
print_string " . (";
print_t t2;
print_string ")")
| Put (t1, t2, t3) -> (print_t t1;
print_string " . (";
print_t t2;
print_string ") <-";
print_t t3)