diff options
Diffstat (limited to 'include/cru/xml/XmlParser.h')
-rw-r--r-- | include/cru/xml/XmlParser.h | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/include/cru/xml/XmlParser.h b/include/cru/xml/XmlParser.h new file mode 100644 index 00000000..75664ce3 --- /dev/null +++ b/include/cru/xml/XmlParser.h @@ -0,0 +1,47 @@ +#pragma once + +#include "XmlNode.h" + +#include "cru/common/Exception.h" +#include "cru/common/String.h" + +#include <optional> + +namespace cru::xml { +class CRU_XML_API XmlParsingException : public Exception { + public: + using Exception::Exception; +}; + +class CRU_XML_API XmlParser { + public: + explicit XmlParser(String xml); + + CRU_DELETE_COPY(XmlParser) + CRU_DELETE_MOVE(XmlParser) + + ~XmlParser(); + + XmlElementNode* Parse(); + + private: + XmlElementNode* DoParse(); + + char16_t Read1(); + String ReadWithoutAdvance(int count = 1); + void ReadSpacesAndDiscard(); + String ReadSpaces(); + String ReadIdenitifier(); + String ReadAttributeString(); + + private: + String xml_; + + XmlElementNode* cache_ = nullptr; + + // Consider the while file enclosed by a single tag called $root. + XmlElementNode* pseudo_root_node_ = new XmlElementNode(u"$root"); + XmlElementNode* current_ = pseudo_root_node_; + int current_position_ = 0; +}; +} // namespace cru::xml |