source: trunk/src/engine.h @ 110

Last change on this file since 110 was 110, checked in by cameron, 11 years ago

Rename constraint errors XML_Error -> XML_Constraint.

File size: 6.6 KB
Line 
1/*  engine.h - parabix parsing engine
2    Copyright (c) 2007, 2008 Robert D. Cameron and Dan Lin
3    Licensed to the public under the Open Software License 3.0.
4    Licensed to International Characters, Inc., under the Academic
5    Free License 3.0.
6
7*/
8#ifndef ENGINE_H
9#define ENGINE_H
10
11#include "xmlmodel.h"
12#include "xmldecl.h"
13#include "byteplex.h"
14#include "bitlex.h"
15#include "xml_error.h"
16#include "contentmodel.h"
17#define min(x,y) ((x) <(y) ?(x) :(y) )
18/* A ParsingEngine is the principal class for parsing XML
19data.  */
20
21class Parser_Interface {
22public:
23        ~Parser_Interface();
24        static Parser_Interface * ParserFactory(char * filename);
25        static Parser_Interface * ParserFactory(char * filename, Model_Info * m);
26        // Constructor for a subsidiary parser for internal entities.
27        static Parser_Interface * ParserFactory(char * byte_buffer, int byte_count, Entity_Info * e, Model_Info * m);
28        virtual void ParseContent() = 0;
29        virtual void Parse_DocumentContent() = 0;
30        virtual void Parse_ExtSubsetDecl() = 0;
31        virtual void Parse_Prolog() = 0;
32        unsigned char * GetCodeUnitPtr(int pos);
33        bool has_ByteOrderMark();
34        XML_version get_version();
35        XML_standalone standalone_status();
36        bool has_EncodingDecl();
37        unsigned char * get_Encoding();
38        Model_Info * model_info;
39        Entity_Info * entity_Info;
40protected:
41        /* Co-classes */
42
43        Byteplex * byteplex;   
44        Bitplex * bitplex;
45        Lexer_Interface * lexer;
46        /* Parallel data streams for current buffer full of XML data. */
47        BytePack * x8data;
48        LexicalStreamSet * buf;
49               
50        int buffer_base_pos;
51        int buffer_rel_pos;
52        int buffer_limit_pos;
53       
54};
55
56template <CodeUnit_Base C>
57class ParsingEngine : public Parser_Interface {
58public:
59        ParsingEngine(Entity_Info * e, Model_Info * m, Byteplex * b, bool is_external);
60        ~ParsingEngine();
61        void ParseContent();
62protected:
63        bool StrictWellFormedness;
64
65        vector<int> LastAttOccurrence;
66        XML_Decl_Parser<C> * decl_parser;
67       
68        int text_or_markup_start;
69        /* Getters for current point/position information. */
70        int AbsPos() const;
71        int LengthFrom(int start_pos) const;
72        int BufferRelPos() const;
73        unsigned char * cur() const;
74
75        bool at_EOF () const;
76        /*Internal helper for text action*/
77        void text_if_nonnull_action();
78        /* Mutators that advance the input. */
79        void Advance(int n);
80        void ScanTo(int lex_item);
81        void ScanToMarkupStart();  // Specialized version.
82        void ScanToCD_End_check(); // Specialized version.
83
84        void AdvanceBuffers(int preserve_pos);
85        /* Parsing routines. */
86
87        void WF_Error (XML_Constraint errCode);
88        void Validity_Error (XML_Constraint errCode);
89        void Syntax_Error (XML_NonTerminal errNT);
90       
91        void Parse_Comment ();
92        void Parse_StartTag ();
93        void Parse_EndTag ();
94        void Parse_CDATA ();
95        void Parse_PI ();
96        void Parse_CharRef (); 
97        void Parse_EntityRef ();       
98       
99        /* Parsing routine for Document Type*/
100        void Parse_DocType ();
101        void Parse_ExternalID ();
102        void Parse_MatchedQuote ();
103        void Parse_IntSubset ();
104        void Parse_PEReference ();
105        void Parse_Elementdecl ();
106        ContentModel * Parse_RemainingMixed ();
107        Content_RE * Parse_RemainingChildren ();
108        Content_RE * Parse_Cp();
109        void Parse_AttlistDecl ();
110        void Parse_Notation (ATT_info * this_info);
111        void Parse_Enumeration (ATT_info * this_info);
112        void Parse_DefaultDecl (ATT_info * this_info);
113        void Parse_Entitydecl ();
114        void Parse_Notationdecl ();
115        void requireWS ();
116        void Parse_AttValue ();
117        void Parse_GEntityValue(GEntity_info * this_info);
118        void Parse_PEntityValue(PEntity_info * this_info);
119        char * Replace_EntityRef(bool& is_simple);
120        char * Replace_CharRef();
121        void Parse_Prolog();
122        void Parse_DocumentContent();
123       
124        int Parse_ValidElement();
125        int Parse_ValidContent(CM_RegExp * cre);
126        void Parse_AnyContent();
127        void Parse_MixedContent(symbol_set_t elems);
128       
129        int Parse_ValidStartTag(bool& is_empty);
130               
131        /*Parsing routine for external entities*/
132        void Parse_ExtSubsetDecl ();
133       
134        /* Action routine for document start. */
135        void DocumentStart_action();   
136       
137        /* Action routine for document end. */
138        void DocumentEnd_action();
139       
140        /* Action routine for an XML comment in "<!--"  "-->" brackets. */
141        void Comment_action(unsigned char * item, int lgth);
142       
143        /* Action routine called upon recognizing "<![CDATA[" to start a CDATA section. */
144        void CDATA_start_action(unsigned char * CDATA_ptr);
145
146        /* Action routine called upon recognizing "]]>" to end a CDATA section. */
147        void CDATA_end_action(unsigned char * CDATA_end_ptr);
148       
149        /* Action routine for an XML processing instruction enclosed in "<?" and "?>" brackets. */
150        void PI_action(unsigned char * item, int lgth);
151       
152        /* Action routine for an empty element enclosed in "<" and "/>" brackets. */
153        void EmptyElement_action(unsigned char * item, int lgth);
154       
155        /* Action routine for a start tag enclosed in "<" and ">" brackets. */
156        void StartTag_action(unsigned char * item, int lgth);
157       
158        /* Action routine for an end tag enclosed in "</" and ">" brackets. */
159        void EndTag_action(unsigned char * item, int lgth);
160       
161        /* Action routine for an error item */
162        void Error_action(unsigned char * item, int lgth);
163       
164        /* Action routine for a text item */
165        void Text_action(unsigned char * item, int lgth);
166       
167        /* Action routine for a character or entity reference.*/
168        void Reference_action(unsigned char * item, int lgth);
169       
170        /* Action routine for an element name occurring immediately after the
171        opening "<" of a start tag or empty element tag. */
172        void ElementName_action(unsigned char * item, int lgth);
173       
174        /* Action routine for a processing instruction target name occurring immediately
175        after the opening "<?" of a processing instruction. */
176        void PI_Target_action(unsigned char * item, int lgth);
177       
178        /* Action routine for an individual attribute/value pair occurring in
179        a element start tag or an empty element tag. */
180        void AttributeValue_action(unsigned char * name, int name_lgth, 
181                                   unsigned char * val, int val_lgth);
182       
183        /* Action routine for an individual namespace binding occurring in
184        a element start tag or an empty element tag. */
185        void Namespace_action(unsigned char * name, int name_end, 
186                              unsigned char * URI, int URI_end);
187       
188        /*Action routine for end of buffer events.
189         The preserve_pos should be set to indicate the position
190         of data that must be copied into the new buffer.*/
191        void FinalizeBuffer_action(int& preserve_pos);
192       
193        /*Document Type actions.*/
194        void Doctype_action(unsigned char * item, int lgth);
195        void PEReference_action(unsigned char * item, int lgth);
196        void AttlistDecl_action(unsigned char * item, int lgth);
197        void Entitydecl_action(unsigned char * entity_name, int entity_name_lgth, unsigned char * item, int lgth);
198        void Notationdecl_action(unsigned char * item, int lgth);
199       
200        void Prolog_action(unsigned char * item, int lgth);
201       
202        void ExtSubsetDecl_action(unsigned char * item, int lgth);
203};
204
205
206#endif
Note: See TracBrowser for help on using the repository browser.