source: trunk/src/engine.h @ 91

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

ATTLIST semantics

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