Advertisement
Guest User

Untitled

a guest
Oct 24th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.57 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. #include<sstream>
  4. #include<string>
  5. using namespace std;
  6.  
  7. const int MAX = 13;
  8.  
  9. void detected(string in) {
  10. cout << "Wykryto tag: " << in << endl;
  11. }
  12.  
  13.  
  14. bool isNum(string in) {
  15. stringstream numb;
  16. int chck;
  17. numb << in; // zapisanie do stringstreama 'in'
  18. if (numb >> chck) { // sprawdzenie, czy można do chck zapisać 'in'
  19. return true;
  20. }
  21. else {
  22. return false;
  23. }
  24. }
  25.  
  26. void check(ifstream & in) {
  27. stringstream chain;
  28. string line;
  29. string stack[MAX];
  30. int lineNum = 0;
  31. int stackPtr = 0;
  32. try {
  33. // wziecie pod uwage tego, co rozpoczyna sie od poprawnego rozpoczecia notacji MathXML
  34. while (!in.eof()) {
  35. lineNum++;
  36. getline(in, line);
  37. if (line == "<math>") {
  38. detected("<math>");
  39. break;
  40. }
  41. }
  42. // obsluga reszty pliku
  43. while (!in.eof()) {
  44. lineNum++;
  45. getline(in, line);
  46. if (line == "</math>") {
  47. cout << "Operacja zakonczona powodzeniem" << endl;
  48. break;
  49. }
  50. // OBLSUGA MSUP
  51. if (line == "<msup>") {
  52. detected("<msup>");
  53. do {
  54. getline(in, line);
  55. lineNum++;
  56. if (line == "</msup>") {
  57. detected("</msup>");
  58. break;
  59. }
  60. chain.str(""); // czyszczenie zmiennej typu stringstream
  61. chain << line;
  62. getline(chain, line, '>');
  63. line += '>';
  64. if (line == "<mn>") {
  65. detected("<mn>");
  66. }
  67. if (line == "<mo>") {
  68. detected("<mo>");
  69. }
  70. if (line == "<mi>") {
  71. detected("<mi>");
  72. }
  73. if (line != "<mn>" && line != "<mo>" && line != "<mi>") {
  74. throw 2.1;
  75. }
  76.  
  77. if (line == "<mfenced>")
  78. {
  79. stack[stackPtr] = line;
  80. getline(in, line);
  81. if (line == "<mrow>")
  82. {
  83. do {
  84. getline(in, line);
  85. lineNum++;
  86. if (line == "</mrow>") {
  87. detected("</mrow>");
  88. break;
  89. }
  90. chain.str(""); // czyszczenie zmiennej typu stringstream
  91. chain << line;
  92. getline(chain, line, '>');
  93. line += '>';
  94. if (line == "<mn>") {
  95. detected("<mn>");
  96. }
  97. if (line == "<mo>") {
  98. detected("<mo>");
  99. }
  100. if (line == "<mi>") {
  101. detected("<mi>");
  102. }
  103. if (line != "<mn>" && line != "<mo>" && line != "<mi>") {
  104. throw 2.1;
  105. }
  106.  
  107. if (line == "</mfenced>")
  108. {
  109. detected("mfenced");
  110. break;
  111. }
  112. } while (true);
  113.  
  114. stackPtr = 0;
  115. for (int i = 0; i < MAX; i++) {
  116. stack[i] = "";
  117. }
  118.  
  119. getline(in, line);
  120. lineNum++;
  121. }
  122. }
  123.  
  124. stack[stackPtr] = line;
  125. getline(chain, line, '<');
  126. // SPRAWDZANIE ZAWARTOŚCI TAGU
  127. if (isNum(line) == true) {
  128. cout << "Linia " << lineNum << ": Znaleziono liczbe." << endl;
  129. }
  130. // warunek gdy tag nie jest zgodny z zawartością (tag dla liczby + nie liczba LUB tag nie dla liczby i liczba)
  131. if ((isNum(line) == false && stack[stackPtr] == "<mn>") || (isNum(line) == true && stack[stackPtr] != "<mn>")) {
  132. throw 'c';
  133. }
  134. // warunek gdy tag nie jest zgodny z zawartością (tag dla operatora + zawartość nie będąca operatorem)
  135. if (stack[stackPtr] == "<mo>" && line != "+" && line != "-" && line != "*" && line != "/" && line != "=") {
  136. throw 'c';
  137. }
  138. stackPtr++;
  139. // KONIEC WARUNKÓW SPRAWDZANIA ZAWARTOŚCI TAGU
  140. getline(chain, line, '>');
  141. line += '>';
  142. // warunek sprawdzający czy końcowy tag jest poprawnie zapisany
  143. if (line != "/mn>" && line != "/mo>" && line != "/mi>") {
  144. throw 2.5;
  145. }
  146.  
  147.  
  148. } while (true);
  149.  
  150. stackPtr = 0;
  151. for (int i = 0; i < MAX; i++) {
  152. stack[i] = "";
  153. }
  154.  
  155. getline(in, line);
  156. lineNum++;
  157. }
  158. // wykrywanie dzialajacych tagów
  159. chain.str(""); // czyszczenie zmiennej typu stringstream
  160. chain << line;
  161. getline(chain, line, '>');
  162. line += '>';
  163. if (line == "</math>") {
  164. detected("</math>");
  165. cout << "Operacja zakonczona powodzeniem" << endl;
  166. break;
  167. }
  168. if (line == "<mn>") {
  169. detected("<mn>");
  170. }
  171. if (line == "<mo>") {
  172. detected("<mo>");
  173. }
  174. if (line == "<mi>") {
  175. detected("<mi>");
  176. }
  177. if (line != "<mn>" && line != "<mo>" && line != "<mi>") {
  178. throw 2.1;
  179. }
  180. stack[stackPtr] = line;
  181. getline(chain, line, '<');
  182. // SPRAWDZANIE ZAWARTOŚCI TAGU
  183. if (isNum(line) == true) {
  184. cout << "Linia " << lineNum << ": Znaleziono liczbe." << endl;
  185. }
  186. // warunek gdy tag nie jest zgodny z zawartością (tag dla liczby + nie liczba LUB tag nie dla liczby i liczba)
  187. if ((isNum(line) == false && stack[stackPtr] == "<mn>") || (isNum(line) == true && stack[stackPtr] != "<mn>")) {
  188. throw 'c';
  189. }
  190. // warunek gdy tag nie jest zgodny z zawartością (tag dla operatora + zawartość nie będąca operatorem)
  191. if (stack[stackPtr] == "<mo>" && line != "+" && line != "-" && line != "*" && line != "/" && line != "=") {
  192. throw 'c';
  193. }
  194. stackPtr++;
  195. // KONIEC WARUNKÓW SPRAWDZANIA ZAWARTOŚCI TAGU
  196. getline(chain, line, '>');
  197. line += '>';
  198. // warunek sprawdzający czy końcowy tag jest poprawnie zapisany
  199. if (line != "/mn>" && line != "/mo>" && line != "/mi>") {
  200. throw 2.5;
  201. }
  202.  
  203. }
  204. }//try
  205. catch (double) {
  206. cout << "Line " << lineNum << ": MathXML syntax error! Check if you used tags correctly!" << endl;
  207. }
  208. catch (char) {
  209. cout << "Line " << lineNum << ": MathXML syntax error! Value is not consistent with tag." << endl;
  210. }
  211.  
  212. }
  213.  
  214. int main() {
  215. ifstream in("zad2.txt");
  216. check(in);
  217. system("pause");
  218. return 0;
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement