forked from cpuex2016D/min-caml
-
Notifications
You must be signed in to change notification settings - Fork 0
/
varCatego.ml
94 lines (80 loc) · 2.49 KB
/
varCatego.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
let dummy = Id.genid "dummy"
let index_ref=ref dummy
let fun_name = ref dummy(*mk_rw_graphが解析中の関数名*)
let (fundef_env:(KNormal.fundef M.t) ref) = ref M.empty
type t =(*loop内の変数を分類*)
|Unit
|Int of int
|Index of int(*index変数+(整数定数)*)
|Float of float
|Elm of Id.t * elm_pos
|Parent of (elm_pos*Id.t) list(*array_treeでparentに当たるもの*)
|Arraytree_var of Id.t
|Trace_add of Id.t * Id.t
|Unknown
and elm_pos =
|Array of t(*tはint(i),index(i),unknown,のどれか*)
|Tuple of int(*tupleの要素位置はコンパイル時整数*)
|Ref
type pos_path = string * (elm_pos list)
let find a env = try M.find a env with Not_found ->a
let print_path_from_root ((a,poslist):pos_path) =
let path=
List.fold_left
(fun path pos ->
match pos with
|Array(Int(i))->path^(Printf.sprintf ".(%d)" i)
|Array(Index(i))->path^(Printf.sprintf ".(i+%d)" i)
|Array(_) ->path^(Printf.sprintf ".(unknown)" )
|Tuple(i) ->path^(Printf.sprintf ".<%d>" i)
|Ref ->path^".<refelm>" )
""
poslist
in
Format.eprintf "%s%s@." a path
let is_const_pos = function
|Array(Int _)|Tuple _|Ref ->true
|_ ->false
let is_const_pospath (a,poslist)=
List.for_all is_const_pos poslist
let pospath2intlist (a,poslist) =
let intlist =
List.map
(fun pos ->
match pos with
|Array(Int(i))|Tuple(i) ->i
|Ref ->0
|_ ->assert false)
poslist
in
(a,intlist)
let print_apos (a,pos)=
match pos with
|Array(Int(i))->Format.eprintf "%s.(%d)@." a i
|Array(Index(i))->Format.eprintf "%s.(i+%d)@." a i
|Array(_) ->Format.eprintf "%s.(unknown)@." a
|Tuple(i) ->Format.eprintf "tuple:%s,elm:%d@." a i
|Ref ->Format.eprintf "ref:%sd,elm@." a
let rec subst env =function
|Elm(a,pos)->Elm(find a env,pos)
|Parent(pas)->Parent(List.map (fun (pos,a) ->(pos,find a env)) pas)
|Arraytree_var(a) ->Arraytree_var(find a env)
|Trace_add(x,y) ->Trace_add(find x env,find y env)
|e ->e
(*変数が*)
let cmple e1 e2 =
match (e1,e2) with
|Int(i1),Int(i2) ->Some (i1<=i2)
|Float(d1),Float(d2) ->Some (d1<=d2)
|_ ->None
let cmpeq e1 e2 =
match (e1,e2) with
|Int(i1),Int(i2) ->Some (i1=i2)
|Float(d1),Float(d2) ->Some (d1=d2)
|_ ->None
let is_intpos = function
|Array(Int _)|Tuple _ ->true
|_ ->false
let is_indexpos = function
|Array(Index _) ->true
|_ ->false