-
Notifications
You must be signed in to change notification settings - Fork 0
/
language.txt
57 lines (50 loc) · 1.43 KB
/
language.txt
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
and - symbolizes logical 'and'
or - symbolizes logical 'or'
not - logical 'not'
eq - logical 'equals'
neq - logical 'not equals'
a gt b - 'a is greater than b'
a lt b - 'a is less than b'
a gte b - 'a is greater than or equal to b'
a lte b - 'a is less than or equal to b'
a add b - 'a+b'
a sub b - 'a-b'
a mult b - 'a*b'
a div b - 'a/b'
type Expr of
| Boolean
| Integer
| String
| Char
| Expr Op Expr
| Expr Comparator Expr
type Op of add | sub | mult | div | lt | gt | eq | neq | gte | lte | concat | eval
type Comparator of and | or | not | eq | neq | gt | gte | lte
Exception Incompatible of string
let eval_int_expr (e: int Expr) =
match e with
| value -> e
| e1 op e2 ->
match op with
| add -> Expr(e1 + e2);
| sub -> Expr(e1 - e2);
| _ -> raise Incompatible("Invalid operator for these datatypes")
let eval (e: Expr) =
match e with
| Boolean || Integer || String || Char -> e
| e1 op e2 ->
match (e1, op, e2) with
|(e1 : Boolean, comp : Comparator, e2 : Boolean) -> match op with
|and -> Expr(e1&e2)
|or -> Expr(e1 || e2);
|(e1:Integer, op : Op, e2:Integer) ->
| add -> Expr(e1 + e2);
| sub -> Expr(e1 - e2);
| mult -> Expr(e1 * e2);
| div -> Expr(e1 / e2);
|(e1:Float, op : Op, e2:Float) ->
| add -> Expr(e1 +. e2);
| sub -> Expr(e1 -. e2);
| mult -> Expr(e1 *. e2);
| div -> Expr(e1 /. e2);
| _ -> raise Incompatible("Invalid operator for these datatypes")