Mercurial > hg > Applications > Grep
diff regexParser/regexParser.cc @ 180:d97bcab546e8 pairPro
implement getNext
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 24 Dec 2015 17:56:28 +0900 |
parents | 6cf8252f3912 |
children | 7ae0a3070647 |
line wrap: on
line diff
--- a/regexParser/regexParser.cc Wed Dec 23 19:44:48 2015 +0900 +++ b/regexParser/regexParser.cc Thu Dec 24 17:56:28 2015 +0900 @@ -33,12 +33,8 @@ n->cc = cc; n->left = left; n->right = right; - if (n->tokenType == 'a' || n->tokenType == 'c') { - n->nodeNumber = ri->nodeNumber; - ri->nodeNumber++; - } else { - n->nodeNumber = SYNTAX_NODENUMBER; - } + n->nodeNumber = ri->stateNumber; + ri->stateNumber++; return n; } @@ -49,7 +45,6 @@ cc->cond.w.word = ri->tokenValue; cc->cond.w.length = ri->ptr - ri->tokenValue; cc->cond.range.begin = cc->cond.range.end = *ri->tokenValue; - cc->nextState = ri->current->bitSet; return cc; } @@ -79,15 +74,15 @@ 13. b--e */ -CharClassPtr insertCharClass(CharClassPtr cc, unsigned long begin, unsigned long end,BitVector nextState) { +CharClassPtr insertCharClass(CharClassPtr cc, unsigned long begin, unsigned long end) { if (cc == NULL) { - createCharClassRange(begin,end,nextState.bitContainer,0,0); + createCharClassRange(begin,end,0,0); } if (end < cc->cond.range.begin ) { // 1 if (cc->left) { - cc->left = insertCharClass(cc->left,begin,end,nextState); + cc->left = insertCharClass(cc->left,begin,end); } else { - cc->left = createCharClassRange(begin,end,nextState.bitContainer,0,0); + cc->left = createCharClassRange(begin,end,0,0); } return cc; } else if (end == cc->cond.range.begin ) { // 2 @@ -100,9 +95,9 @@ return cc; } else if (begin > cc->cond.range.end ) { // 13 if (cc->right) { - cc->right = insertCharClass(cc->right,begin,end,nextState); + cc->right = insertCharClass(cc->right,begin,end); } else { - cc->right = createCharClassRange(begin,end,nextState.bitContainer,0,0); + cc->right = createCharClassRange(begin,end,0,0); } return cc; } @@ -110,7 +105,7 @@ CharClassPtr right = cc->right; begin = cc->cond.range.begin; free(cc); - return insertCharClass(right,begin,end,nextState); + return insertCharClass(right,begin,end); } if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { // 12 if (end > cc->cond.range.end) cc->cond.range.end = end; // 11,8 @@ -154,10 +149,9 @@ RangeListPtr r = cc->cond.range.next; cc->cond.range.next = 0; for (; r; r = r->next) { - cc = insertCharClass(cc, r->begin, r->end,ri->current->bitState); + cc = insertCharClass(cc, r->begin, r->end); } - n->cc = ri->current->cc; // TODO literal support // merge rangeList here if (*ri->ptr) ri->ptr++; @@ -247,22 +241,12 @@ if (ri->tokenType == '*') { n = createNode(ri,'*',0,n,0); token(ri); - ri->asterisk = true; - ri->node = n; } return n; } RegexInfoPtr createRegexInfo (RegexInfoPtr ri) { ri->stateNumber++; - ri->asterisk = false; - ri->current = NEW(State); - ri->current->bitState.bitContainer = 0 - bitSet(ri.current->bitState,ri->stateNumber); - ri->current->next = ri->states; - ri->current->cc = NULL; - ri->current->node = NULL; - ri->states = ri->current; return ri; } @@ -275,28 +259,17 @@ if (ri->tokenType == '*') { n = createNode(ri,'*',0,n,0); token(ri); - ri->asterisk = true; - ri->node = n; return n; } else if (ri->tokenType == '|') { n = createNode(ri,'|',0,n,0); NodePtr n1 = regex(ri); n->right = n1; - n->node = n; } else if (ri->tokenType == ')') { return n; } else { n = createNode(ri,'+',0,n,0); - if (!ri->asterisk) { - StatePtr save = ri->current; - ri = createRegexInfo(ri); - NodePtr n1 = regexAtom(ri); - n->right = n1; - ri->current = save; - } else { - NodePtr n1 = regexAtom(ri); - n->right = n1; - } + NodePtr n1 = regexAtom(ri); + n->right = n1; } } return n;