00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _uxmlparser_hpp_
00022 #define _uxmlparser_hpp_
00023 #include <ubit/udom.hpp>
00024 #include <fstream>
00025 namespace ubit {
00026
00027 class UXmlGrammar;
00028
00029
00030
00036 class UXmlParser {
00037 public:
00038 struct ParseError {};
00039
00040 UXmlParser();
00042
00043 virtual ~UXmlParser();
00044
00045 void addGrammar(const UXmlGrammar&);
00051 void setPermissive(bool b) {permissive = b;}
00061 void setCollapseSpaces(bool b) {collapse_spaces = b;}
00067 UXmlDoc* read(const UStr& pathname);
00072 UXmlDoc* parse(const UStr& doc_name, const UStr& doc_text);
00078 int getStatus() {return stat;}
00080
00081 void setErrorOutput(UStr& error_buffer);
00083
00084 void setErrorOutput(std::ostream&);
00086
00087
00088
00089 protected:
00090 void readElement(UGroup* parent);
00091 void readText(UGroup* parent);
00092 bool readXMLDeclaration();
00093 void readXMLInstruction(UGroup* parent);
00094 void readSGMLData(UGroup* parent);
00095
00096 void skipSpaces();
00097 UChar readCharEntityReference();
00098 bool readName(UStr&);
00099 bool readQuotedValue(UStr&, UChar quoting_char);
00100 bool readUnquotedValue(UStr&);
00101 bool readNameValuePair(UStr& name, UStr& value);
00102 UGroup* readElementStartTag(UStr& elem_name, int& stat);
00103 int readElementEndTag(const UStr& elem_name);
00104
00105 void error(const char* msg, const UChar* line);
00106 void error(const char* msg_start, const UStr& name,
00107 const char* msg_end, const UChar* line);
00108 void unexpected(const char* msg, const UChar* line);
00109
00110
00111
00112 private:
00113 static const int INVALID_TAG = 0, END_TAG = 1, END_TAG_AND_ELEM = 2;
00114 int stat;
00115 bool permissive, collapse_spaces;
00116 const UChar *text_buffer, *p;
00117 UXmlDoc* doc;
00118 uptr<UStr> sout;
00119 std::ostream* fout;
00120 UXmlGrammars* parser_grammars;
00121 };
00122 }
00123 #endif
00124
00125
00126
00127