source: trunk/src/engine.h @ 98

Last change on this file since 98 was 98, checked in by cameron, 12 years ago

Separate CharRef/EntityRef? routines

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