source: branches/parabix-svgopen-2008/src/engine.h @ 217

Last change on this file since 217 was 205, checked in by ksherdy, 11 years ago

SVG Open 2008 branch.

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