source: trunk/src/engine.h @ 115

Last change on this file since 115 was 115, checked in by lindanl, 11 years ago

various error checks in parsing

File size: 6.4 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 (char *& SystemLiteral, char *& PubidLiteral);
102        void Parse_SystemLiteral ();
103        void Parse_PubidLiteral ();
104        void Parse_IntSubset ();
105        void Parse_PEReference ();
106        void Parse_Elementdecl ();
107        ContentModel * Parse_RemainingMixed ();
108        Content_RE * Parse_RemainingChildren ();
109        Content_RE * Parse_Cp();
110        void Parse_AttlistDecl ();
111        void Parse_Notation (ATT_info * this_info);
112        void Parse_Enumeration (ATT_info * this_info);
113        void Parse_DefaultDecl (ATT_info * this_info);
114        void Parse_Entitydecl ();
115        void Parse_Notationdecl ();
116        void requireWS ();
117        void Parse_AttValue ();
118        void Parse_GEntityValue(GEntity_info * this_info);
119        void Parse_PEntityValue(PEntity_info * this_info);
120        char * Replace_EntityRef(bool& is_simple);
121        char * Replace_CharRef();
122        void Parse_Prolog();
123        void Parse_DocumentContent();
124       
125        int Parse_ValidElement();
126        int Parse_ValidContent(CM_RegExp * cre);
127        void Parse_AnyContent();
128        void Parse_MixedContent(symbol_set_t elems);
129       
130        int Parse_ValidStartTag(bool& is_empty);
131               
132        /*Parsing routine for external entities*/
133        void Parse_ExtSubsetDecl ();
134       
135        /* Action routine for document start. */
136        void DocumentStart_action();   
137       
138        /* Action routine for document end. */
139        void DocumentEnd_action();
140       
141        /* Action routine for an XML comment in "<!--"  "-->" brackets. */
142        void Comment_action(unsigned char * item, int lgth);
143       
144        /* Action routine called upon recognizing "<![CDATA[" to start a CDATA section. */
145        void CDATA_start_action(unsigned char * CDATA_ptr);
146
147        /* Action routine called upon recognizing "]]>" to end a CDATA section. */
148        void CDATA_end_action(unsigned char * CDATA_end_ptr);
149       
150        /* Action routine for an XML processing instruction enclosed in "<?" and "?>" brackets. */
151        void PI_action(unsigned char * item, int lgth);
152       
153        /* Action routine for an empty element enclosed in "<" and "/>" brackets. */
154        void EmptyElement_action(unsigned char * item, int lgth);
155       
156        /* Action routine for a start tag enclosed in "<" and ">" brackets. */
157        void StartTag_action(unsigned char * item, int lgth);
158       
159        /* Action routine for an end tag enclosed in "</" and ">" brackets. */
160        void EndTag_action(unsigned char * item, int lgth);
161       
162        /* Action routine for an error item */
163        void Error_action(unsigned char * item, int lgth);
164       
165        /* Action routine for a text item */
166        void Text_action(unsigned char * item, int lgth);
167       
168        /* Action routine for a character or entity reference.*/
169        void Reference_action(unsigned char * item, int lgth);
170       
171        /* Action routine for an element name occurring immediately after the
172        opening "<" of a start tag or empty element tag. */
173        void ElementName_action(unsigned char * item, int lgth);
174       
175        /* Action routine for a processing instruction target name occurring immediately
176        after the opening "<?" of a processing instruction. */
177        void PI_Target_action(unsigned char * item, int lgth);
178       
179        /* Action routine for an individual attribute/value pair occurring in
180        a element start tag or an empty element tag. */
181        void AttributeValue_action(unsigned char * name, int name_lgth, 
182                                   unsigned char * val, int val_lgth);
183       
184        /* Action routine for an individual namespace binding occurring in
185        a element start tag or an empty element tag. */
186        void Namespace_action(unsigned char * name, int name_end, 
187                              unsigned char * URI, int URI_end);
188       
189        /*Action routine for end of buffer events.
190         The preserve_pos should be set to indicate the position
191         of data that must be copied into the new buffer.*/
192        void FinalizeBuffer_action(int& preserve_pos);
193       
194        /*Document Type actions.*/
195        void Doctype_action(unsigned char * item, int lgth);
196        void PEReference_action(unsigned char * item, int lgth);
197       
198        void Prolog_action(unsigned char * item, int lgth);
199       
200        void ExtSubsetDecl_action(unsigned char * item, int lgth);
201};
202
203
204#endif
Note: See TracBrowser for help on using the repository browser.