Changeset 156


Ignore:
Timestamp:
May 28, 2008, 10:20:30 AM (11 years ago)
Author:
lindanl
Message:

Content model validation with recursive parsers; error messages.

Location:
trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r155 r156  
    329329template <CodeUnit_Base C>
    330330inline void ParsingEngine<C>::WF_Error (XML_Constraint errCode) {
     331        printf("Error at position %i in input.\n", AbsPos());
    331332        ShowConstraintError(errCode);
    332333        exit(-1);
     
    337338template <CodeUnit_Base C>
    338339inline void ParsingEngine<C>::Validity_Error (XML_Constraint errCode) {
     340        printf("Error at position %i in input.\n", AbsPos());
    339341        ShowConstraintError(errCode);
    340         Error_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     342        exit(-1);
     343//      Error_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
    341344}
    342345       
    343346template <CodeUnit_Base C>
    344347inline void ParsingEngine<C>::Syntax_Error (XML_NonTerminal errNT) {
     348        printf("Error at position %i in input.\n", AbsPos());
    345349        ShowSyntaxError(errNT);
    346350        exit(-1);
     
    452456                                        entity_parser = ParserFactory(this_info->ReplacementText, strlen(this_info->ReplacementText),entity_Info, model_info);
    453457                                        entity_parser->Parse_WF_Content();
     458                                        if(!entity_parser->at_EOF())
     459                                                Syntax_Error(NT_content);
     460                                        entity_parser->~Parser_Interface();
     461                                }
     462                        }
     463                }
     464               
     465        }
     466}
     467
     468template <CodeUnit_Base C>
     469inline void ParsingEngine<C>::Parse_ValidEntityRef(CM_RegExp * cre, int & cur_state) {
     470    Advance(1);  // skip "&"
     471        int nameID = Parse_Name();  /* Name delimiter */
     472    if (!AtChar<C,';'>(cur())) {
     473                Syntax_Error(NT_Reference);
     474    }
     475        else {
     476                Advance(1);
     477                Reference_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
     478               
     479                //      The following code will replace Reference_Action.
     480                GEntity_info * this_info;
     481                Parser_Interface * entity_parser;
     482                int entityID = model_info->GlobalGEntityTable[nameID];
     483                if (entityID == 0)
     484                        WF_Error(wfErr_wf_entdeclared);
     485                else{
     486                        this_info = model_info->GEntityData[entityID-1];
     487                        if (this_info->is_external){
     488                               
     489                        if (entity_Info->standalone != Standalone_no)
     490                                WF_Error(wfErr_NoExternalRefs);
     491                        else {
     492                                        entity_parser = ParserFactory(this_info->systemLiteral, model_info);
     493                                        entity_parser->Parse_ValidContent(cre, cur_state);
     494                                        if(!entity_parser->at_EOF())
     495                                                Syntax_Error(NT_content);
     496                                        entity_parser->~Parser_Interface();
     497                        }
     498                        }
     499                        else {
     500                                if (this_info->is_simple == true);
     501//                                      printf("Entity is %s\n",this_info->ReplacementText);
     502                                else{
     503//                                      printf("Not a simple text: %s\n",this_info->ReplacementText);
     504                                        entity_parser = ParserFactory(this_info->ReplacementText, strlen(this_info->ReplacementText),entity_Info, model_info);
     505                                        entity_parser->Parse_ValidContent(cre, cur_state);
    454506                                        if(!entity_parser->at_EOF())
    455507                                                Syntax_Error(NT_content);
     
    823875        int nameID = Parse_WF_StartTag(is_emptyStartTag);
    824876#ifdef DEBUG
    825         printf("Parse_Element: elemID = %d, is_emptyStartTag=%i\n",elemID, is_emptyStartTag);
     877        printf("Parse_Element: nameID = %d, is_emptyStartTag=%i\n",nameID, is_emptyStartTag);
    826878#endif
    827879        if (!is_emptyStartTag) {
     
    830882        }
    831883}
     884
    832885
    833886template <CodeUnit_Base C>
     
    20062059                        int content_state = 0;
    20072060                        if (!is_emptyStartTag) {
    2008                                 content_state = Parse_ValidContent(cre);
     2061                                Parse_ValidContent(cre, content_state);
     2062                                #ifdef DEBUG
     2063                                printf("Final content_state = %i, nameID = %i\n", content_state, nameID);
     2064                                #endif
    20092065                                Parse_WF_EndTag(nameID);               
    20102066                        }
     
    20172073
    20182074template <CodeUnit_Base C>
    2019 inline int ParsingEngine<C>::Parse_ValidContent(CM_RegExp * cre) {
    2020         int cur_state = 0;
     2075inline void ParsingEngine<C>::Parse_ValidContent(CM_RegExp * cre, int & cur_state) {
    20212076        do {
    20222077                ScanTo(NonWS);
     
    20432098                }
    20442099                else if (AtChar<C,'&'>(cur())) {
    2045                         Parse_EntityRef();
     2100                        Parse_ValidEntityRef(cre, cur_state);
     2101#ifdef DEBUG
     2102                        printf("EntityRef complete, cur_state = %i\n", cur_state);
     2103#endif
     2104                       
    20462105                }
    20472106                else if (at_EOF()) {
     
    20552114                }
    20562115        } while(1);
    2057         return cur_state;
    20582116}
    20592117
     
    21742232        ScanTo(NameFollow);
    21752233        int lgth = AbsPos()-name_pos;
    2176 
    21772234        if (entity_Info->version == XML_1_1){
    21782235                return model_info->symbol_table->UTF8_Lookup_or_Insert_XML11_Name((char *)GetCodeUnitPtr(name_pos),lgth);
     
    21862243inline void ParsingEngine<C>::Parse_DocumentContent() {
    21872244#if (VALIDATION_MODE == ON)
    2188         int final_state = Parse_ValidContent(model_info->rootModel);
    2189         if (model_info->rootModel->transition_map[final_state][0]==0) {
     2245        int cur_state = 0;
     2246        Parse_ValidContent(model_info->rootModel, cur_state);
     2247        if (model_info->rootModel->transition_map[cur_state][0]==0) {
    21902248                Validity_Error(vErr_elementvalid);
    21912249        }
  • trunk/src/engine.h

    r136 r156  
    3131        virtual void Parse_DocumentContent() = 0;
    3232        virtual void Parse_WF_Content() = 0;
     33        virtual void Parse_ValidContent(CM_RegExp * cre, int & cur_state) = 0;
    3334        virtual bool at_EOF() const = 0;
    3435        virtual void Parse_ExtSubsetDecl() = 0;
     
    132133        void Parse_WF_EndTag(int nameID);       
    133134
    134 
     135        void Parse_ValidEntityRef(CM_RegExp * cre, int & cur_state);
    135136        int Parse_ValidElement();
    136         int Parse_ValidContent(CM_RegExp * cre);
     137        void Parse_ValidContent(CM_RegExp * cre, int & cur_state);
    137138        void Parse_AnyContent();
    138139        void Parse_MixedContent(symbol_set_t elems);
  • trunk/src/xml_error.c

    r124 r156  
    1414        }
    1515        else {
    16 #ifdef VALIDATION
    1716                fprintf(stderr, "Violation of validity constraint: %s\n", XML_Constraint_Strings[errCode]);
    1817                exit(-1);
    19 #endif
    2018        }
    2119}
Note: See TracChangeset for help on using the changeset viewer.