Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <stack>
- using namespace std;
- struct Tag_error{
- string name;
- int line_number;
- };
- void czytaj(ifstream& stream){
- string line;
- string head;
- stack<string> stos;
- Tag_error error;
- error.line_number = 1;
- getline(stream, line);
- head = line.substr(0, 5);
- try{
- if (head == "<math"){
- stos.push(head);
- while (!stream.eof()){
- error.line_number++;
- getline(stream, line, '>'); // pobieram do wystapienia znaku >, wskaznik ustawia sie za tym znakiem
- if (line == "<mo"){ // operatory
- char znak = stream.get();
- if (znak != '+' && znak != '-' && znak != '*' && znak != '/' && znak != '='){
- error.name = "Blad operatora. Znak musi byc + - * / lub = \n\n";
- throw error;
- }
- getline(stream, line, '>');
- if (line != "</mo"){
- error.name = "Brak zamkniecia tagu <mo> \n\n";
- throw error;
- }
- stream.ignore();
- }
- else if (line == "<mi"){ // identyfikatory
- char znak = stream.get();
- if (!isalpha(znak)){
- error.name = "Bledny identyfikator, to nie jest litera. \n\n";
- throw error;
- }
- getline(stream, line, '>');
- if (line != "</mi"){
- error.name = "Brak zamkniecia tagu <mi> \n\n";
- throw error;
- }
- stream.ignore();
- }
- else if (line == "<mn"){ // liczby
- int liczba;
- if (!(stream >> liczba)){
- error.name = "Blad, to musi byc liczba. \n\n";
- throw error;
- }
- getline(stream, line, '>');
- if (line != "</mn"){
- error.name = "Brak zamkniecia tagu <mn> \n\n";
- throw error;
- }
- stream.ignore();
- }
- else if (line == "<msup"){ // potegi
- if (stos.top() != "<msup"){
- stos.push(line);
- }
- else {
- error.name = "Niesparowane tagi, nie zamkniety tag <msup> ! \n\n";
- throw error;
- }
- stream.ignore();
- }
- else if (line == "</msup"){
- if (stos.top() == "<msup"){
- stos.pop();
- }
- else {
- error.name = "Niesparowane tagi, blad tagu <msup> \n\n";
- throw error;
- }
- stream.ignore();
- }
- else if (line == "</math"){
- if (stos.top() == "<math"){
- stos.pop();
- cout << "Wyrazenie arytmetyczne zostalo zakonczone, nie znaleziono bledow." << endl << endl;
- return;
- }
- else {
- error.name = "Niesparowane tagi, nie moge zamknac tagu <math> poniewaz inny tag jest otwarty. \n\n";
- throw error;
- }
- }
- else if (line == "<mfenced"){ // ZADANIE POZIOMU 2
- if (stos.top() != "<mfanced"){
- stos.push(line);
- }
- else {
- error.name = "Niesparowane tagi, nie zamkniety tag <mfenced> ! \n\n";
- throw error;
- }
- stream.ignore();
- }
- else if (line == "</mfenced"){ // ZADANIE POZIOMU 2
- if (stos.top() == "<mfenced"){
- stos.pop();
- }
- else {
- error.name = "Niesparowane tagi, nie moge zamknac tagu <mfenced> poniewaz inny tag jest otwarty. \n\n";
- throw error;
- }
- stream.ignore();
- }
- else if (line == "<mrow"){ // ZADANIE POZIOMU 2
- if (stos.top() != "<mfenced"){
- error.name = "Blad, nie mozna uzyc tagu <mrow> jezeli wczesniej nie jest otwarty tag <mfenced>. \n\n";
- throw error;
- }
- if (stos.top() != "<mrow"){
- stos.push(line);
- }
- else {
- error.name = "Niesparowane tagi, nie zamkniety tag <mrow> ! \n\n";
- throw error;
- }
- stream.ignore();
- }
- else if (line == "</mrow"){ // ZADANIE POZIOMU 2
- if (stos.top() == "<mrow"){
- stos.pop();
- }
- else {
- error.name = "Niesparowane tagi, blad tagu <mrow> \n\n";
- throw error;
- }
- stream.ignore();
- }
- else {
- error.name = "Nieznany operator. Blad skladni. \n\n";
- throw error;
- }
- }
- if (!stos.empty()){
- error.name = "Stos nie jest pusty, nie wszystkie tagi sa zamkniete. \n\n";
- throw error;
- }
- }
- else {
- error.name = "To nie jest format MathML, wyrazenie powinno zaczynac sie od tagu <math> \n\n";
- throw error;
- }
- }
- catch (Tag_error error){
- cout << "Linia nr. " << error.line_number << " : " << error.name;
- }
- }
- int main(){
- // 1.txt - 14.txt poziom 1
- // 15.txt - 20.txt poziom 2
- while (true){
- string file_name;
- cout << "Podaj nazwe pliku : ";
- cin >> file_name;
- if (file_name == "koniec") break;
- ifstream stream(file_name);
- czytaj(stream);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement