-
Notifications
You must be signed in to change notification settings - Fork 0
/
a1.ml
65 lines (59 loc) · 2.9 KB
/
a1.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
(* Dummy implementation of A1 *)
open A0
exception Not_implemented
type exptype = Tint | Tunit | Tbool | Ttuple of (exptype list) | Tfunc of (exptype * exptype)
(* abstract syntax *)
type exptree =
Var of string (* variables starting with a Capital letter, represented as alphanumeric strings with underscores (_) and apostrophes (') *)
| N of int (* Integer constant *)
| B of bool (* Boolean constant *)
(* unary operators on integers *)
| Abs of exptree (* abs *)
| Negative of exptree (* unary minus ~ *)
(* unary operators on booleans *)
| Not of exptree
(* binary operators on integers *)
| Add of exptree * exptree (* Addition + *)
| Sub of exptree * exptree (* Subtraction - *)
| Mult of exptree * exptree (* Multiplication * *)
| Div of exptree * exptree (* div *)
| Rem of exptree * exptree (* mod *)
(* binary operators on booleans *)
| Conjunction of exptree * exptree (* conjunction /\ *)
| Disjunction of exptree * exptree (* binary operators on booleans \/ *)
(* comparison operations on integers *)
| Equals of exptree * exptree (* = *)
| GreaterTE of exptree * exptree (* >= *)
| LessTE of exptree * exptree (* <= *)
| GreaterT of exptree * exptree (* > *)
| LessT of exptree * exptree (* < *)
(* expressions using parenthesis *)
| InParen of exptree (* ( ) *)
(* a conditional expression *)
| IfThenElse of exptree * exptree * exptree (* if then else fi *)
(* creating n-tuples (n >= 0) *)
| Tuple of int * (exptree list)
(* projecting the i-th component of an expression (which evaluates to an n-tuple, and 1 <= i <= n) *)
| Project of (int*int) * exptree (* Proj((i,n), e) 0 < i <= n *)
| Let of definition * exptree
| FunctionAbstraction of string * exptype * exptree
| FunctionCall of exptree * exptree
(* definition *)
and definition =
Simple of string * exptype * exptree
| Sequence of (definition list)
| Parallel of (definition list)
| Local of definition * definition
(* opcodes of the stack machine (in the same sequence as above) *)
type opcode = VAR of string | NCONST of bigint | BCONST of bool | ABS | UNARYMINUS | NOT
| PLUS | MINUS | MULT | DIV | REM | CONJ | DISJ | EQS | GTE | LTE | GT | LT
| PAREN | IFTE | TUPLE of int | PROJ of int*int | LET | FABS | FCALL
| SIMPLEDEF | SEQCOMPOSE | PARCOMPOSE | LOCALDEF
(* The possible types of expressions in the language of expressions *)
(* The type of value returned by the definitional interpreter. *)
type value = NumVal of int | BoolVal of bool | TupVal of int * (value list)
(* The language should contain the following types of expressions: integers and booleans *)
type answer = Num of bigint | Bool of bool | Tup of int * (answer list)
let rec eval ex rho = raise Not_implemented
let stackmc stk binding pgm = raise Not_implemented
let compile ex = raise Not_implemented