source: trunk/src/engine.h @ 87

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

Separate CDATA start/end actions as in expat.

File size: 5.2 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
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        virtual void ParseContent() = 0;
25        virtual void Parse_DocType() = 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();
33protected:
34        /* Co-classes */
35        Model_Info * model_info;
36        Byteplex * byteplex;   
37        Bitplex * bitplex;
38        Lexer_Interface * lexer;
39        /* Parallel data streams for current buffer full of XML data. */
40        BytePack * x8data;
41        LexicalStreamSet * buf;
42               
43        int buffer_base_pos;
44        int buffer_rel_pos;
45        int buffer_limit_pos;
46};
47
48template <CodeUnit_Base C>
49class ParsingEngine : public Parser_Interface {
50public:
51        ParsingEngine(Model_Info * m, Byteplex * b);
52        ~ParsingEngine();
53        void ParseContent();
54protected:
55
56        XML_Decl_Parser<C> * decl_parser;
57       
58        int text_or_markup_start;
59        /* Getters for current point/position information. */
60        int AbsPos() const;
61        int BufferRelPos() const;
62        unsigned char * cur() const;
63
64        bool at_EOF () const;
65        /*Internal helper for text action*/
66        void text_if_nonnull_action();
67        /* Mutators that advance the input. */
68        void Advance(int n);
69        void ScanTo(int lex_item);
70        void ScanToMarkupStart();  // Specialized version.
71        void ScanToCD_End_check(); // Specialized version.
72
73        void AdvanceBuffers(int preserve_pos);
74        /* Parsing routines. */
75
76        void Parse_Markup ();
77        void Parse_Comment ();
78        void Parse_StartTag ();
79        void Parse_EndTag ();
80        void Parse_CDATA ();
81        void Parse_PI ();
82        void Parse_Reference ();       
83       
84        /* Parsing routine for Document Type*/
85        void Parse_DocType ();
86        void Parse_ExternalID ();
87        void Parse_MatchedQuote ();
88        void Parse_IntSubset ();
89        void Parse_PEReference ();
90        void Parse_Elementdecl ();
91        void Parse_RemainedMixed ();
92        void Parse_RemainedChildren ();
93        void Parse_Cp();
94        void Parse_AttlistDecl ();
95        void Parse_Enumeration ();
96        void Parse_DefaultDecl ();
97        void Parse_Entitydecl ();
98        void Parse_Notationdecl ();
99        void requireWS ();
100        void Parse_AttValue ();
101       
102        void Parse_Prolog();
103       
104        /* Action routine for document start. */
105        void DocumentStart_action();   
106       
107        /* Action routine for document end. */
108        void DocumentEnd_action();
109       
110        /* Action routine for an XML comment in "<!--"  "-->" brackets. */
111        void Comment_action(int start_pos, int end_pos);
112       
113        /* Action routine called upon recognizing "<![CDATA[" to start a CDATA section. */
114        void CDATA_start_action(int pos);
115
116        /* Action routine called upon recognizing "]]>" to end a CDATA section. */
117        void CDATA_end_action(int pos);
118       
119        /* Action routine for an XML processing instruction enclosed in "<?" and "?>" brackets. */
120        void PI_action(int start_pos, int end_pos);
121       
122        /* Action routine for an empty element enclosed in "<" and "/>" brackets. */
123        void EmptyElement_action(int start_pos, int end_pos);
124       
125        /* Action routine for a start tag enclosed in "<" and ">" brackets. */
126        void StartTag_action(int start_pos, int end_pos);
127       
128        /* Action routine for an end tag enclosed in "</" and ">" brackets. */
129        void EndTag_action(int start_pos, int end_pos);
130       
131        /* Action routine for an error item */
132        void Error_action(int start_pos, int end_pos);
133       
134        /* Action routine for a text item */
135        void Text_action(int start_pos, int end_pos);
136       
137        /* Action routine for a character or entity reference.*/
138        void Reference_action(int start_pos, int end_pos);
139       
140        /* Action routine for an element name occurring immediately after the
141        opening "<" of a start tag or empty element tag. */
142        void ElementName_action(int start_pos, int end_pos);
143       
144        /* Action routine for a processing instruction target name occurring immediately
145        after the opening "<?" of a processing instruction. */
146        void PI_Target_action(int start_pos, int end_pos);
147       
148        /* Action routine for an individual attribute/value pair occurring in
149        a element start tag or an empty element tag. */
150        void AttributeValue_action(int name_start, int name_end, 
151                                        int val_start, int val_end);
152       
153        /* Action routine for an individual namespace binding occurring in
154        a element start tag or an empty element tag. */
155        void Namespace_action(int name_start, int name_end, 
156                                int URI_start, int URI_end);
157       
158        /*Action routine for end of buffer events.
159         The preserve_pos should be set to indicate the position
160         of data that must be copied into the new buffer.*/
161        void FinalizeBuffer_action(int& preserve_pos);
162       
163        /*Document Type actions.*/
164        void Doctype_action(int start_pos, int end_pos);
165        void PEReference_action(int start_pos, int end_pos);
166        void Elementdecl_action(int start_pos, int end_pos);
167        void AttlistDecl_action(int start_pos, int end_pos);
168        void Entitydecl_action(int start_pos, int end_pos);
169        void Notationdecl_action(int start_pos, int end_pos);
170       
171        void Prolog_action(int start_pos, int end_pos);
172};
173
174
175#endif
Note: See TracBrowser for help on using the repository browser.