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 }