1 | //*********************************** ************************************ |
---|
2 | //*********** О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫ ************* |
---|
3 | |
---|
4 | $use Access Apply Arithm Box Compare List StdIO Table; |
---|
5 | |
---|
6 | $use "org.refal.plus.compiler.rfp_asail"; |
---|
7 | $use "org.refal.plus.compiler.rfp_const"; |
---|
8 | $use "org.refal.plus.compiler.rfp_vars"; |
---|
9 | $use "org.refal.plus.compiler.rfp_helper"; |
---|
10 | |
---|
11 | |
---|
12 | /* |
---|
13 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
14 | */ |
---|
15 | $box Clashes; |
---|
16 | /* |
---|
17 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ нёО©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫: |
---|
18 | * |
---|
19 | * t.clash ::= (s.idx (e.Re) (s.dir e.Pe) e.boxes) |
---|
20 | * |
---|
21 | * e.boxes -- О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫О©╫ |
---|
22 | * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, |
---|
23 | * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫. |
---|
24 | * |
---|
25 | * |
---|
26 | * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
27 | * |
---|
28 | */ |
---|
29 | |
---|
30 | |
---|
31 | /* |
---|
32 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ |
---|
33 | * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ |
---|
34 | * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫сё О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ |
---|
35 | * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
36 | * |
---|
37 | * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ |
---|
38 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫: |
---|
39 | * (e.left) (e.right) expr. |
---|
40 | * e.left -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫-О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ |
---|
41 | * О©╫О©╫О©╫О©╫О©╫. |
---|
42 | * e.right -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
43 | * expr -- О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ жёО©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
44 | */ |
---|
45 | $table Hard_Parts; |
---|
46 | |
---|
47 | |
---|
48 | $box Parenth; |
---|
49 | |
---|
50 | |
---|
51 | $box Unready_Source; |
---|
52 | |
---|
53 | |
---|
54 | |
---|
55 | $func Entries e.expr (e.source) = s.num e.res; |
---|
56 | /* |
---|
57 | * Returns number of e.expr entries in e.source and e.source without all e.expr's. |
---|
58 | */ |
---|
59 | Entries e.expr (e.source) = |
---|
60 | 0 e.source () $iter { |
---|
61 | e.source : e1 e.expr e2 = <Add s.num 1> e2 (e.res e1); |
---|
62 | s.num (e.res e.source); |
---|
63 | } :: s.num e.source (e.res), |
---|
64 | e.source : /*empty*/ = |
---|
65 | s.num e.res; |
---|
66 | |
---|
67 | |
---|
68 | |
---|
69 | $func Add_Clash_To_Var e = e; |
---|
70 | |
---|
71 | Add_Clash_To_Var t.clash t.var = |
---|
72 | <Set_Var (Clashes <Get_Var Clashes t.var> t.clash) t.var>; |
---|
73 | |
---|
74 | $func Classify_Lengths t.clash = e.boxes; |
---|
75 | |
---|
76 | $func Compute_Bounds s.idx (e.len_Re) (e.vars_Re) (e.len_Pe) (e.vars_Pe) = ; |
---|
77 | $func Compute_Max s.idx (e.len1) (e.vars1) (e.len2) (e.vars2) t.var1 = ; |
---|
78 | $func Compute_Min s.idx (e.len1) (e.vars1) (e.len2) (e.vars2) t.var1 = ; |
---|
79 | |
---|
80 | Classify_Lengths (s.idx (e.Re) (s.dir e.Pe) e) = |
---|
81 | <Get_Known_Length e.Re> :: e.len_Re (e.vars_Re), |
---|
82 | <Get_Known_Length e.Pe> :: e.len_Pe (e.vars_Pe), |
---|
83 | { |
---|
84 | /* |
---|
85 | * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ e.Re О©╫ e.Pe |
---|
86 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫дёО©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ &Known-Lengths. |
---|
87 | */ |
---|
88 | e.vars_Re : /*empty*/, e.vars_Pe : /*empty*/ = |
---|
89 | <Bind &Known_Lengths (s.idx) ((e.len_Re) (e.len_Pe))>, |
---|
90 | &Known_Lengths; |
---|
91 | /* |
---|
92 | * О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫сёО©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ |
---|
93 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ |
---|
94 | * О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫ её О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
95 | * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫. |
---|
96 | * О©╫О©╫О©╫дёО©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ &Compute-Length. |
---|
97 | */ |
---|
98 | <Arithm.Sub <Length e.vars_Re> <Length e.vars_Pe>> :: s.diff, |
---|
99 | <Ne (s.diff) (0)>, |
---|
100 | <Nub e.vars_Re e.vars_Pe> : t.var = |
---|
101 | { |
---|
102 | <Lt (s.diff) (0)> = <Mult s.diff -1> (e.len_Re) (e.len_Pe); |
---|
103 | s.diff (e.len_Pe) (e.len_Re); |
---|
104 | } :: s.mult (e.minuend) (e.subtrahend), |
---|
105 | <Map &Add_Clash_To_Var s.idx (e.vars_Re e.vars_Pe)> : e, |
---|
106 | <Bind &Compute_Length (s.idx) (t.var s.mult (e.minuend) (e.subtrahend))>, |
---|
107 | &Compute_Length; |
---|
108 | /* |
---|
109 | * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫сё, О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ -- О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ |
---|
110 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ |
---|
111 | * О©╫О©╫О©╫О©╫О©╫-О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
112 | * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫. |
---|
113 | * О©╫О©╫О©╫дёО©╫ О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ &Unknown-Lengths. |
---|
114 | */ |
---|
115 | <Compute_Bounds s.idx (e.len_Re) (e.vars_Re) (e.len_Pe) (e.vars_Pe)>, |
---|
116 | <Map &Add_Clash_To_Var s.idx (e.vars_Re e.vars_Pe)> : e, |
---|
117 | <Bind &Unknown_Lengths |
---|
118 | (s.idx) ((e.len_Re) (e.len_Pe) (e.vars_Re) (e.vars_Pe))>, |
---|
119 | &Unknown_Lengths; |
---|
120 | }; |
---|
121 | |
---|
122 | Compute_Bounds s.idx (e.len_Re) (e.vars_Re) (e.len_Pe) (e.vars_Pe) = |
---|
123 | (e.vars_Re) (e.vars_Pe) $iter { |
---|
124 | e.vars_Re : e1 t.var e2, \{ e.vars_Pe : e3 t.var e4 = (e1 e2) (e3 e4); }; |
---|
125 | (e.vars_Re) (e.vars_Pe) Stop; |
---|
126 | } :: (e.vars_Re) (e.vars_Pe) e.stop, |
---|
127 | e.stop : Stop = |
---|
128 | <Map &Compute_Max s.idx (e.len_Pe) (e.vars_Pe) (e.len_Re) (e.vars_Re) (e.vars_Pe)> : e, |
---|
129 | <Map &Compute_Min s.idx (e.len_Re) (e.vars_Re) (e.len_Pe) (e.vars_Pe) (e.vars_Re)> : e; |
---|
130 | |
---|
131 | Compute_Max s.idx (e.len1) (e.vars1) (e.len2) (e.vars2) t.var1 = |
---|
132 | <"rfp_clashes.Entries" t.var1 (e.vars1)> :: s.n e.vars_left, |
---|
133 | <Set_Var_MaxBound t.var1 s.idx |
---|
134 | <ASAIL_DIV |
---|
135 | <ASAIL_SUB <ASAIL_ADD e.len2 <Map &Get_Var_Max (e.vars2)>> |
---|
136 | <ASAIL_ADD e.len1 <Map &Get_Var_Min (e.vars_left)>>> |
---|
137 | s.n>>; |
---|
138 | |
---|
139 | Compute_Min s.idx (e.len1) (e.vars1) (e.len2) (e.vars2) t.var1 = |
---|
140 | <"rfp_clashes.Entries" t.var1 (e.vars1)> :: s.n e.vars_left, |
---|
141 | <Set_Var_MinBound t.var1 s.idx |
---|
142 | <ASAIL_DIV |
---|
143 | <ASAIL_SUB <ASAIL_ADD e.len2 <Map &Get_Var_Min (e.vars2)>> |
---|
144 | <ASAIL_ADD e.len1 <Map &Get_Var_Max (e.vars_left)>>> |
---|
145 | s.n>>; |
---|
146 | |
---|
147 | |
---|
148 | Reclassify_Clash s.idx, { |
---|
149 | <Get &Clashes> : e1 (s.idx (e.Re) (s.dir e.Pe) e.boxes) e2, |
---|
150 | <List.Sub (e.boxes) &Compute_Length &Unknown_Lengths> :: e.boxes1, |
---|
151 | <Unbind &Compute_Length s.idx>, |
---|
152 | <Unbind &Unknown_Lengths s.idx>, |
---|
153 | <Classify_Lengths (s.idx (e.Re) (s.dir e.Pe))> :: e.boxes2, |
---|
154 | <Store &Clashes e1 (s.idx (e.Re) (s.dir e.Pe) e.boxes1 e.boxes2) e2>; |
---|
155 | /* |
---|
156 | * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ s.idx О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ -- О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ |
---|
157 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
158 | */ |
---|
159 | ; |
---|
160 | }; |
---|
161 | |
---|
162 | |
---|
163 | |
---|
164 | //********************* О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ *********************** |
---|
165 | |
---|
166 | $box FreeIdx; |
---|
167 | |
---|
168 | $func Free_Index = s.idx; |
---|
169 | |
---|
170 | Free_Index = |
---|
171 | <Get &FreeIdx> : s.idx, |
---|
172 | <Store &FreeIdx <Arithm.Add s.idx 1>>, |
---|
173 | s.idx; |
---|
174 | |
---|
175 | |
---|
176 | |
---|
177 | //**************************** О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ****************************** |
---|
178 | |
---|
179 | $func Compose_Clashes e.clashes = e.clashes; |
---|
180 | |
---|
181 | Init_Clashes e.clashes = |
---|
182 | <ClearTable &Known_Lengths>, |
---|
183 | <ClearTable &Compute_Length>, |
---|
184 | <ClearTable &Unknown_Lengths>, |
---|
185 | <Store &Checked_Lengths /*empty*/>, |
---|
186 | <Store &Eqs /*empty*/>, |
---|
187 | <Store &Parenth /*empty*/>, |
---|
188 | <Store &Unready_Source /*empty*/>, |
---|
189 | <ClearTable &Hard_Parts>, |
---|
190 | <Store &FreeIdx 0>, |
---|
191 | <Store &Clashes <Compose_Clashes e.clashes>>; |
---|
192 | |
---|
193 | Compose_Clashes { |
---|
194 | (e.Re) (s.dir e.Pe) e.rest = |
---|
195 | <Free_Index> :: s.idx, |
---|
196 | <Classify_Lengths (s.idx (e.Re) (s.dir e.Pe))> :: e.boxes, |
---|
197 | { |
---|
198 | \{ |
---|
199 | <Get_Var "Instantiated?" e.Re> : True; |
---|
200 | e.Re : (REF e); |
---|
201 | e.Re : (STATIC e); |
---|
202 | }; |
---|
203 | e.Pe : e1 (PAREN e) e2 = |
---|
204 | <Vars e.Re> :: e.Re_vars, |
---|
205 | <Put &Parenth (s.idx (e.Re_vars) <Vars e1>)>, |
---|
206 | { |
---|
207 | e2 : $r e (PAREN e) e3 = |
---|
208 | <Put &Parenth (s.idx (e.Re_vars) <Vars e3>)>;; |
---|
209 | }, |
---|
210 | <Put &Unready_Source (s.idx e.Re_vars)>; |
---|
211 | <Put &Unready_Source (s.idx <Vars e.Re>)>; |
---|
212 | }, |
---|
213 | (s.idx (e.Re) (s.dir e.Pe) e.boxes) <Compose_Clashes e.rest>;; |
---|
214 | }; |
---|
215 | |
---|
216 | |
---|
217 | |
---|
218 | |
---|
219 | //****** О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ ******** |
---|
220 | |
---|
221 | $func UHP (e.conds) (e.assigns) e.clashes = e.clashes (e.actions); |
---|
222 | |
---|
223 | $func UHP_Clash s.dir s.fun s.l s.r (e.conds) (e.assigns) (e.pos) (e.Re) e.Pe = |
---|
224 | e.clashes (e.conds) (e.assigns) (e.pos) (e.Pe); |
---|
225 | |
---|
226 | /* |
---|
227 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫. |
---|
228 | * О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ |
---|
229 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ жёО©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ |
---|
230 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ &Hard-Parts, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, |
---|
231 | * О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫. |
---|
232 | * О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ жёО©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ |
---|
233 | * О©╫О©╫О©╫О©╫ &Eqs О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ |
---|
234 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
235 | */ |
---|
236 | Update_Hard_Parts = |
---|
237 | <UHP () () <Get &Clashes>> :: e.clashes (e.actions), |
---|
238 | <Store &Clashes e.clashes>, |
---|
239 | e.actions; |
---|
240 | |
---|
241 | UHP (e.conds) (e.assigns) e.clashes, e.clashes : { |
---|
242 | t.clash e.rest, |
---|
243 | t.clash : (s.idx (t.Re) (s.dir e.Pe) e), |
---|
244 | \{ |
---|
245 | <Get_Var "Instantiated?" t.Re> : True; |
---|
246 | t.Re : (REF e); |
---|
247 | t.Re : (STATIC e); |
---|
248 | } = |
---|
249 | { |
---|
250 | <Lookup &Hard_Parts s.idx>; |
---|
251 | (0) (0) e.Pe; |
---|
252 | } : (e.left) (e.right) expr, |
---|
253 | <UHP_Clash s.dir &L 1 0 () () (e.left ) (t.Re) expr> |
---|
254 | :: e.l_clashes (e.l_conds) (e.l_assigns) (e.left ) (expr), |
---|
255 | <UHP_Clash s.dir &R 0 1 () () (e.right) (t.Re) expr> |
---|
256 | :: e.r_clashes (e.r_conds) (e.r_assigns) (e.right) (expr), |
---|
257 | <Bind &Hard_Parts (s.idx) ((e.left) (e.right) expr)>, |
---|
258 | <Compose_Clashes e.l_clashes> t.clash <Compose_Clashes e.r_clashes> |
---|
259 | <UHP (e.conds e.l_conds e.r_conds) (e.assigns e.l_assigns e.r_assigns) e.rest>; |
---|
260 | t.unready_clash e.rest = t.unready_clash <UHP (e.conds) (e.assigns) e.rest>; |
---|
261 | /*empty*/ = (e.conds e.assigns); |
---|
262 | }; |
---|
263 | |
---|
264 | /* |
---|
265 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ |
---|
266 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ s.dir. |
---|
267 | * |
---|
268 | * О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ -- О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫дёО©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, |
---|
269 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ |
---|
270 | * О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ |
---|
271 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
272 | * О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
273 | */ |
---|
274 | UHP_Clash s.dir s.fun s.l s.r (e.conds) (e.assigns) (e.pos) (e.Re) e.Pe, { |
---|
275 | e.Pe : v, <Apply s.fun 0 e.Pe> : t.Pt, { |
---|
276 | <Get_Known_Length t.Pt> : e.len (), { |
---|
277 | t.Pt : (PAREN expr) = |
---|
278 | <Gener_Vars ((VAR)) "deref_" e.Re> : t.var, |
---|
279 | <Set_Var ("Instantiated?" True) t.var>, |
---|
280 | { |
---|
281 | s.fun : &R = RIGHT e.pos 1; |
---|
282 | LEFT e.pos; |
---|
283 | } :: e.pos, |
---|
284 | (("SYMBOL?" e.Re (e.pos))) |
---|
285 | ((DEREF t.var e.Re (e.pos))) |
---|
286 | (t.var) (s.dir expr); |
---|
287 | { |
---|
288 | s.fun : &R = <Put &Eqs ((e.Re) (RIGHT e.pos e.len) t.Pt (e.len))>; |
---|
289 | <Put &Eqs ((e.Re) (LEFT e.pos) t.Pt (e.len))>; |
---|
290 | }, |
---|
291 | () () /*empty*/; |
---|
292 | } :: (e.cond) (e.assign) e.clash = |
---|
293 | e.clash |
---|
294 | <UHP_Clash s.dir s.fun s.l s.r (e.conds e.cond) (e.assigns e.assign) |
---|
295 | (e.pos e.len) (e.Re) <Middle s.l s.r e.Pe>>; |
---|
296 | (e.conds) (e.assigns) (e.pos) (e.Pe); |
---|
297 | }; |
---|
298 | (e.conds) (e.assigns) (e.pos) (); |
---|
299 | }; |
---|
300 | |
---|
301 | |
---|
302 | |
---|
303 | |
---|
304 | $func Prepare_Source e.source = t.var e.assign; |
---|
305 | |
---|
306 | $func Define_Vars e.vars = e.eqs; |
---|
307 | |
---|
308 | Prepare_Source { |
---|
309 | t.Re, \{ |
---|
310 | <Get_Var "Instantiated?" t.Re> : True; |
---|
311 | t.Re : (REF e); |
---|
312 | t.Re : (STATIC e); |
---|
313 | } = |
---|
314 | t.Re /*empty*/; |
---|
315 | t.Re, <IsVar t.Re> = |
---|
316 | t.Re <Define_Vars t.Re>; |
---|
317 | e.Re = |
---|
318 | <Gener_Vars ((EVAR)) "compose"> : t.var, |
---|
319 | <Set_Var ("Instantiated?" True) t.var>, |
---|
320 | <Vars_Decl Expr t.var> : e, // ??? |
---|
321 | t.var <Define_Vars <Vars e.Re>> (DECL Expr <Vars_Print t.var> e.Re); |
---|
322 | }; |
---|
323 | |
---|
324 | Define_Vars { |
---|
325 | t.var e.rest = |
---|
326 | { |
---|
327 | <Get_Var "Instantiated?" t.var> : True = <Define_Vars e.rest>; |
---|
328 | <Get &Eqs> : e1 (t.Re t.pos t.var t.len) e2 = |
---|
329 | <Store &Eqs e1 e2>, |
---|
330 | (t.Re t.pos t.var t.len) <Define_Vars e.rest>; |
---|
331 | }; |
---|
332 | /*empty*/ = /*empty*/; |
---|
333 | }; |
---|
334 | |
---|
335 | |
---|
336 | |
---|
337 | $func Find_SFD e.parenth = e.parenth (e.idx); |
---|
338 | |
---|
339 | $func? Not_Instantiated_Var e = e; |
---|
340 | |
---|
341 | $func? Not_Idx e = e; |
---|
342 | |
---|
343 | Not_Idx { |
---|
344 | s.idx (s.idx e) = $fail; |
---|
345 | e.else_true; |
---|
346 | }; |
---|
347 | |
---|
348 | Compose_Source = \{ |
---|
349 | <Find_SFD <Get &Parenth>> : e.parenth (s.idx) = |
---|
350 | <Store &Parenth e.parenth>, |
---|
351 | <Store &Unready_Source <Filter &Not_Idx s.idx (<Get &Unready_Source>)>>, |
---|
352 | s.idx; |
---|
353 | <Get &Unready_Source> : e.l (s.idx e.vars) e.r, |
---|
354 | <Filter &Not_Instantiated_Var (e.vars)> : /*empty*/ = |
---|
355 | <Store &Unready_Source e.l e.r>, |
---|
356 | <Store &Parenth <Filter &Not_Idx s.idx (<Get &Parenth>)>>, |
---|
357 | s.idx; |
---|
358 | } :: s.idx, |
---|
359 | { |
---|
360 | <Get &Clashes> : e1 (s.idx (e.Re) (s.dir e.Pe) e.boxes) e2, |
---|
361 | <Prepare_Source e.Re> :: t.var e.assign, |
---|
362 | <Store &Clashes e1 (s.idx (t.var) (s.dir e.Pe) e.boxes) e2>, |
---|
363 | e.assign; |
---|
364 | }; |
---|
365 | |
---|
366 | Find_SFD { |
---|
367 | (s.idx (e.Re_vars) e.Pe_vars) e.rest = |
---|
368 | <Filter &Not_Instantiated_Var (e.Re_vars)> : { |
---|
369 | v.r_vars = (s.idx (v.r_vars) e.Pe_vars) <Find_SFD e.rest>; |
---|
370 | /*empty*/ = <Get_Known_Length e.Pe_vars> : { |
---|
371 | e (v.p_vars) = (s.idx () v.p_vars) <Find_SFD e.rest>; |
---|
372 | e () = <Filter &Not_Idx s.idx (e.rest)> (s.idx); |
---|
373 | }; |
---|
374 | }; |
---|
375 | /*empty*/ = (); |
---|
376 | }; |
---|
377 | |
---|
378 | Not_Instantiated_Var t.var = # \{ |
---|
379 | <Get_Var "Instantiated?" t.var> : True; |
---|
380 | <Get &Eqs> : e (t t t.var t) e; |
---|
381 | }; |
---|
382 | |
---|
383 | |
---|
384 | |
---|
385 | Get_Cycle = |
---|
386 | <Get &Clashes> : e (s.idx (t.var) (s.dir e.Pe) e.b1 &Unknown_Lengths e.b2) e.rest = |
---|
387 | <Get_Known_Length t.var> : e.len (), |
---|
388 | <Lookup &Hard_Parts s.idx> : (e.left) (e.right) e.expr, |
---|
389 | s.dir : { |
---|
390 | LEFT = |
---|
391 | e.expr : t.var_e1 e.Pe_rest, |
---|
392 | LSPLIT t.var_e1 "lsplit_" e.Pe_rest; |
---|
393 | RIGHT = |
---|
394 | e.expr : e.Pe_rest t.var_e1, |
---|
395 | RSPLIT t.var_e1 "rsplit_" e.Pe_rest; |
---|
396 | } :: s.split t.var_e1 s.pref_e2 e.Pe_rest, |
---|
397 | { |
---|
398 | <IsVar e.Pe_rest> = |
---|
399 | e.Pe_rest ((e.Pe_rest) (s.dir <Gener_Len_Var e.Pe_rest>)); |
---|
400 | // <Vars-Reset e.Pe-rest>; |
---|
401 | <Gener_Vars ((VAR)) s.pref_e2 t.var> : t.var_e2, |
---|
402 | t.var_e2 ((t.var_e2) (s.dir e.Pe_rest)); |
---|
403 | } : t.var_e2 (e.clash), |
---|
404 | <Set_Var ("Instantiated?" True) t.var_e1>, |
---|
405 | <Set_Var ("Instantiated?" True) t.var_e2>, |
---|
406 | <Store &Clashes <Compose_Clashes e.clash> e.rest>, |
---|
407 | <Get_Var Clashes t.var_e1> <Get_Var Clashes t.var_e2> :: e.clashes, |
---|
408 | <Map &Reclassify_Clash (<List.Sub (e.clashes) <Get &Checked_Lengths>>)> : e, |
---|
409 | s.split (e.left) (e.right) (e.len) t.var t.var_e1 t.var_e2; |
---|
410 | |
---|
411 | |
---|
412 | |
---|
413 | |
---|
414 | $func Ref_Len t.name = e.length; |
---|
415 | |
---|
416 | /* |
---|
417 | * О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ |
---|
418 | * О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫щё О©╫О©╫ |
---|
419 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ run-time). О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ |
---|
420 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ |
---|
421 | * О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
422 | */ |
---|
423 | Get_Known_Length e.Re = |
---|
424 | e.Re (/*e.length*/) (/*e.unknown-vars*/) $iter { |
---|
425 | e.Re : t.Rt e.rest, t.Rt : { |
---|
426 | s.ObjectSymbol = 1 (); // О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. |
---|
427 | (PAREN e) = 1 (); |
---|
428 | (FUNC e) = 1 (); |
---|
429 | ("FUNC?" e) = 1 (); |
---|
430 | (REF t.name) = <Ref_Len t.name> (); |
---|
431 | (STATIC t.name) = <Get_Known_Length <Get_Static t.Rt>>; |
---|
432 | t, <IsVar t.Rt>, { |
---|
433 | <Get_Var Length t.Rt> : v.len = v.len (); |
---|
434 | /*empty*/ (t.Rt); |
---|
435 | }; |
---|
436 | } :: e.len (e.var), |
---|
437 | e.rest (e.length e.len) (e.unknown_vars e.var); |
---|
438 | } :: e.Re (e.length) (e.unknown_vars), |
---|
439 | e.Re : /*empty*/ = |
---|
440 | { |
---|
441 | e.length : /*empty*/ = 0 (e.unknown_vars); |
---|
442 | e.length (e.unknown_vars); |
---|
443 | }; |
---|
444 | |
---|
445 | $table Const_Len; // Fixme: О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫? |
---|
446 | |
---|
447 | Ref_Len t.name = { |
---|
448 | <Lookup &Const_Len t.name>; |
---|
449 | <Get_Known_Length <Middle 2 0 <Lookup &Const t.name>>> :: e.len t = |
---|
450 | <Bind &Const_Len (t.name) (e.len)>, |
---|
451 | e.len; |
---|
452 | 1; |
---|
453 | }; |
---|
454 | |
---|
455 | |
---|