Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <stack>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. struct Tag_error{
  10.  
  11. string name;
  12. int line_number;
  13.  
  14. };
  15.  
  16.  
  17. void czytaj(ifstream& stream){
  18.  
  19. string line;
  20. string head;
  21.  
  22. stack<string> stos;
  23.  
  24. Tag_error error;
  25. error.line_number = 1;
  26.  
  27. getline(stream, line);
  28.  
  29. head = line.substr(0, 5);
  30.  
  31. try{
  32. if (head == "<math"){
  33.  
  34. stos.push(head);
  35.  
  36. while (!stream.eof()){
  37.  
  38. error.line_number++;
  39. getline(stream, line, '>'); // pobieram do wystapienia znaku >, wskaznik ustawia sie za tym znakiem
  40.  
  41. if (line == "<mo"){ // operatory
  42.  
  43. char znak = stream.get();
  44.  
  45. if (znak != '+' && znak != '-' && znak != '*' && znak != '/' && znak != '='){
  46. error.name = "Blad operatora. Znak musi byc + - * / lub = \n\n";
  47. throw error;
  48. }
  49.  
  50. getline(stream, line, '>');
  51. if (line != "</mo"){
  52. error.name = "Brak zamkniecia tagu <mo> \n\n";
  53. throw error;
  54. }
  55.  
  56. stream.ignore();
  57.  
  58. }
  59. else if (line == "<mi"){ // identyfikatory
  60.  
  61. char znak = stream.get();
  62.  
  63. if (!isalpha(znak)){
  64. error.name = "Bledny identyfikator, to nie jest litera. \n\n";
  65. throw error;
  66. }
  67.  
  68.  
  69. getline(stream, line, '>');
  70. if (line != "</mi"){
  71. error.name = "Brak zamkniecia tagu <mi> \n\n";
  72. throw error;
  73. }
  74.  
  75. stream.ignore();
  76.  
  77. }
  78. else if (line == "<mn"){ // liczby
  79.  
  80. int liczba;
  81.  
  82. if (!(stream >> liczba)){
  83. error.name = "Blad, to musi byc liczba. \n\n";
  84. throw error;
  85. }
  86.  
  87. getline(stream, line, '>');
  88. if (line != "</mn"){
  89. error.name = "Brak zamkniecia tagu <mn> \n\n";
  90. throw error;
  91. }
  92.  
  93. stream.ignore();
  94.  
  95. }
  96. else if (line == "<msup"){ // potegi
  97.  
  98. if (stos.top() != "<msup"){
  99. stos.push(line);
  100. }
  101. else {
  102. error.name = "Niesparowane tagi, nie zamkniety tag <msup> ! \n\n";
  103. throw error;
  104. }
  105.  
  106. stream.ignore();
  107.  
  108. }
  109. else if (line == "</msup"){
  110.  
  111. if (stos.top() == "<msup"){
  112. stos.pop();
  113. }
  114. else {
  115. error.name = "Niesparowane tagi, blad tagu <msup> \n\n";
  116. throw error;
  117. }
  118.  
  119. stream.ignore();
  120. }
  121. else if (line == "</math"){
  122.  
  123. if (stos.top() == "<math"){
  124. stos.pop();
  125. cout << "Wyrazenie arytmetyczne zostalo zakonczone, nie znaleziono bledow." << endl << endl;
  126. return;
  127. }
  128. else {
  129. error.name = "Niesparowane tagi, nie moge zamknac tagu <math> poniewaz inny tag jest otwarty. \n\n";
  130. throw error;
  131. }
  132.  
  133. }
  134. else if (line == "<mfenced"){ // ZADANIE POZIOMU 2
  135.  
  136. if (stos.top() != "<mfanced"){
  137. stos.push(line);
  138. }
  139. else {
  140. error.name = "Niesparowane tagi, nie zamkniety tag <mfenced> ! \n\n";
  141. throw error;
  142. }
  143.  
  144. stream.ignore();
  145. }
  146. else if (line == "</mfenced"){ // ZADANIE POZIOMU 2
  147.  
  148. if (stos.top() == "<mfenced"){
  149. stos.pop();
  150. }
  151. else {
  152. error.name = "Niesparowane tagi, nie moge zamknac tagu <mfenced> poniewaz inny tag jest otwarty. \n\n";
  153. throw error;
  154. }
  155.  
  156. stream.ignore();
  157.  
  158. }
  159. else if (line == "<mrow"){ // ZADANIE POZIOMU 2
  160. if (stos.top() != "<mfenced"){
  161. error.name = "Blad, nie mozna uzyc tagu <mrow> jezeli wczesniej nie jest otwarty tag <mfenced>. \n\n";
  162. throw error;
  163. }
  164.  
  165. if (stos.top() != "<mrow"){
  166. stos.push(line);
  167. }
  168. else {
  169. error.name = "Niesparowane tagi, nie zamkniety tag <mrow> ! \n\n";
  170. throw error;
  171. }
  172.  
  173. stream.ignore();
  174.  
  175. }
  176. else if (line == "</mrow"){ // ZADANIE POZIOMU 2
  177. if (stos.top() == "<mrow"){
  178. stos.pop();
  179. }
  180. else {
  181. error.name = "Niesparowane tagi, blad tagu <mrow> \n\n";
  182. throw error;
  183. }
  184.  
  185. stream.ignore();
  186. }
  187. else {
  188. error.name = "Nieznany operator. Blad skladni. \n\n";
  189. throw error;
  190. }
  191. }
  192.  
  193. if (!stos.empty()){
  194. error.name = "Stos nie jest pusty, nie wszystkie tagi sa zamkniete. \n\n";
  195. throw error;
  196. }
  197.  
  198. }
  199. else {
  200. error.name = "To nie jest format MathML, wyrazenie powinno zaczynac sie od tagu <math> \n\n";
  201. throw error;
  202. }
  203.  
  204. }
  205. catch (Tag_error error){
  206.  
  207. cout << "Linia nr. " << error.line_number << " : " << error.name;
  208. }
  209.  
  210.  
  211. }
  212.  
  213.  
  214.  
  215.  
  216. int main(){
  217.  
  218. // 1.txt - 14.txt poziom 1
  219. // 15.txt - 20.txt poziom 2
  220. while (true){
  221.  
  222. string file_name;
  223.  
  224. cout << "Podaj nazwe pliku : ";
  225.  
  226. cin >> file_name;
  227.  
  228. if (file_name == "koniec") break;
  229.  
  230. ifstream stream(file_name);
  231.  
  232. czytaj(stream);
  233. }
  234. return 0;
  235. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement