comparison c/regexParser/subsetConstraction.cc @ 153:e2e717fbeb2f pairPro

fix
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Fri, 18 Dec 2015 14:02:41 +0900
parents 1c9e8ba64f6a
children 1fad21fd6028
comparison
equal deleted inserted replaced
152:1c9e8ba64f6a 153:e2e717fbeb2f
12 CharClassPtr charClassMerge(CharClassPtr cc,unsigned long begin, unsigned long end, BitVector nextState) { 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 (end < cc->cond.range.begin ) { // 1 16 if (end < cc->cond.range.begin ) { // 1
17 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right); 17 CharClassPtr cc1 = charClassMerge(cc,cc->cond.range.begin,cc->cond.range.end,nextState);
18 if (cc->left) { 18 if (cc->left) {
19 cc1->left = charClassMerge(cc->left,begin,end,nextState); 19 cc1->left = charClassMerge(cc->left,begin,end,nextState);
20 return cc1; 20 return cc1;
21 } else { 21 } else {
22 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); 22 CharClassPtr cc2 = charClassMerge(begin,end,0,0);
23 cc2->nextState = nextState; 23 cc2->nextState = nextState;
24 cc1->left = cc2; 24 cc1->left = cc2;
25 return cc1; 25 return cc1;
26 } 26 }
27 } else if (end == cc->cond.range.begin ) { // 2 27 } else if (end == cc->cond.range.begin ) { // 2
34 return cc; 34 return cc;
35 } else if (begin > cc->cond.range.end ) { // 13 35 } else if (begin > cc->cond.range.end ) { // 13
36 if (cc->right) { 36 if (cc->right) {
37 cc->right = charClassMerge(cc->right,begin,end); 37 cc->right = charClassMerge(cc->right,begin,end);
38 } else { 38 } else {
39 cc->right = createCharClassRange(begin,end,0,0); 39 cc->right = charClassMerge(begin,end,0,0);
40 } 40 }
41 return cc; 41 return cc;
42 } 42 }
43 if (cc->right) { 43 if (cc->right) {
44 CharClassPtr right = cc->right; 44 CharClassPtr right = cc->right;
46 free(cc); 46 free(cc);
47 return charClassMerge(right,begin,end); 47 return charClassMerge(right,begin,end);
48 } 48 }
49 if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { // 12 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 50 if (end > cc->cond.range.end) cc->cond.range.end = end; // 11,8
51 } else if (begin < cc->cond.range.begin) { // 6 51 } else if (begin < cc->cond.range.begin) { // 5
52 cc->cond.range.begin = begin; 52 cc->cond.range.begin = begin;
53 cc->cond.range.end = end; 53 cc->cond.range.end = end;
54 } else { 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); 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 } 56 }
57 return cc; 57 return cc;
58 } 58 }
59 59
60 void printTransition(TransitionPtr ts) {
61
62 }
63
64 TGValue generateTransition(NodePtr n,TransitionGenerator tg) { 60 TGValue generateTransition(NodePtr n,TransitionGenerator tg) {
65 if (n->tokenType == '+') { 61 if (n->tokenType == '+') {
66 TGValue tgv = generateTransition(n->left,tg); 62 TGValue tgv = generateTransition(n->left,tg);
67 if (tgv.asterisk) { 63 if (tgv.asterisk) {
68 TGValue tgv1 = generateTransition(n->right,tg); 64 TGValue tgv1 = generateTransition(n->right,tg);
69 tgv.ts->state->bitContainer |= tgv1.ts->state->bitContainer; 65 tgv.ts->nextState->bitContainer |= tgv1.ts->nextState->bitContainer;
70 return tgv; 66 return tgv;
71 } 67 }
72 bitSet(tgv.ts->state,n->right->nodeNumber); 68 TGValue tgv1 = generateTransition(n->right,tg);
69 tgv.ts->nextState = tgv1.ts->nextState;
73 return tgv; 70 return tgv;
74 } else if (n->tokenType == '|') { 71 } else if (n->tokenType == '|') {
75 72 TGValue tgv = generateTransition(n->left,tg);
73 TGValue tgv1 = generateTransition(n->right,tg);
74 tgv.ts = appendTransition(tgv.ts,tgv1.ts);
75 return tgv;
76 } else if (n->tokenType == '*') { 76 } else if (n->tokenType == '*') {
77 77 TGValue tgv = generateTransition(n->left,tg);
78 tgv.asterisk = true;
79 return tgv;
78 } else if (n->tokenType == 'c'){ 80 } else if (n->tokenType == 'c'){
79 81
80 } else if (n->tokenType == 'a'){ 82 } else if (n->tokenType == 'a'){
81 83 TGValue tgv;
84 tgv.ts = (TransitionPtr)malloc(sizeof(Transition));
85 tgv.ts->condition = n->cc;
86 tgv.ts->nextState = (BitVectorPtr)malloc(sizeof(BitVector));
87 bitSet(tgv.ts->nextState,n->nodeNumber);
88 tg.ts = appendTransition(tg.ts,tgv.ts);
89 return tgv;
82 } else { 90 } else {
83 // error 91 // error
84 } 92 }
85 } 93 }
86 94
95 void printTransitionList(TransitionPtr ts) {
96 for (;ts;ts = ts->next) {
97 printf("\n");
98 }
99 }
100
87 TransitionGenerator generateTransitionList(NodePtr n) { 101 TransitionGenerator generateTransitionList(NodePtr n) {
88 TransitionGenerator tg; 102 TransitionGenerator tg;
103 tg.ts = (TransitionPtr)malloc(sizeof(Transition));
89 generateTransition(n,tg); 104 generateTransition(n,tg);
105 printTransitionList(tg.ts);
90 return tg; 106 return tg;
91 } 107 }