//STARTSOLUTION #include #include #include #include #include #include #include //ENDSOLUTION #include using namespace std; //STARTSOLUTION bool validate(string const& file_name) { ifstream ifs{file_name}; string tag{}; stack xml_stack{}; bool closed{false}; while (getline(ifs.ignore(numeric_limits::max(), '<'), tag, '>')) { if (tag.front() == '/') { tag.erase(0, 1); closed = true; } if (!std::all_of(tag.begin(), tag.end(), [](unsigned char c){ return std::isalpha(c); })) { cout << "Tag: '" + tag + "' is not correct" << endl; return false; } if (closed) { if (xml_stack.top() == tag) { xml_stack.pop(); closed = false; } else { cout << "Tag: '" + tag + "' not closed" << endl; return false; } } else { xml_stack.push(tag); } } if (!xml_stack.empty()) { cout << "There are unclosed tags" << endl; return false; } cout << "No syntax errors" << endl; return true; } //ENDSOLUTION int main() { assert( validate("correct.xml") ); //Funktionen ska returnera true assert( !validate("incorrect_tag.xml") ); //Funktionen ska returnera false assert( !validate("not_closed_nested.xml") ); //Funktionen ska returnera false assert( !validate("tag_not_closed.xml") ); //Funktionen ska returnera false }