18. if (!check_ident(cell))
19. {
20. id.Rows.Add(" ");
21. id[0, v_id ].Value = Convert.ToString(v_id + 1);//запись в таблицу номера слова
22. id[1, v_id ].Value = cell;//в таблицу заносится слово
23. id[2, v_id ].Value = Convert.ToString("(10, "+(v_id+1)+ ")");//запись дискрипторного кода
24. dk.Text += id[2, v_id].Value.ToString();
25. pk.Text += Convert.ToString("id" + (v_id + 1)+ " "); pk.SelectionStart = pk.Text.Length;
26. v_id++;}
27. }
28. //добавить знак операции
29. void add_op(string cell, ref int v_op) {
30. if (!check_op(cell))
31. {
32. op.Rows.Add(" ");
33. op[0, v_op].Value = Convert.ToString(v_op + 1);//запись в таблицу номера слова
34. op[1, v_op].Value = cell;//в таблицу заносится слово
35. op[2, v_op].Value = Convert.ToString("(20, " + (v_op + 1) + ")");//запись дискрипторного кода
36. dk.Text += op[2, v_op].Value.ToString();//запись дискрипторного кода
37. pk.Text += cell+" "; pk.SelectionStart = pk.Text.Length;
38. v_op++;
39. }
40. }
41. //добавить знак синтаксиса
42. void add_synt(string cell, ref int v_sy) {
43. if (!check_synt(cell))
44. {synt.Rows.Add();
45. synt[0, v_sy].Value = Convert.ToString(v_sy + 1);//запись в таблицу номера слова
46. synt[1, v_sy].Value = cell;//в таблицу заносится слово
47. synt[2, v_sy].Value = Convert.ToString("(50, " + (v_sy + 1) + ")");//запись дискрипторного кода
48. dk.Text += synt[2, v_sy].Value.ToString();//запись дискрипторного кода
49. pk.Text += Convert.ToString(cell) + " ";
50. pk.SelectionStart = pk.Text.Length;
51. v_sy++;}
52. }
53. //добавить ключевое слово
54. void add_key(string cell, ref int v_k) {
55. if (!check_key(cell))
56. {
57. key.Rows.Add();
58. key[0, v_k].Value = Convert.ToString(v_k + 1);//запись в таблицу номера слова
59. key[1, v_k].Value = cell;//в таблицу заносится слово
60. key[2, v_k].Value = Convert.ToString("(40, " + (v_k + 1) + ")");//запись дискрипторного кода
61. dk.Text += key[2, v_k].Value.ToString();//запись дискрипторного кода
62. pk.Text += Convert.ToString(cell) + " "; pk.SelectionStart = pk.Text.Length;
63. v_k++;}
64. }
65. //добавить знак отношений
66. void add_cond(string cell, ref int v_con) {
67. if (!check_cond(cell))
68. {
69. cond.Rows.Add();
70. cond[0, v_con].Value = Convert.ToString(v_con + 1);//запись в таблицу номера слова
71. cond[1, v_con].Value = cell;//в таблицу заносится слово
72. cond[2, v_con].Value = Convert.ToString("(30, " + (v_con + 1) + ")");//запись дискрипторного кода
73. dk.Text += cond[2, v_con].Value.ToString();//запись дискрипторного кода
74. pk.Text += cell + " "; pk.SelectionStart = pk.Text.Length;
75. v_con++;
76. }
77. }
78. //добавить нераспознанный знак
79. void add_unId(char[] cell, ref int j, int i)
80. {
81. err.Text += "Error line: " + Convert.ToString(i+1)+Environment.NewLine;
82. while (j!=cell.Length-1) { j++;
83. if (cell[j] == ' ' || cell[j] == '\n') return;
84. }
85. return;
86. }
87. void add_nu(string cell, ref int v_nu)
88. {
89. if (!check_nu(cell))
90. {
91. nu.Rows.Add(" ");
92. nu[0, v_nu].Value = Convert.ToString(v_nu + 1);//запись в таблицу номера слова
93. nu[1, v_nu].Value = cell;//в таблицу заносится слово
94. nu[2, v_nu].Value = Convert.ToString("(60, " + (v_nu + 1) + ")");//запись дискрипторного кода
95. pk.Text += "const "; pk.SelectionStart = pk.Text.Length;
96. dk.Text += nu[2, v_nu].Value.ToString();
97. v_nu++;
98. }
99. }
100. //проверить наличие идентификатора
101. bool check_ident(string cell) {
102. if (id.Rows.Count != 0)
103. {
104. for (int i = 0; i < id.Rows.Count; i++)
105. {//если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение
106. if (id[1, i].Value.ToString() == cell)
107. {
108. dk.Text += id[2, i].Value.ToString(); pk.Text += Convert.ToString("id" + (i + 1) + " "); pk.SelectionStart = pk.Text.Length;
109. return true;
110. }
111. }
112. }
113. return false;
114. }
115. //проверить наличие операции
116. bool check_op(string cell) {
117. if (op.Rows.Count != 0)
118. {
119. for (int i = 0; i < op.Rows.Count; i++)
120. {//если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение
121. if (op[1, i].Value.ToString() == cell) { dk.Text += op[2, i].Value.ToString();
122. pk.Text += cell+" ";
123. pk.SelectionStart = pk.Text.Length;
124. return true; }}}
125. return false;
126. }
127. //проверить наличие синтаксиса
128. bool check_synt(string cell) {
129. if (synt.Rows.Count != 0)
130. {
131. for (int i = 0; i < synt.Rows.Count; i++)
132. {//если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение
133. if (synt[1, i].Value.ToString() == cell) { dk.Text += synt[2, i].Value.ToString(); pk.Text += Convert.ToString(cell) + " ";
134. pk.SelectionStart = pk.Text.Length; return true; }
135. }
136. }
137. return false;
138. }
139. //проверить наличие ключевого слова
140. bool check_key(string cell) {
141. if (key.Rows.Count != 0)
142. {
143. for (int i = 0; i < key.Rows.Count; i++)
144. {//если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение
145. if (key[1, i].Value.ToString() == cell)
146. {
147. dk.Text += key[2, i].Value.ToString(); pk.Text += Convert.ToString(cell) + " "; pk.SelectionStart = pk.Text.Length;
148. return true;
149. }
150. }
151. }
152. return false;
153. }
154. //проверить наличие отношений
155. bool check_cond(string cell) {
156. if (cond.Rows.Count != 0)
157. {
158. for (int i = 0; i < cond.Rows.Count; i++)
159. { //если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение
160. if (cond[1, i].Value.ToString() == cell) { dk.Text += cond[2, i].Value.ToString(); pk.Text += cell + " "; pk.SelectionStart = pk.Text.Length;
161. return true; }
162. }
163. }
164. return false;
165. }
166. bool check_nu(string cell)
167. {
168. if (nu.Rows.Count != 0)
169. {
170. for (int i = 0; i < nu.Rows.Count; i++)
171. {//если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение
172. if (nu[1, i].Value.ToString() == cell)
173. {
174. dk.Text += nu[2, i].Value.ToString(); pk.Text += "const "; pk.SelectionStart = pk.Text.Length;
175. return true;
176. }
177. }
178. }
179. return false;
180. }
181. bool alf (char b){
182. if (b >= 'A' && b <= 'Z' || b >= 'a' && b <= 'z') return false;
183. else return true;
184. }
185. bool numb(char b)
186. {
187. if (b >= '0' && b <= '9') return true;
188. else return false;
189. }
190. bool f_synt(char b)
191. {
192. if (b == ', ' || b == ':' || b == ';' || b == '(' || b == ')' || b == '{' || b == '}' || b == '[' || b == ']' || b == '"'|| b=='<' || b == '>' || b == '=' || b == '+' || b == '-' || b == '*' || b == '/' || b == '%') return true;
193. else return false;
194. }
195. void clear()
196. {
197. rich2.Clear(); err.Clear(); key.Rows.Clear(); op.Rows.Clear(); cond.Rows.Clear(); synt.Rows.Clear(); id.Rows.Clear(); nu.Rows.Clear(); dk.Clear(); pk.Clear(); v_id = 0; v_op = 0; v_sy = 0; v_k = 0; v_con = 0; v_nu = 0;
198. }
199. bool f_cond(char b)
200. {
201. if (b == '=' || b == '>' || b == '<' || b == '!') return true;
202. else return false;
203. }
204. public Form1()
205. {
206. InitializeComponent();
207. }
208. // создание начальных колонок в таблице
209. private void Form1_Load(object sender, EventArgs e)
210. {
211. }
212. //кнопка для ручного прохода по слову
213. private void Form1_SizeChanged(object sender, EventArgs e)
214. {
215. }
216. private void button3_Click(object sender, EventArgs e)
217. {
218. v_id = 0; v_op = 0; v_sy = 0; v_k = 0; v_con = 0;
219. }
220. private void button3_Click_1(object sender, EventArgs e)
221. {
222. clear(); //отчистка таблиц и текстовых полей
223. string str = null;
224. if (rich1.Text != "") //проверка на пустое поле
225. {
226. button2.Enabled = true; //активизация кнопки анализа
227. char[] h = Encoding.Default.GetChars(Encoding.Default.GetBytes(rich1.Text)); //инициализация текстового блока в массив символов
228. for (int i = 0; i < h.Length; i++)
229. {
230. if (h[i] == '/' && h[i + 1] == '/')
231. { //поиск 2-х слешей
232. while (h[i] != '\n') { h[i++] = ' '; } //замена значений на пробелы после двух слешей
233. str += h[i];//новая строка в буфер
234. }
235. else str += h[i]; //инициализация буфера
236. }
237. string h_1 = Convert.ToString(str); //конвертация буфера символов в строкговую переменную
238. string[] h1 = h_1.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); //дробление строки по символу окончания строки
239. for (int j = 0; j < h1.Length; j++)
240. {
241. h = Encoding.Default.GetChars(Encoding.Default.GetBytes(h1[j])); //инициализация строки в массив символов
242. if (h[0] != '/')
243. { rich2.Text += Convert.ToString(h1[j]) + Environment.NewLine; } //первый символ не одиночный слеш. Производится сбор новой переменной
244. }
245. string s1 = rich2.Text; string s2, s3; //инициализация для удаления пробелов
246. s3 = s1;
247. do { s2 = s3; s3 = s2.Replace(" ", " "); } //Replace - замена двойного пробела на одиночный
248. while (s2 != s3); //пока строки не окажутся равны. То есть пока все пробелы не станут в единичном количестве
249. rich2.Text = s3; //инициализация текстового блока для анализа обработанным текстом
250. }
251. else { MessageBox.Show("Вы ничего не ввели!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } //ошибка, если ничего не введено
252. }
253. private void button4_Click(object sender, EventArgs e)
254. {
255. rich1.Text = File.ReadAllText("Source.cpp");
256. }
257. private void button1_Click(object sender, EventArgs e)
258. {
259. rich1.Clear();rich2.Clear(); err.Clear(); key.Rows.Clear(); op.Rows.Clear(); cond.Rows.Clear(); synt.Rows.Clear(); id.Rows.Clear(); nu.Rows.Clear(); dk.Clear(); pk.Clear(); v_id = 0; v_op = 0; v_sy = 0; v_k = 0; v_con = 0; v_nu = 0;
260. }
261. private void button2_Click(object sender, EventArgs e)
262. { int num_si = 0;
263. char[] num_tex;
264. string token = null;
265. string automa = rich2.Text + " "; //инициализация строки слов
266. string[] cell_x = automa.Split(new char[] { ' ', '\n' }, StringSplitOptions.RemoveEmptyEntries); // дробление строки по символам
267. if (rich1.Text == "") { MessageBox.Show("Вы ничего не ввели!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); }
268. else
269. {for (int i = 0; i < cell_x.Length; i++) //начало работы цикла перебора слов
270. {
271. num_tex = Encoding.Default.GetChars(Encoding.Default.GetBytes(cell_x[i] + ' ')); //инициализация строки в массив символов
272. for (int j = 0; j < num_tex.Length; j++) //начало работы цикла перебора символов
273. {
274. switch (num_si)
275. {
276. case 0:
277. if (num_tex[j] == 'c')
278. {
279. num_si = 31; token += Convert.ToString(num_tex[j]);
280. }
281. Else
282. {
283. if (num_tex[j] == 'm')
284. {
285. num_si = 16; token += Convert.ToString(num_tex[j]);
286. }
287. Else
288. {
289. if (num_tex[j] == 'f')
290. {
291. num_si = 20; token += Convert.ToString(num_tex[j]);
292. }
293. Else
294. {
295. if (num_tex[j] == 'd')
296. {
297. num_si = 25; token += Convert.ToString(num_tex[j]);
298. }
299. Else
300. {
301. if (num_tex[j] == 'w')
302. {
303. num_si = 40; token += Convert.ToString(num_tex[j]);
304. }
305. Else
306. {
307. if (num_tex[j] == 'r')
308. {
309. num_si = 55; token += Convert.ToString(num_tex[j]);
310. }
311. Else
312. {
313. if (num_tex[j] == 'u')
314. {
315. num_si = 61; token += Convert.ToString(num_tex[j]);
316. }
317. Else
318. {
319. if (num_tex[j] == 'n')
320. {
321. num_si = 66; token += Convert.ToString(num_tex[j]);
322. }
323. Else
324. {
325. if (num_tex[j] == 'i')
326. {
327. num_si = 1; token += Convert.ToString(num_tex[j]);
328. }
329. Else
330. {
331. if (num_tex[j] == 's')
332. {
333. num_si = 48; token += Convert.ToString(num_tex[j]);
334. }
335. Else
336. {
337. if (num_tex[j] == 'v')
338. {
339. num_si = 86; token += Convert.ToString(num_tex[j]);
340. }
341. Else
342. {if (num_tex[j] == '.' || num_tex[j] == ', ' || num_tex[j] == ':' || num_tex[j] == ';' || num_tex[j] == '(' || num_tex[j] == ')' || num_tex[j] == '{' || num_tex[j] == '}' || num_tex[j] == '[' || num_tex[j] == ']' || num_tex[j] == '"')
343. {
344. num_si = 70; token += Convert.ToString(num_tex[j]);
345. }
346. Else
347. {
348. if (num_tex[j] == '-' && (num_tex[j + 1] == '0' || num_tex[j + 1] == '1' || num_tex[j + 1] == '2' || num_tex[j + 1] == '3' || num_tex[j + 1] == '4' || num_tex[j + 1] == '5' || num_tex[j + 1] == '6' || num_tex[j + 1] == '7' || num_tex[j + 1] == '8' || num_tex[j + 1] == '9'))
349. {
350. num_si = 72; token += Convert.ToString(num_tex[j]);
351. }
352. Else
353. {
354. if (num_tex[j] == '-')
355. {
356. num_si = 72; token += Convert.ToString(num_tex[j]);
357. }
358. Else
359. {
360. if (num_tex[j] == '0' || num_tex[j] == '1' || num_tex[j] == '2' || num_tex[j] == '3' || num_tex[j] == '4' || num_tex[j] == '5' ||
361. num_tex[j] == '6' || num_tex[j] == '7' || num_tex[j] == '8' || num_tex[j] == '9')
362. {
363. num_si = 71; token += Convert.ToString(num_tex[j]);
364. }
365. Else
366. {
367. if ((num_tex[j] == '/' || num_tex[j] == '+' || num_tex[j] == '-' || num_tex[j] == '&' || num_tex[j] == '%' || num_tex[j] == '*') &&
368. (num_tex[j + 1] == '=' || num_tex[j + 1] == '+'))
369. {
370. num_si = 77; token += Convert.ToString(num_tex[j]);
371. }
372. Else
373. {
374. if (num_tex[j] == '/' || num_tex[j] == '+' || num_tex[j] == '-' || num_tex[j] == '&' || num_tex[j] == '%' || num_tex[j] == '*')
375. {
376. num_si = 78; token += Convert.ToString(num_tex[j]);
377. }
378. Else
379. {
380. if (num_tex[j] == '!')
381. {
382. num_si = 80; token += Convert.ToString(num_tex[j]);}
383. else{
384. if (num_tex[j] == '=' && num_tex[j + 1] == '=')
385. {
386. num_si = 79; token += Convert.ToString(num_tex[j]);
387. }
388. Else
389. {
390. if (num_tex[j] == '=')
391. {num_si = 78; token += Convert.ToString(num_tex[j]);
392. }
393. Else
394. {
395. if (num_tex[j] == '<' && (num_tex[j + 1] == '<' || num_tex[j + 1] == '='))
396. {
397. num_si = 83; token += Convert.ToString(num_tex[j]);
398. }
399. Else
400. {
401. if (num_tex[j] == '>' && (num_tex[j + 1] == '>' || num_tex[j + 1] == '='))
402. {
403. num_si = 84; token += Convert.ToString(num_tex[j]);
404. }
405. Else
406. {
407. if (num_tex[j] == '>' || num_tex[j] == '<')
408. {
409. num_si = 82; token += Convert.ToString(num_tex[j]);
410. }
411. Else
412. {
413. if (num_tex[j] >= 'A' && num_tex[j] <= 'Z' || num_tex[j] >= 'a' && num_tex[j] <= 'z')
414. {
415. num_si = 85; token += Convert.ToString(num_tex[j]);
416. }
417. Else
418. {
419. if (num_tex[j] == '_') { num_si = 85; token += Convert.ToString(num_tex[j]); }
420. }}}}}}}}}}}}}}}}}}}}}}}}
421. break;
422. case 1:
423. if (num_tex[j] == ' ' || num_tex[j] == '\n') { add_ident(token, ref v_id); token = null; num_si = 0; }
424. else
425. {
426. if (num_tex[j] == 'n') { num_si = 2; token += Convert.ToString(num_tex[j]); }
427. else
428. {
429. if (num_tex[j] == 'o') { num_si = 9; token += Convert.ToString(num_tex[j]); }
430. else
431. {
432. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }
433. else
434. {
435. if (f_synt(num_tex[j])) { add_ident(token, ref v_id); token = null; num_si = 0; j-; }
436. else { num_si = 85; token += Convert.ToString(num_tex[j]); }
437. }
438. }
439. }
440. }
441. break;
442. case 2:
443. if (num_tex[j] == ' ' || num_tex[j] == '\n') { add_ident(token, ref v_id); token = null; num_si = 0; }
444. else
445. {
446. if (num_tex[j] == 't') { num_si = 3; token += Convert.ToString(num_tex[j]); }
447. else
448. {
449. if (num_tex[j] == 'c') { num_si = 4; token += Convert.ToString(num_tex[j]); }
450. else
451. {
452. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }
453. else if (f_synt(num_tex[i])) { add_ident(token, ref v_id); token = null; num_si = 0; j-; }
454. else { num_si = 85; token += Convert.ToString(num_tex[j]); }
455. }
456. }
457. }
458. break;
459. case 3:
460. if (num_tex[j] == ' ' || num_tex[j] == '\n')
461. {
462. add_key(token, ref v_k); token = null; num_si = 0;
463. }
464. else
465. {
466. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }
467. else if (f_synt(num_tex[j])) { add_key(token, ref v_k); token = null; num_si = 0; j-; }
468. else { num_si = 85; token += Convert.ToString(num_tex[j]); }
469. }
470. break;
471. case 4:
472. if (num_tex[j] == ' ' || num_tex[j] == '\n') { add_ident(token, ref v_id); token = null; num_si = 0; }
473. else {
474. if (num_tex[j] == 'l') { num_si = 5; token += Convert.ToString(num_tex[j]); }
475. else
476. {
477. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }
478. else if (f_synt(num_tex[j])) { add_ident(token, ref v_id); token = null; num_si = 0; j-; }
479. else { num_si = 85; token += Convert.ToString(num_tex[j]); }
480. }
481. }
482. break;
483. case 5:
484. if (num_tex[j] == ' ' || num_tex[j] == '\n') { add_ident(token, ref v_id); token = null; num_si = 0; }
485. else {
486. if (num_tex[j] == 'u') { num_si = 6; token += Convert.ToString(num_tex[j]); }
487. else
488. {