Advertisement
Guest User

Untitled

a guest
Nov 26th, 2015
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.98 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace DubinaLab
  8. {
  9. class SyntaxAnalys
  10. {
  11. private enum State { Start, Finish, A, B, C};
  12. private String formula;
  13. private Boolean error;
  14. private String errorMessage = "Ошибок не найдено.";
  15. private int counter, j;
  16. private List<int> coordsConnected;
  17. private List<int> coordsFree;
  18.  
  19. private Stack<Char> brackets;
  20. List<PredicateVariable> vars = new List<PredicateVariable>();
  21. PredicateVariable variable;
  22.  
  23.  
  24. class PredicateVariable
  25. {
  26. char variable;
  27. int start;
  28. int finish;
  29.  
  30. public PredicateVariable()
  31. {
  32. variable = 'x';
  33. start = 0;
  34. finish = 0;
  35. }
  36.  
  37. public PredicateVariable(char variable, int start, int finish)
  38. {
  39. this.variable = variable;
  40. this.start = start;
  41. this.finish = finish;
  42. }
  43.  
  44. public void setVariable(char variable)
  45. {
  46. this.variable = variable;
  47. }
  48. public void setStart(int start)
  49. {
  50. this.start = start;
  51. }
  52. public void setFinish(int finish)
  53. {
  54. this.finish = finish;
  55. }
  56. public char getVariable()
  57. {
  58. return variable;
  59. }
  60. public int getStart()
  61. {
  62. return start;
  63. }
  64. public int getFinish()
  65. {
  66. return finish;
  67. }
  68. }
  69.  
  70. public List<int> getConnectedCoords()
  71. {
  72. return coordsConnected;
  73. }
  74.  
  75. public List<int> getFreeCoords()
  76. {
  77. return coordsFree;
  78. }
  79.  
  80. public Boolean getError()
  81. {
  82. return error;
  83. }
  84.  
  85. public String getErrorMessage()
  86. {
  87. return errorMessage;
  88. }
  89.  
  90. public int getCounter()
  91. {
  92. return counter;
  93. }
  94.  
  95. private Boolean isItOperation(Char ch)
  96. {
  97. if (ch.Equals('∨') || ch.Equals('&') || ch.Equals('→') || ch.Equals('¬') || ch.Equals('⇔'))
  98. return true;
  99. else return false;
  100. }
  101.  
  102. private Boolean isItVariable(Char ch)
  103. {
  104. if (ch.Equals('x') || ch.Equals('y') || ch.Equals('z') || ch.Equals('k') || ch.Equals('l'))
  105. return true;
  106. else return false;
  107. }
  108.  
  109. private Boolean isItConst(Char ch)
  110. {
  111. if (ch.Equals('c') || ch.Equals('o') || ch.Equals('n') || ch.Equals('s') || ch.Equals('t'))
  112. return true;
  113. else return false;
  114. }
  115.  
  116. private Boolean isItPredicate(Char ch)
  117. {
  118. if (ch.Equals('A') || ch.Equals('B') || ch.Equals('C') || ch.Equals('D') || ch.Equals('E'))
  119. return true;
  120. else return false;
  121. }
  122.  
  123. private Boolean isItQuantifier(Char ch)
  124. {
  125. if (ch.Equals('∀') || ch.Equals('∃'))
  126. return true;
  127. else return false;
  128. }
  129.  
  130. private void errorFlag(String s)
  131. {
  132. error = true;
  133. errorMessage = s;
  134. }
  135.  
  136. public void semanticsChecking()
  137. {
  138. j = 0;
  139. coordsConnected = new List<int>(); // Координаты связных
  140. coordsFree = new List<int>(); // Координаты свободных переменных
  141. for (int i = 0; i < formula.Length; i++)
  142. {
  143. if (formula[i] == '∀' || formula[i] == '∃')
  144. {
  145. i++;
  146. variable = new PredicateVariable();
  147. variable.setVariable(formula[i]);
  148. j = i;
  149. do
  150. {
  151. j++;
  152. }
  153. while (formula[j] != '(');
  154. variable.setStart(j);
  155. j++;
  156. brackets = new Stack<char>();
  157. brackets.Push('(');
  158. while (brackets.Count > 0 && j < formula.Length)
  159. {
  160. if (formula[j] == '(')
  161. brackets.Push('(');
  162. else if (formula[j] == ')')
  163. brackets.Pop();
  164. j++;
  165. }
  166. variable.setFinish(j);
  167. vars.Add(variable);
  168. }
  169. }
  170. for(int i = 1; i < formula.Length; i++)
  171. if (isItVariable(formula[i]) && !isItQuantifier(formula[i - 1]))
  172. {
  173. coordsFree.Add(i);
  174. }
  175.  
  176. for (int i = 0; i < vars.Count; i++)
  177. {
  178. for (j = vars[i].getStart(); j < vars[i].getFinish(); j++)
  179. {
  180. if (isItVariable(formula[j]) && !isItQuantifier(formula[j - 1]))
  181. {
  182. if (formula[j].Equals(vars[i].getVariable()))//Если проверяемая переменная совпадает с переменной из набора то она связная
  183. {
  184. coordsConnected.Add(j);
  185. }
  186. }
  187.  
  188. }
  189. }
  190. for(int i = 0; i < coordsConnected.Count; i++)
  191. {
  192. if(coordsFree.Contains(coordsConnected[i]))
  193. coordsFree.Remove(coordsConnected[i]);
  194. }
  195. }
  196.  
  197.  
  198. public void syntaxСhecking(String formula)
  199. {
  200. State st = new State();
  201. this.formula = formula;
  202. st = State.Start;
  203. counter = 0;
  204. brackets = new Stack<Char>();
  205. while (error == false && st != State.Finish && counter < formula.Length)
  206. {
  207. switch(st)
  208. {
  209. case State.Start:
  210. {
  211. if (isItQuantifier(formula[counter]))
  212. {
  213. counter = quantifierChecking();
  214. st = State.C;
  215. }else
  216. if (isItPredicate(formula[counter]))
  217. {
  218. counter = predicateChecking();
  219. st = State.B;
  220. }
  221. else if (isItVariable(formula[counter]) || isItConst(formula[counter]))
  222. {
  223. counter++;
  224. st = State.B;
  225. }else if(formula[counter].Equals('('))
  226. {
  227. counter++;
  228. brackets.Push('(');
  229. }
  230. else if (formula[counter].Equals(')'))
  231. {
  232. if (brackets.Count > 0)
  233. {
  234. counter++;
  235. brackets.Pop();
  236. st = State.A;
  237. }
  238. else
  239. errorFlag("Лишняя скобка.");
  240. }
  241. else
  242. errorFlag("Ожидался квантор или предикат, или переменная, или константа, или скобка.");
  243. }
  244. break;
  245. case State.A:
  246. {
  247. if (formula[counter].Equals(')'))
  248. {
  249. if (brackets.Count > 0)
  250. {
  251. counter++;
  252. brackets.Pop();
  253. }
  254. else
  255. errorFlag("Лишняя скобка.");
  256. }
  257. else if (isItOperation(formula[counter]))
  258. {
  259. counter++;
  260. st = State.Start;
  261. }
  262. else if (formula[counter].Equals(')'))
  263. {
  264. if (brackets.Count > 0)
  265. {
  266. counter++;
  267. brackets.Pop();
  268. }
  269. else
  270. errorFlag("Лишняя скобка.");
  271. }
  272. else
  273. errorFlag("Ожидалась закрывающая скобка или символ операции.");
  274. }
  275. break;
  276. case State.B:
  277. {
  278. if (isItOperation(formula[counter]))
  279. {
  280. counter++;
  281. st = State.Start;
  282. }
  283. else if (formula[counter].Equals(')'))
  284. {
  285. if (brackets.Count > 0)
  286. {
  287. counter++;
  288. brackets.Pop();
  289. st = State.A;
  290. }
  291. else
  292. errorFlag("Лишняя скобка.");
  293. }
  294. else
  295. errorFlag("Ожидался символ операции.");
  296.  
  297. }
  298. break;
  299. case State.C:
  300. {
  301. if (isItQuantifier(formula[counter]))
  302. {
  303. counter = quantifierChecking();
  304. st = State.C;
  305. }
  306. else
  307. if (isItPredicate(formula[counter]))
  308. {
  309. counter = predicateChecking();
  310. st = State.B;
  311. }
  312. else if (formula[counter].Equals('('))
  313. {
  314. counter++;
  315. brackets.Push('(');
  316. }
  317. else
  318. errorFlag("Ожидался предикат или открывающая скобка, или квантор.");
  319. }
  320. break;
  321. }
  322. }
  323. if (brackets.Count > 0 && error == false)
  324. errorFlag("Не все открывающие скобки закрыты.");
  325. //if (counter < formula.Length-1 && error == false)
  326. // errorFlag(" Формула не дописана.");
  327. //else
  328. if (!(isItConst(formula[counter-1]) || isItVariable(formula[counter-1]) || formula[counter-1].Equals(')')) && error == false)
  329. errorFlag("Формула может заканчиваться только закрывающей скобкой или переменной, или константой.");
  330. if (error != true)
  331. semanticsChecking();
  332. }
  333.  
  334. private int predicateChecking()
  335. {
  336. State st = new State();
  337. st = State.Start;
  338. while (error == false && st != State.Finish && counter < formula.Length)
  339. {
  340. switch (st)
  341. {
  342. case State.Start:
  343. {
  344. if (isItPredicate(formula[counter]))
  345. {
  346. counter++;
  347. st = State.A;
  348. }
  349. else
  350. errorFlag("Ожидалась предикатная переменная");
  351. }
  352. break;
  353. case State.A:
  354. {
  355. if (formula[counter].Equals('('))
  356. {
  357. counter++;
  358. st = State.B;
  359. }
  360. else
  361. errorFlag("Ожидалась открывающая скобка.");
  362.  
  363. }
  364. break;
  365. case State.B:
  366. {
  367. if (isItConst(formula[counter]) || isItVariable(formula[counter]))
  368. {
  369. counter++;
  370. st = State.C;
  371. }
  372. else
  373. errorFlag("Ожидалась переменная или константа.");
  374. }
  375. break;
  376. case State.C:
  377. {
  378. if (formula[counter].Equals(')'))
  379. {
  380. counter++;
  381. st = State.Finish;
  382. }
  383. else
  384. if (formula[counter].Equals(','))
  385. {
  386. counter++;
  387. st = State.B;
  388. }
  389. else
  390. errorFlag("Ожидалась запятая или закрывающая скобка.");
  391. }
  392. break;
  393. }
  394. }
  395. return counter;
  396. }
  397.  
  398. private int quantifierChecking()
  399. {
  400. State st = new State();
  401. st = State.Start;
  402. while (error == false && st != State.Finish && counter < formula.Length)
  403. {
  404. switch (st)
  405. {
  406. case State.Start:
  407. {
  408. if (isItQuantifier(formula[counter]))
  409. {
  410. counter++;
  411. st = State.A;
  412. }
  413. else
  414. errorFlag("Ожидался квантор.");
  415. }
  416. break;
  417. case State.A:
  418. {
  419. if (isItVariable(formula[counter]))
  420. {
  421. counter++;
  422. st = State.Finish;
  423. }
  424. else
  425. errorFlag("Ожидалась переменная.");
  426. }
  427. break;
  428. }
  429. }
  430. return counter;
  431. }
  432.  
  433. }
  434. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement