-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathНазва.ц
276 lines (266 loc) · 22.3 KB
/
Назва.ц
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
взяти визначення МаМа;
секція МаМа {
місцева дія назва_з_Ю8(М: адреса<Машина>, значення: ю8): адреса<Назва> {
вернути знайти_або_виділити_й_додати_назву_з_ю8(М, М.БН::адреса, значення);
}
місцева дія позиція_назви_з_ю8(М: адреса<Машина>, значення: ю8): позитивне {
вернути додати_назву_з_ю8(М, М.БН::адреса, значення);
}
місцева дія перевірити_чи_назви_рівні(назва1: адреса<Назва>, назва2: адреса<Назва>): логічне {
вернути назва1 == назва2;
}
місцева дія виділити_назву_текст(М: адреса<Машина>, значення: текст): адреса<Назва> {
ціль назва = виділити<Назва>(М);
назва.кодування = КОДУВАННЯ_НАЗВИ_КД;
ціль значення_тексту = текст { пусто, 0 };
якщо виділити_копію_тексту_цілі(М, значення як текст, значення_тексту::адреса) == ні {
// потім: помилка
}
назва.значення = значення_тексту;
вернути назва;
}
місцева дія виділити_назву_ю8(М: адреса<Машина>, значення: ю8): адреса<Назва> {
ціль назва = виділити<Назва>(М);
назва.кодування = КОДУВАННЯ_НАЗВИ_Ю8;
ціль значення_ю8 = ю8 { пусто, 0 };
якщо виділити_копію_ю8_цілі(М, значення як ю8, значення_ю8::адреса) == ні {
// потім: помилка
}
назва.значення = значення_ю8;
вернути назва;
}
місцева дія зробити_базу_назв(М: адреса<Машина>): БазаНазв {
ціль БН: БазаНазв;
БН.дані = зробити_накопичувач<адреса<Назва>>(М);
БН.С.предок = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"предок");
БН.С.чародія_додати = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_додати");
БН.С.чародія_відняти = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_відняти");
БН.С.чародія_помножити = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_помножити");
БН.С.чародія_поділити = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_поділити");
БН.С.чародія_остача = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_остача");
БН.С.чародія_неповна_частка = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_неповна_частка");
БН.С.чародія_степінь = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_степінь");
БН.С.чародія_вліво = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_вліво");
БН.С.чародія_вправо = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_вправо");
БН.С.чародія_вправо_зі_заповненням = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_вправо_зі_заповненням");
БН.С.чародія_двійкове_і = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_двійкове_і");
БН.С.чародія_двійкове_або = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_двійкове_або");
БН.С.чародія_двійкове_виключне_або = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_двійкове_виключне_або");
БН.С.чародія_двійкове_не = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_двійкове_не");
БН.С.чародія_більше = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_більше");
БН.С.чародія_менше = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_менше");
БН.С.чародія_містить = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_містить");
БН.С.чародія_відʼємне = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_відʼємне");
БН.С.чародія_виконати = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_виконати");
БН.С.чародія_отримати_елемент = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_отримати_елемент");
БН.С.чародія_змінити_елемент = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_змінити_елемент");
БН.С.чародія_видалити_елемент = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_видалити_елемент");
БН.С.чародія_перебір = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_перебір");
БН.С.чародія_число = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_число");
БН.С.чародія_текст = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_текст");
БН.С.чародія_юнікод = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_юнікод");
БН.С.чародія_список = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_список");
БН.С.чародія_словник = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_словник");
БН.С.чародія_збільшити = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_збільшити");
БН.С.чародія_зменшити = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_зменшити");
БН.С.чародія_байти = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_байти");
БН.С.предмет = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"предмет");
БН.С.Структура = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"Структура");
БН.С.НативнаДія = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"НативнаДія");
БН.С.Дія = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"Дія");
БН.С.число = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"число");
БН.С.текст = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"текст");
БН.С.юнікод = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"юнікод");
БН.С.друк = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"друк");
БН.С.модуль = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"модуль");
БН.С.біб = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"біб");
БН.С.пак = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"пак");
БН.С.Модуль = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"Модуль");
БН.С.список = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"список");
БН.С.словник = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"словник");
БН.С.логічне = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"логічне");
БН.С.так = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"так");
БН.С.ні = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"ні");
БН.С.додати = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"додати");
БН.С.значення = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"значення");
БН.С.назва = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"назва");
БН.С.забрати = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"забрати");
БН.С.ключ = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"ключ");
БН.С.розмір = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"розмір");
БН.С.довжина = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"довжина");
БН.С.фільтрувати = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"фільтрувати");
БН.С.д = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"д");
БН.С.новий_список = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"новий_список");
БН.С.знайти = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"знайти");
БН.С.знайти_позицію = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"знайти_позицію");
БН.С.перетворити = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"перетворити");
БН.С.обернути = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"обернути");
БН.С.М = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"М");
БН.С.мавка = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"мавка");
БН.С.МаМа = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"МаМа");
БН.С.перебір = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"перебір");
БН.С.далі = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"далі");
БН.С.сп = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"сп");
БН.С.позиція = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"позиція");
БН.С.визначення = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"визначення");
БН.С.ключі = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"ключі");
БН.С.видалити = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"видалити");
БН.С.байти = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"байти");
БН.С.байт = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"байт");
БН.С.читати = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"читати");
БН.С.читати_юнікод = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"читати_юнікод");
БН.С.префікс = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"префікс");
БН.С.додати_символ = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"додати_символ");
БН.С.адреса = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"адреса");
БН.С.чародія_адреса = знайти_або_виділити_й_додати_назву_з_ю8(М, БН::адреса, ю8"чародія_адреса");
вернути БН;
}
місцева дія додати_назву_з_ю8(М: адреса<Машина>, БН: адреса<БазаНазв>, значення: ю8): позитивне {
змінна ціль дані_значення: памʼять<п8> = значення.дані;
змінна ціль розмір_значення: позитивне = значення.розмір;
змінна ціль кодування: позитивне = КОДУВАННЯ_НАЗВИ_Ю8;
ціль значення_КД = виділити<п8>(М, розмір_значення + 1);
ціль розмір_перекодованого_в_КД = КД::перекодувати_з_Ю8(дані_значення, розмір_значення, значення_КД);
якщо розмір_перекодованого_в_КД == 0 {
кодування = КОДУВАННЯ_НАЗВИ_Ю8;
} інакше {
значення_КД[розмір_перекодованого_в_КД] = 0;
дані_значення = значення_КД;
розмір_значення = розмір_перекодованого_в_КД;
кодування = КОДУВАННЯ_НАЗВИ_КД;
}
змінна ціль позиція: позитивне = 0;
поки позиція < БН.дані.розмір {
ціль назва = БН.дані.дані[позиція];
якщо назва.кодування == кодування {
якщо кодування == КОДУВАННЯ_НАЗВИ_КД {
якщо перевірити_чи_тексти_рівні(назва.значення як текст, текст { дані_значення, розмір_значення }) {
вернути позиція;
}
} інакше {
якщо перевірити_чи_ю8_рівні(назва.значення як ю8, ю8 { дані_значення, розмір_значення }) {
вернути позиція;
}
}
}
позиція = позиція + 1;
}
змінна ціль назва: адреса<Назва> = пусто;
якщо кодування == КОДУВАННЯ_НАЗВИ_КД {
назва = виділити_назву_текст(М, текст { дані_значення, розмір_значення });
} інакше {
назва = виділити_назву_ю8(М, ю8 { дані_значення, розмір_значення });
}
звільнити(М, значення_КД як адреса);
покласти_в_накопичувач<адреса<Назва>>(М, БН.дані::адреса, назва);
вернути БН.дані.розмір - 1;
}
місцева дія знайти_або_виділити_й_додати_назву_з_ю8(М: адреса<Машина>, БН: адреса<БазаНазв>, значення: ю8): адреса<Назва> {
ціль позиція_назви = додати_назву_з_ю8(М, БН, значення);
вернути БН.дані.дані[позиція_назви];
}
місцева дія виділити_ю8_з_назви(М: адреса<Машина>, назва: адреса<Назва>, вихід: адреса<ю8>): логічне {
якщо назва.кодування == КОДУВАННЯ_НАЗВИ_Ю8 {
вернути виділити_копію_ю8_цілі(М, назва.значення як ю8, вихід);
} інакше {
ціль значення = назва.значення як текст;
ціль значення_ю8 = виділити<п8>(М, значення.розмір * 3 + 1);
ціль розмір_перекодованого_в_Ю8 = КД::перекодувати_в_Ю8(значення.дані, значення.розмір, значення_ю8);
якщо розмір_перекодованого_в_Ю8 == 0 {
надрукувати_Ю8(М, ю8"!!! Щось пішло не так під час отримання Ю8 з назви!");
вернути ні;
} інакше {
значення_ю8[розмір_перекодованого_в_Ю8] = 0;
вихід::вміст = ю8 { значення_ю8, розмір_перекодованого_в_Ю8 };
вернути так;
}
}
}
місцева дія перевірити_чи_назва_чародія(М: адреса<Машина>, назва: адреса<Назва>): логічне {
якщо назва == М.БН.С.чародія_отримати_елемент {
вернути так;
}
якщо назва == М.БН.С.чародія_змінити_елемент {
вернути так;
}
якщо назва == М.БН.С.чародія_перебір {
вернути так;
}
якщо назва == М.БН.С.чародія_додати {
вернути так;
}
якщо назва == М.БН.С.чародія_відняти {
вернути так;
}
якщо назва == М.БН.С.чародія_помножити {
вернути так;
}
якщо назва == М.БН.С.чародія_поділити {
вернути так;
}
якщо назва == М.БН.С.чародія_остача {
вернути так;
}
якщо назва == М.БН.С.чародія_неповна_частка {
вернути так;
}
якщо назва == М.БН.С.чародія_степінь {
вернути так;
}
якщо назва == М.БН.С.чародія_вліво {
вернути так;
}
якщо назва == М.БН.С.чародія_вправо {
вернути так;
}
якщо назва == М.БН.С.чародія_вправо_зі_заповненням {
вернути так;
}
якщо назва == М.БН.С.чародія_двійкове_і {
вернути так;
}
якщо назва == М.БН.С.чародія_двійкове_або {
вернути так;
}
якщо назва == М.БН.С.чародія_двійкове_виключне_або {
вернути так;
}
якщо назва == М.БН.С.чародія_двійкове_не {
вернути так;
}
якщо назва == М.БН.С.чародія_більше {
вернути так;
}
якщо назва == М.БН.С.чародія_менше {
вернути так;
}
якщо назва == М.БН.С.чародія_містить {
вернути так;
}
якщо назва == М.БН.С.чародія_відʼємне {
вернути так;
}
якщо назва == М.БН.С.чародія_число {
вернути так;
}
якщо назва == М.БН.С.чародія_текст {
вернути так;
}
якщо назва == М.БН.С.чародія_юнікод {
вернути так;
}
якщо назва == М.БН.С.чародія_список {
вернути так;
}
якщо назва == М.БН.С.чародія_словник {
вернути так;
}
якщо назва == М.БН.С.чародія_збільшити {
вернути так;
}
якщо назва == М.БН.С.чародія_зменшити {
вернути так;
}
вернути ні;
}
}