source: trunk/src/engine.h @ 170

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

AdjustBufferEndForIncompleteSequences? for UTF-8 and UTF-16

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