source: trunk/src/engine.h @ 100

Last change on this file since 100 was 100, checked in by lindanl, 12 years ago

Parsers for internal and external entities.

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