Mercurial > hg > Applications > Grep
comparison c/regexParser/subsetConstraction.cc @ 152:1c9e8ba64f6a pairPro
add implement charclassMerge (not working)
author | masa |
---|---|
date | Wed, 16 Dec 2015 17:28:53 +0900 |
parents | d1ebba6e117a |
children | e2e717fbeb2f |
comparison
equal
deleted
inserted
replaced
151:6ba059ce9109 | 152:1c9e8ba64f6a |
---|---|
7 CharClassPtr createCharClassWord(unsigned char *w, CharClassPtr cc1, CharClassPtr cc2) { | 7 CharClassPtr createCharClassWord(unsigned char *w, CharClassPtr cc1, CharClassPtr cc2) { |
8 CharClassPtr cc = NEW(CharClass); | 8 CharClassPtr cc = NEW(CharClass); |
9 return cc1; | 9 return cc1; |
10 } | 10 } |
11 | 11 |
12 CharClassPtr charClassMerge(CharClassPtr src, CharClassPtr add) { | 12 CharClassPtr charClassMerge(CharClassPtr cc,unsigned long begin, unsigned long end, BitVector nextState) { |
13 // 重なっているccの領域を分割する | 13 // 重なっているccの領域を分割する |
14 // 必要ならばnextStateを重ねあわせる | 14 // 必要ならばnextStateを重ねあわせる |
15 // 変更があった場合は新しくリストを作って返す | 15 // 変更があった場合は新しくリストを作って返す |
16 if (src->type == 'a') { | 16 if (end < cc->cond.range.begin ) { // 1 |
17 if (add->type == 'a') { | 17 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right); |
18 if (src->cond.w.word[0] > add->cond.w.word[0]) { | 18 if (cc->left) { |
19 // add のほうが小さいので小さい順のccをつくる | 19 cc1->left = charClassMerge(cc->left,begin,end,nextState); |
20 CharClassPtr left = charClassMerge(add->left,src); | 20 return cc1; |
21 return createCharClassWord(add->cond.w.word, left, add->right); | 21 } else { |
22 } else { | 22 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); |
23 | 23 cc2->nextState = nextState; |
24 } | 24 cc1->left = cc2; |
25 } else if (add->type == 'c') { | 25 return cc1; |
26 if (src->cond.w.word[0] < add->cond.range.begin) { | |
27 | |
28 } else if (src->cond.w.word[0] < add->cond.range.end) { | |
29 | |
30 } | |
31 } | 26 } |
32 } else if (src->type == 'c') { | 27 } else if (end == cc->cond.range.begin ) { // 2 |
33 | 28 cc->cond.range.begin = begin; |
29 return cc; | |
30 } else if (end <= cc->cond.range.end) { // 3,4,6,7,9,10 | |
31 if (begin < cc->cond.range.begin) { // 3,4 | |
32 cc->cond.range.begin = begin; | |
33 } | |
34 return cc; | |
35 } else if (begin > cc->cond.range.end ) { // 13 | |
36 if (cc->right) { | |
37 cc->right = charClassMerge(cc->right,begin,end); | |
38 } else { | |
39 cc->right = createCharClassRange(begin,end,0,0); | |
40 } | |
41 return cc; | |
34 } | 42 } |
43 if (cc->right) { | |
44 CharClassPtr right = cc->right; | |
45 begin = cc->cond.range.begin; | |
46 free(cc); | |
47 return charClassMerge(right,begin,end); | |
48 } | |
49 if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { // 12 | |
50 if (end > cc->cond.range.end) cc->cond.range.end = end; // 11,8 | |
51 } else if (begin < cc->cond.range.begin) { // 6 | |
52 cc->cond.range.begin = begin; | |
53 cc->cond.range.end = end; | |
54 } else { | |
55 printf("charClassMerge Error : begin %lu end %lu cc->begin %lu cc->end %lu\n", begin,end,cc->cond.range.begin,cc->cond.range.end); | |
56 } | |
57 return cc; | |
35 } | 58 } |
36 | 59 |
37 void printTransition(TransitionPtr ts) { | 60 void printTransition(TransitionPtr ts) { |
38 | 61 |
39 } | 62 } |