Legend:
- Unmodified
- Added
- Removed
-
trunk/src/engine.c
r135 r136 839 839 inline void ParsingEngine<C>::ParseContent() { 840 840 DocumentStart_action(); 841 vector<int> elemStack;842 int elemID;843 841 bool is_emptyStartTag = false; 844 842 do { … … 852 850 text_if_nonnull_action(); 853 851 Parse_StartTag(); 854 // elemID = Parse_ValidStartTag(is_emptyStartTag);855 // if(!is_emptyStartTag)856 // elemStack.push_back(elemID);857 // else858 // is_emptyStartTag = false;859 852 } 860 853 else if (at_EndTag_Start<C>(cur())) { 861 854 text_if_nonnull_action(); 862 855 Parse_EndTag(); 863 // elemID = Parse_ValidEndTag();864 // if (elemStack.size()<= 0 || elemID != elemStack[elemStack.size()-1])865 // Syntax_Error(NT_ETag);866 // else867 // elemStack.pop_back();868 856 } 869 857 else if (at_Comment_Start<C>(cur())) { … … 950 938 951 939 if (AtChar<C,'>'>(cur())){ 952 Advance(1); 953 int rootID = model_info->GlobalElementTable[nameID]; 940 Advance(1); 954 941 955 942 CRE_Seq * rslt = new CRE_Seq(); 956 rslt->subCMs.push_back(new CRE_Name( rootID));943 rslt->subCMs.push_back(new CRE_Name(nameID)); 957 944 CM_RegExp * cre = new CM_RegExp(); 958 945 cre->content_re = rslt; … … 1139 1126 Advance(5); 1140 1127 cm = new CM_Empty(); 1141 model_info->ContentModelData[ elemID] = cm;1128 model_info->ContentModelData[nameID] = cm; 1142 1129 } 1143 1130 else if (at_ANY<C>(cur())) { 1144 1131 Advance(3); 1145 1132 cm = new CM_Any(); 1146 model_info->ContentModelData[ elemID] = cm;1133 model_info->ContentModelData[nameID] = cm; 1147 1134 } 1148 1135 else { … … 1152 1139 if (at_PCDATA<C>(cur())){ 1153 1140 cm = Parse_RemainingMixed(); 1154 model_info->ContentModelData[ elemID] = cm;1141 model_info->ContentModelData[nameID] = cm; 1155 1142 } 1156 1143 else{ … … 1172 1159 cre -> transition_map = transition_map; 1173 1160 1174 model_info->ContentModelData[ elemID] = cre;1161 model_info->ContentModelData[nameID] = cre; 1175 1162 cm = cre; 1176 1163 } … … 1204 1191 ScanTo(NonWS); 1205 1192 int nameID = Parse_Name(); 1206 int elemID = model_info->getOrInsertGlobalElement(nameID); 1207 r->elements[elemID] = ++k; 1193 r->elements[nameID] = ++k; 1208 1194 ScanTo(NonWS); 1209 1195 } … … 1294 1280 else{ 1295 1281 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); 1298 1283 1299 1284 if (AtChar<C,'?'>(cur())) { … … 1841 1826 } 1842 1827 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 }1867 1828 /* Parse a valid start or empty element tag. */ 1868 1829 template <CodeUnit_Base C> … … 1970 1931 } while (1); 1971 1932 } 1972 return elemID;1933 return nameID; 1973 1934 } 1974 1935 … … 1976 1937 inline int ParsingEngine<C>::Parse_ValidElement() { 1977 1938 bool is_emptyStartTag = false; 1978 int elemID = Parse_ValidStartTag(is_emptyStartTag);1939 int nameID = Parse_ValidStartTag(is_emptyStartTag); 1979 1940 #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); 1981 1942 #endif 1982 ContentModel * cm = model_info->ContentModelData[ elemID];1943 ContentModel * cm = model_info->ContentModelData[nameID]; 1983 1944 switch (cm->cm_type) { 1984 1945 case cm_Empty: 1985 1946 if (!is_emptyStartTag) { 1986 1947 if (at_EndTag_Start<C>(cur())) { 1987 if (Parse_ValidEndTag()!=elemID) Validity_Error(vErr_elementvalid); 1988 // Parse_EndTag(); 1948 Parse_WF_EndTag(nameID); 1989 1949 } 1990 1950 else { … … 1996 1956 if (!is_emptyStartTag) { 1997 1957 Parse_AnyContent(); 1998 if (Parse_ValidEndTag()!=elemID) Validity_Error(vErr_elementvalid);1958 Parse_WF_EndTag(nameID); 1999 1959 } 2000 1960 break; … … 2002 1962 if (!is_emptyStartTag) { 2003 1963 Parse_MixedContent(((CM_Mixed *) cm)->elements); 2004 if (Parse_ValidEndTag()!=elemID) Validity_Error(vErr_elementvalid);1964 Parse_WF_EndTag(nameID); 2005 1965 } 2006 1966 break; … … 2010 1970 if (!is_emptyStartTag) { 2011 1971 content_state = Parse_ValidContent(cre); 2012 if (Parse_ValidEndTag()!=elemID) Validity_Error(vErr_elementvalid);1972 Parse_WF_EndTag(nameID); 2013 1973 } 2014 1974 if (cre->transition_map[content_state][0]==0) { … … 2016 1976 } 2017 1977 } 2018 return elemID;1978 return nameID; 2019 1979 } 2020 1980 … … 2030 1990 } 2031 1991 else if (at_ElementTag_Start<C>(cur())) { 2032 int elemID = Parse_ValidElement();1992 int nameID = Parse_ValidElement(); 2033 1993 #ifdef DEBUG 2034 1994 printf("Content model state transition %i", cur_state); 2035 1995 #endif 2036 cur_state = cre->transition_map[cur_state][ elemID];1996 cur_state = cre->transition_map[cur_state][nameID]; 2037 1997 #ifdef DEBUG 2038 1998 printf("-> %i\n", cur_state); … … 2069 2029 if (at_ElementTag_Start<C>(cur())) { 2070 2030 text_if_nonnull_action(); 2071 int elemID = Parse_ValidElement();2031 int nameID = Parse_ValidElement(); 2072 2032 } 2073 2033 else if (at_EndTag_Start<C>(cur())) { … … 2124 2084 if (at_ElementTag_Start<C>(cur())) { 2125 2085 text_if_nonnull_action(); 2126 int elemID = Parse_ValidElement();2127 if (elems[ elemID] == 0) {2086 int nameID = Parse_ValidElement(); 2087 if (elems[nameID] == 0) { 2128 2088 Validity_Error(vErr_elementvalid); 2129 2089 } … … 2188 2148 inline void ParsingEngine<C>::Parse_DocumentContent() { 2189 2149 #ifdef VALIDATION 2150 printf("Validation Mode On!\n"); 2190 2151 int final_state = Parse_ValidContent(model_info->rootModel); 2191 2152 if (model_info->rootModel->transition_map[final_state][0]==0) { -
trunk/src/engine.h
r134 r136 139 139 140 140 int Parse_ValidStartTag(bool& is_empty); 141 int Parse_ValidEndTag();142 141 143 142 int Parse_Name();
Note: See TracChangeset
for help on using the changeset viewer.