Changeset 136 for trunk/src/engine.c


Ignore:
Timestamp:
May 6, 2008, 2:18:45 PM (11 years ago)
Author:
lindanl
Message:

New end tag checking for validation mode.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/engine.c

    r135 r136  
    839839inline void ParsingEngine<C>::ParseContent() {
    840840        DocumentStart_action();
    841         vector<int> elemStack;
    842         int elemID;
    843841        bool is_emptyStartTag = false;
    844842        do {
     
    852850                        text_if_nonnull_action();
    853851                        Parse_StartTag();
    854 //                      elemID = Parse_ValidStartTag(is_emptyStartTag);
    855 //                      if(!is_emptyStartTag)
    856 //                              elemStack.push_back(elemID);
    857 //                      else
    858 //                              is_emptyStartTag = false;
    859852                }
    860853                else if (at_EndTag_Start<C>(cur())) {
    861854                        text_if_nonnull_action();
    862855                        Parse_EndTag();
    863 //                      elemID = Parse_ValidEndTag();
    864 //                      if (elemStack.size()<= 0 || elemID != elemStack[elemStack.size()-1])
    865 //                              Syntax_Error(NT_ETag);
    866 //                      else
    867 //                              elemStack.pop_back();
    868856                }
    869857                else if (at_Comment_Start<C>(cur())) {
     
    950938       
    951939        if (AtChar<C,'>'>(cur())){
    952                 Advance(1);   
    953                 int rootID = model_info->GlobalElementTable[nameID];
     940                Advance(1); 
    954941
    955942                CRE_Seq * rslt = new CRE_Seq();
    956                 rslt->subCMs.push_back(new CRE_Name(rootID));
     943                rslt->subCMs.push_back(new CRE_Name(nameID));
    957944                CM_RegExp * cre = new CM_RegExp();
    958945                cre->content_re = rslt;         
     
    11391126        Advance(5);
    11401127        cm = new CM_Empty();
    1141         model_info->ContentModelData[elemID] = cm;
     1128        model_info->ContentModelData[nameID] = cm;
    11421129        }
    11431130    else if (at_ANY<C>(cur())) {
    11441131        Advance(3);
    11451132        cm = new CM_Any();
    1146         model_info->ContentModelData[elemID] = cm;
     1133        model_info->ContentModelData[nameID] = cm;
    11471134    }
    11481135    else {
     
    11521139                if (at_PCDATA<C>(cur())){
    11531140                        cm = Parse_RemainingMixed();
    1154                         model_info->ContentModelData[elemID] = cm;
     1141                        model_info->ContentModelData[nameID] = cm;
    11551142                }
    11561143                else{
     
    11721159                        cre -> transition_map = transition_map;
    11731160                       
    1174                         model_info->ContentModelData[elemID] = cre;
     1161                        model_info->ContentModelData[nameID] = cre;
    11751162                        cm = cre;
    11761163                }                       
     
    12041191                        ScanTo(NonWS);
    12051192                        int nameID = Parse_Name();
    1206                         int elemID = model_info->getOrInsertGlobalElement(nameID);
    1207                         r->elements[elemID] = ++k;
     1193                        r->elements[nameID] = ++k;
    12081194                        ScanTo(NonWS);
    12091195                }
     
    12941280        else{
    12951281                int nameID = Parse_Name();
    1296                 int elemID = model_info->getOrInsertGlobalElement(nameID);
    1297                 CRE_Name * r = new CRE_Name(elemID);
     1282                CRE_Name * r = new CRE_Name(nameID);
    12981283
    12991284                if (AtChar<C,'?'>(cur())) {
     
    18411826}
    18421827
    1843 template <CodeUnit_Base C>
    1844 inline int ParsingEngine<C>::Parse_ValidEndTag() {
    1845         Advance(2); /* Skip "</". */
    1846        
    1847        
    1848         int nameID = Parse_Name(); 
    1849         int elemID = model_info->GlobalElementTable[nameID];
    1850         if(elemID==0)
    1851                         Validity_Error(vErr_elementvalid);
    1852                        
    1853         if (AtChar<C,'>'>(cur())) {
    1854                 Advance(1);
    1855                 EndTag_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
    1856         }
    1857     else {
    1858                 ScanTo(NonWS);
    1859                 if (AtChar<C,'>'>(cur())) {
    1860                         Advance(1);
    1861                         EndTag_action(GetCodeUnitPtr(text_or_markup_start), LengthFrom(text_or_markup_start));
    1862                 }
    1863                 else Syntax_Error(NT_ETag);
    1864     }
    1865     return elemID;
    1866 }
    18671828/* Parse a valid start or empty element tag. */
    18681829template <CodeUnit_Base C>
     
    19701931                } while (1);
    19711932        }
    1972         return elemID;
     1933        return nameID;
    19731934}
    19741935
     
    19761937inline int ParsingEngine<C>::Parse_ValidElement() {
    19771938        bool is_emptyStartTag = false;
    1978         int elemID = Parse_ValidStartTag(is_emptyStartTag);
     1939        int nameID = Parse_ValidStartTag(is_emptyStartTag);
    19791940#ifdef DEBUG
    1980         printf("Parse_ValidElement: elemID = %d, is_emptyStartTag=%i\n",elemID, is_emptyStartTag);
     1941        printf("Parse_ValidElement: nameID = %d, is_emptyStartTag=%i\n",nameID, is_emptyStartTag);
    19811942#endif
    1982         ContentModel * cm = model_info->ContentModelData[elemID];
     1943        ContentModel * cm = model_info->ContentModelData[nameID];
    19831944        switch (cm->cm_type) {
    19841945                case cm_Empty:
    19851946                        if (!is_emptyStartTag) {
    19861947                                if (at_EndTag_Start<C>(cur())) {
    1987                                         if (Parse_ValidEndTag()!=elemID) Validity_Error(vErr_elementvalid);
    1988 //                                      Parse_EndTag();
     1948                                        Parse_WF_EndTag(nameID);
    19891949                                }
    19901950                                else {
     
    19961956                        if (!is_emptyStartTag) {
    19971957                                Parse_AnyContent();
    1998                                 if (Parse_ValidEndTag()!=elemID) Validity_Error(vErr_elementvalid);
     1958                                Parse_WF_EndTag(nameID);
    19991959                        }
    20001960                        break;
     
    20021962                        if (!is_emptyStartTag) {
    20031963                                Parse_MixedContent(((CM_Mixed *) cm)->elements);
    2004                                 if (Parse_ValidEndTag()!=elemID) Validity_Error(vErr_elementvalid);
     1964                                Parse_WF_EndTag(nameID);
    20051965                        }
    20061966                        break;
     
    20101970                        if (!is_emptyStartTag) {
    20111971                                content_state = Parse_ValidContent(cre);
    2012                                 if (Parse_ValidEndTag()!=elemID) Validity_Error(vErr_elementvalid);                    
     1972                                Parse_WF_EndTag(nameID);               
    20131973                        }
    20141974                        if (cre->transition_map[content_state][0]==0) {
     
    20161976                        }
    20171977        }
    2018         return elemID;
     1978        return nameID;
    20191979}
    20201980
     
    20301990                }
    20311991                else if (at_ElementTag_Start<C>(cur())) {
    2032                         int elemID = Parse_ValidElement();
     1992                        int nameID = Parse_ValidElement();
    20331993#ifdef DEBUG
    20341994                        printf("Content model state transition %i", cur_state);
    20351995#endif
    2036                         cur_state = cre->transition_map[cur_state][elemID];
     1996                        cur_state = cre->transition_map[cur_state][nameID];
    20371997#ifdef DEBUG
    20381998                        printf("-> %i\n", cur_state);
     
    20692029                if (at_ElementTag_Start<C>(cur())) {
    20702030                        text_if_nonnull_action();
    2071                         int elemID = Parse_ValidElement();
     2031                        int nameID = Parse_ValidElement();
    20722032                }
    20732033                else if (at_EndTag_Start<C>(cur())) {
     
    21242084                if (at_ElementTag_Start<C>(cur())) {
    21252085                        text_if_nonnull_action();
    2126                         int elemID = Parse_ValidElement();
    2127                         if (elems[elemID] == 0) {
     2086                        int nameID = Parse_ValidElement();
     2087                        if (elems[nameID] == 0) {
    21282088                                Validity_Error(vErr_elementvalid);
    21292089                        }
     
    21882148inline void ParsingEngine<C>::Parse_DocumentContent() {
    21892149#ifdef VALIDATION
     2150        printf("Validation Mode On!\n");
    21902151        int final_state = Parse_ValidContent(model_info->rootModel);
    21912152        if (model_info->rootModel->transition_map[final_state][0]==0) {
Note: See TracChangeset for help on using the changeset viewer.