Mercurial > hg > Applications > Grep
diff regexParser/regexParser.cc @ 300:3e78631a6222
remove ragne list
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 03 Feb 2016 13:56:01 +0900 |
parents | 2f3e7bba038e |
children | 1188debbef10 |
line wrap: on
line diff
--- a/regexParser/regexParser.cc Wed Feb 03 13:11:10 2016 +0900 +++ b/regexParser/regexParser.cc Wed Feb 03 13:56:01 2016 +0900 @@ -45,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->cond.range.next = NULL; return cc; } @@ -76,8 +75,11 @@ */ CharClassPtr insertCharClass(CharClassPtr cc, unsigned long begin, unsigned long end) { + if (begin>end) { + unsigned long tmp = begin; begin = end; end = tmp; + } if (cc == NULL) { - createCharClassRange(begin,end,0,0,0); + return createCharClassRange(begin,end,0,0,0); } if (end < cc->cond.range.begin ) { // 1 if (cc->left) { @@ -122,38 +124,25 @@ // <charClass> ::= '['<literal>'-'<literal>']' static NodePtr charClass(RegexInfoPtr ri) { - CharClassPtr cc = NEW(CharClass); + CharClassPtr cc = NULL; NodePtr n = createNode(ri,'c',cc,0,0); - cc->type = 'r'; - cc->nextState.bitContainer = 0; - cc->left = NULL; - cc->right = NULL; - cc->stateNum = 0; - RangeListPtr rangeList = &cc->cond.range; - rangeList->begin = *ri->ptr; - rangeList->end = *ri->ptr; - rangeList->next = NULL; + unsigned char begin = *ri->ptr; + unsigned char end = *ri->ptr; for (ri->ptr++; *ri->ptr && *ri->ptr != ']'; ri->ptr++) { if (*ri->ptr == '-') { - rangeList->end = *(ri->ptr + 1); + end = *(ri->ptr + 1); + cc = insertCharClass(cc, begin, end); ri->ptr++; continue; + } else { + cc = insertCharClass(cc, begin, end); } if (ri->ptr[0] == 0 || ri->ptr[0] == ']') break; - rangeList->next = NEW(RangeList); - rangeList = rangeList->next; - rangeList->begin = *ri->ptr; - rangeList->end = *ri->ptr; - rangeList->next = NULL; + begin = *ri->ptr; + end = *ri->ptr; } - - RangeListPtr r = cc->cond.range.next; - cc->cond.range.next = 0; - for (; r; r = r->next) { - cc = insertCharClass(cc, r->begin, r->end); - } - cc->cond.range.next = 0; + n->cc = insertCharClass(cc, begin, end); // TODO literal support // merge rangeList here if (*ri->ptr) ri->ptr++;