Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<fstream>
- #include<sstream>
- #include<string>
- using namespace std;
- const int MAX = 13;
- void detected(string in) {
- cout << "Wykryto tag: " << in << endl;
- }
- bool isNum(string in) {
- stringstream numb;
- int chck;
- numb << in; // zapisanie do stringstreama 'in'
- if (numb >> chck) { // sprawdzenie, czy można do chck zapisać 'in'
- return true;
- }
- else {
- return false;
- }
- }
- void check(ifstream & in) {
- stringstream chain;
- string line;
- string stack[MAX];
- int lineNum = 0;
- int stackPtr = 0;
- try {
- // wziecie pod uwage tego, co rozpoczyna sie od poprawnego rozpoczecia notacji MathXML
- while (!in.eof()) {
- lineNum++;
- getline(in, line);
- if (line == "<math>") {
- detected("<math>");
- break;
- }
- }
- // obsluga reszty pliku
- while (!in.eof()) {
- lineNum++;
- getline(in, line);
- if (line == "</math>") {
- cout << "Operacja zakonczona powodzeniem" << endl;
- break;
- }
- // OBLSUGA MSUP
- if (line == "<msup>") {
- detected("<msup>");
- do {
- getline(in, line);
- lineNum++;
- if (line == "</msup>") {
- detected("</msup>");
- break;
- }
- chain.str(""); // czyszczenie zmiennej typu stringstream
- chain << line;
- getline(chain, line, '>');
- line += '>';
- if (line == "<mn>") {
- detected("<mn>");
- }
- if (line == "<mo>") {
- detected("<mo>");
- }
- if (line == "<mi>") {
- detected("<mi>");
- }
- if (line != "<mn>" && line != "<mo>" && line != "<mi>") {
- throw 2.1;
- }
- if (line == "<mfenced>")
- {
- stack[stackPtr] = line;
- getline(in, line);
- if (line == "<mrow>")
- {
- do {
- getline(in, line);
- lineNum++;
- if (line == "</mrow>") {
- detected("</mrow>");
- break;
- }
- chain.str(""); // czyszczenie zmiennej typu stringstream
- chain << line;
- getline(chain, line, '>');
- line += '>';
- if (line == "<mn>") {
- detected("<mn>");
- }
- if (line == "<mo>") {
- detected("<mo>");
- }
- if (line == "<mi>") {
- detected("<mi>");
- }
- if (line != "<mn>" && line != "<mo>" && line != "<mi>") {
- throw 2.1;
- }
- if (line == "</mfenced>")
- {
- detected("mfenced");
- break;
- }
- } while (true);
- stackPtr = 0;
- for (int i = 0; i < MAX; i++) {
- stack[i] = "";
- }
- getline(in, line);
- lineNum++;
- }
- }
- stack[stackPtr] = line;
- getline(chain, line, '<');
- // SPRAWDZANIE ZAWARTOŚCI TAGU
- if (isNum(line) == true) {
- cout << "Linia " << lineNum << ": Znaleziono liczbe." << endl;
- }
- // warunek gdy tag nie jest zgodny z zawartością (tag dla liczby + nie liczba LUB tag nie dla liczby i liczba)
- if ((isNum(line) == false && stack[stackPtr] == "<mn>") || (isNum(line) == true && stack[stackPtr] != "<mn>")) {
- throw 'c';
- }
- // warunek gdy tag nie jest zgodny z zawartością (tag dla operatora + zawartość nie będąca operatorem)
- if (stack[stackPtr] == "<mo>" && line != "+" && line != "-" && line != "*" && line != "/" && line != "=") {
- throw 'c';
- }
- stackPtr++;
- // KONIEC WARUNKÓW SPRAWDZANIA ZAWARTOŚCI TAGU
- getline(chain, line, '>');
- line += '>';
- // warunek sprawdzający czy końcowy tag jest poprawnie zapisany
- if (line != "/mn>" && line != "/mo>" && line != "/mi>") {
- throw 2.5;
- }
- } while (true);
- stackPtr = 0;
- for (int i = 0; i < MAX; i++) {
- stack[i] = "";
- }
- getline(in, line);
- lineNum++;
- }
- // wykrywanie dzialajacych tagów
- chain.str(""); // czyszczenie zmiennej typu stringstream
- chain << line;
- getline(chain, line, '>');
- line += '>';
- if (line == "</math>") {
- detected("</math>");
- cout << "Operacja zakonczona powodzeniem" << endl;
- break;
- }
- if (line == "<mn>") {
- detected("<mn>");
- }
- if (line == "<mo>") {
- detected("<mo>");
- }
- if (line == "<mi>") {
- detected("<mi>");
- }
- if (line != "<mn>" && line != "<mo>" && line != "<mi>") {
- throw 2.1;
- }
- stack[stackPtr] = line;
- getline(chain, line, '<');
- // SPRAWDZANIE ZAWARTOŚCI TAGU
- if (isNum(line) == true) {
- cout << "Linia " << lineNum << ": Znaleziono liczbe." << endl;
- }
- // warunek gdy tag nie jest zgodny z zawartością (tag dla liczby + nie liczba LUB tag nie dla liczby i liczba)
- if ((isNum(line) == false && stack[stackPtr] == "<mn>") || (isNum(line) == true && stack[stackPtr] != "<mn>")) {
- throw 'c';
- }
- // warunek gdy tag nie jest zgodny z zawartością (tag dla operatora + zawartość nie będąca operatorem)
- if (stack[stackPtr] == "<mo>" && line != "+" && line != "-" && line != "*" && line != "/" && line != "=") {
- throw 'c';
- }
- stackPtr++;
- // KONIEC WARUNKÓW SPRAWDZANIA ZAWARTOŚCI TAGU
- getline(chain, line, '>');
- line += '>';
- // warunek sprawdzający czy końcowy tag jest poprawnie zapisany
- if (line != "/mn>" && line != "/mo>" && line != "/mi>") {
- throw 2.5;
- }
- }
- }//try
- catch (double) {
- cout << "Line " << lineNum << ": MathXML syntax error! Check if you used tags correctly!" << endl;
- }
- catch (char) {
- cout << "Line " << lineNum << ": MathXML syntax error! Value is not consistent with tag." << endl;
- }
- }
- int main() {
- ifstream in("zad2.txt");
- check(in);
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement