1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2024-12-25 23:21:26 +03:00

another small change on the algorithm for the elimination of epsilon

* xmlregexp.c: another small change on the algorithm for the
  elimination of epsilon transitions, should help on #362989 too
Daniel
This commit is contained in:
Daniel Veillard 2006-11-02 10:28:04 +00:00
parent 0e05f4c2e0
commit fcd18ff8f7
2 changed files with 11 additions and 22 deletions

View File

@ -1,3 +1,8 @@
Thu Nov 2 11:29:17 CET 2006 Daniel Veillard <daniel@veillard.com>
* xmlregexp.c: another small change on the algorithm for the
elimination of epsilon transitions, should help on #362989 too
Wed Nov 1 16:33:10 CET 2006 Daniel Veillard <daniel@veillard.com>
* tree.c: applied documentation patches from Markus Keim

View File

@ -1737,11 +1737,6 @@ xmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) {
#ifdef DEBUG_REGEXP_GRAPH
printf("Changed transition %d on %d to go to %d\n",
j, tmp->no, newto);
#endif
#if 0
tmp->trans[j].to = newto;
xmlRegStateAddTransTo(ctxt, ctxt->states[newto],
tmp->no);
#endif
tmp->trans[j].to = -1;
xmlRegStateAddTrans(ctxt, tmp, tmp->trans[j].atom,
@ -1751,20 +1746,6 @@ xmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) {
}
}
}
#if 0
for (i = 0;i < ctxt->nbStates;i++) {
tmp = ctxt->states[i];
for (j = 0;j < tmp->nbTrans;j++) {
if (tmp->trans[j].to == statenr) {
tmp->trans[j].to = newto;
#ifdef DEBUG_REGEXP_GRAPH
printf("Changed transition %d on %d to go to %d\n",
j, tmp->no, newto);
#endif
}
}
}
#endif
if (state->type == XML_REGEXP_FINAL_STATE)
ctxt->states[newto]->type = XML_REGEXP_FINAL_STATE;
/* eliminate the transition completely */
@ -1809,11 +1790,14 @@ xmlFAEliminateEpsilonTransitions(xmlRegParserCtxtPtr ctxt) {
has_epsilon = 0;
/*
* build the completed transitions bypassing the epsilons
* Build the completed transitions bypassing the epsilons
* Use a marking algorithm to avoid loops
* mark sink states too.
* Mark sink states too.
* Process from the latests states backward to the start when
* there is long cascading epsilon chains this minimize the
* recursions and transition compares when adding the new ones
*/
for (statenr = 0;statenr < ctxt->nbStates;statenr++) {
for (statenr = ctxt->nbStates - 1;statenr >= 0;statenr--) {
state = ctxt->states[statenr];
if (state == NULL)
continue;