Mercurial > hg > Applications > Grep
diff regexParser/regexParser.cc @ 308:1188debbef10
separate CharClass
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Feb 2016 12:45:45 +0900 |
parents | 3e78631a6222 |
children | a4484c02cba5 |
line wrap: on
line diff
--- a/regexParser/regexParser.cc Mon Feb 08 12:26:53 2016 +0900 +++ b/regexParser/regexParser.cc Mon Feb 08 12:45:45 2016 +0900 @@ -3,6 +3,7 @@ #include <string.h> #include <ctype.h> #include "regexParser.h" +#include "CharClass.h" static NodePtr charClass(RegexInfoPtr); static void token(RegexInfoPtr); @@ -37,90 +38,6 @@ return n; } -CharClassPtr createCharClassWord(RegexInfoPtr ri) { - CharClassPtr cc = NEW(CharClass); - cc->type = 'a'; - cc->left = NULL; - cc->right = NULL; - cc->cond.w.word = ri->tokenValue; - cc->cond.w.length = ri->ptr - ri->tokenValue; - cc->cond.range.begin = cc->cond.range.end = *ri->tokenValue; - return cc; -} - -/* - cond.range.begin cond.range.end - |----------------| - 1.b---e - 2.b------e - 3.b------------e - 4.b-----------------------e - 5.b----------------------------e - - |----------------| - 6. b---------e - 7. b----------------e - 8. b---------------------e - - |----------------| - 9. b-----e - 10. b--------e - 11. b-------------e - - |----------------| - 12. b-----e - - |----------------| - 13. b--e - - */ -CharClassPtr insertCharClass(CharClassPtr cc, unsigned long begin, unsigned long end) { - if (begin>end) { - unsigned long tmp = begin; begin = end; end = tmp; - } - if (cc == NULL) { - return createCharClassRange(begin,end,0,0,0); - } - if (end < cc->cond.range.begin ) { // 1 - if (cc->left) { - cc->left = insertCharClass(cc->left,begin,end); - } else { - cc->left = createCharClassRange(begin,end,0,0,0); - } - return cc; - } else if (end == cc->cond.range.begin ) { // 2 - cc->cond.range.begin = begin; - return cc; - } else if (end <= cc->cond.range.end) { // 3,4,6,7,9,10 - if (begin < cc->cond.range.begin) { // 3,4 - cc->cond.range.begin = begin; - } - return cc; - } else if (begin > cc->cond.range.end ) { // 13 - if (cc->right) { - cc->right = insertCharClass(cc->right,begin,end); - } else { - cc->right = createCharClassRange(begin,end,0,0,0); - } - return cc; - } - if (cc->right) { - CharClassPtr right = cc->right; - begin = cc->cond.range.begin; - free(cc); - 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 - } else if (begin < cc->cond.range.begin) { // 5 - cc->cond.range.begin = begin; - cc->cond.range.end = end; - } else { - printf("insertCharClass Error : begin %lu end %lu cc->begin %lu cc->end %lu\n", begin,end,cc->cond.range.begin,cc->cond.range.end); - } - return cc; -} - // <charClass> ::= '['<literal>'-'<literal>']' static NodePtr charClass(RegexInfoPtr ri) {