source: trunk/src/engine.h @ 78

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

DTD parsing.

File size: 5.0 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
71        void AdvanceBuffers(int preserve_pos);
72        /* Parsing routines. */
73
74        void Parse_Markup ();
75        void Parse_Comment ();
76        void Parse_StartTag ();
77        void Parse_EndTag ();
78        void Parse_CDATA ();
79        void Parse_PI ();
80        void Parse_Reference ();       
81       
82        /* Parsing routine for Document Type*/
83        void Parse_DocType ();
84        void Parse_ExternalID ();
85        void Parse_MatchedQuote ();
86        void Parse_IntSubset ();
87        void Parse_PEReference ();
88        void Parse_Elementdecl ();
89        void Parse_RemainedMixed ();
90        void Parse_RemainedChildren ();
91        void Parse_Cp();
92        void Parse_AttlistDecl ();
93        void Parse_Enumeration ();
94        void Parse_DefaultDecl ();
95        void Parse_Entitydecl ();
96        void Parse_Notationdecl ();
97        void requireWS ();
98        void Parse_AttValue ();
99       
100        void Parse_Prolog();
101       
102        /* Action routine for document start. */
103        void DocumentStart_action();   
104       
105        /* Action routine for document end. */
106        void DocumentEnd_action();
107       
108        /* Action routine for an XML comment in "<!--"  "-->" brackets. */
109        void Comment_action(int start_pos, int end_pos);
110       
111        /* Action routine for a CDATA section enclosed in "<![CDATA[" and "]]>" brackets. */
112        void CDATA_action(int start_pos, int end_pos);
113       
114        /* Action routine for an XML processing instruction enclosed in "<?" and "?>" brackets. */
115        void PI_action(int start_pos, int end_pos);
116       
117        /* Action routine for an empty element enclosed in "<" and "/>" brackets. */
118        void EmptyElement_action(int start_pos, int end_pos);
119       
120        /* Action routine for a start tag enclosed in "<" and ">" brackets. */
121        void StartTag_action(int start_pos, int end_pos);
122       
123        /* Action routine for an end tag enclosed in "</" and ">" brackets. */
124        void EndTag_action(int start_pos, int end_pos);
125       
126        /* Action routine for an error item */
127        void Error_action(int start_pos, int end_pos);
128       
129        /* Action routine for a text item */
130        void Text_action(int start_pos, int end_pos);
131       
132        /* Action routine for a character or entity reference.*/
133        void Reference_action(int start_pos, int end_pos);
134       
135        /* Action routine for an element name occurring immediately after the
136        opening "<" of a start tag or empty element tag. */
137        void ElementName_action(int start_pos, int end_pos);
138       
139        /* Action routine for a processing instruction target name occurring immediately
140        after the opening "<?" of a processing instruction. */
141        void PI_Target_action(int start_pos, int end_pos);
142       
143        /* Action routine for an individual attribute/value pair occurring in
144        a element start tag or an empty element tag. */
145        void AttributeValue_action(int name_start, int name_end, 
146                                        int val_start, int val_end);
147       
148        /* Action routine for an individual namespace binding occurring in
149        a element start tag or an empty element tag. */
150        void Namespace_action(int name_start, int name_end, 
151                                int URI_start, int URI_end);
152       
153        /*Action routine for end of buffer events.
154         The preserve_pos should be set to indicate the position
155         of data that must be copied into the new buffer.*/
156        void FinalizeBuffer_action(int& preserve_pos);
157       
158        /*Document Type actions.*/
159        void Doctype_action(int start_pos, int end_pos);
160        void PEReference_action(int start_pos, int end_pos);
161        void Elementdecl_action(int start_pos, int end_pos);
162        void AttlistDecl_action(int start_pos, int end_pos);
163        void Entitydecl_action(int start_pos, int end_pos);
164        void Notationdecl_action(int start_pos, int end_pos);
165       
166        void Prolog_action(int start_pos, int end_pos);
167};
168
169
170#endif
Note: See TracBrowser for help on using the repository browser.