source: to-imperative/trunk/compiler/src/org/refal/plus/compiler/rfp_clashes.rf @ 3589

Last change on this file since 3589 was 3589, checked in by yura, 13 years ago
  • Compiler files are moved into package org.refal.plus.compiler.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 19.1 KB
Line 
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 */
59Entries 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
71Add_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
80Classify_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
122Compute_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
131Compute_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
139Compute_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
148Reclassify_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
170Free_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
181Init_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
193Compose_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 */
236Update_Hard_Parts =
237  <UHP () () <Get &Clashes>> :: e.clashes (e.actions),
238  <Store &Clashes e.clashes>,
239  e.actions;
240
241UHP (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 */
274UHP_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
308Prepare_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
324Define_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
343Not_Idx {
344  s.idx (s.idx e) = $fail;
345  e.else_true;
346};
347
348Compose_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
366Find_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
378Not_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
385Get_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 */
423Get_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
447Ref_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
Note: See TracBrowser for help on using the repository browser.