Курсовая работа: Конструирование моделей лексического и синтаксического анализа

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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. {