source: trunk/src/engine.h @ 155

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

New end tag checking for validation mode.

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