Mercurial > hg > Applications > Grep
comparison c/regexParser/subsetConstraction.cc @ 156:b5ecfc008bcf pairPro
impl charClassMerge(not working)
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 18 Dec 2015 17:59:16 +0900 |
parents | 6cd0141bed6c |
children | dcd751ba7103 |
comparison
equal
deleted
inserted
replaced
155:6cd0141bed6c | 156:b5ecfc008bcf |
---|---|
12 // 重なっているccの領域を分割する | 12 // 重なっているccの領域を分割する |
13 // 必要ならばnextStateを重ねあわせる | 13 // 必要ならばnextStateを重ねあわせる |
14 // 変更があった場合は新しくリストを作って返す | 14 // 変更があった場合は新しくリストを作って返す |
15 if (end < cc->cond.range.begin ) { // 1 | 15 if (end < cc->cond.range.begin ) { // 1 |
16 if (cc->left) { | 16 if (cc->left) { |
17 return createCharClassRange(cc->begin,cc->end,charClassMerge(cc->left,begin,end,nextState),cc->right); | 17 return createCharClassRange(cc->cond.range.begin,cc->cond.range.end,charClassMerge(cc->left,begin,end,nextState),cc->right); |
18 } else { | 18 } else { |
19 CharClassPtr cc1 = createCharClassRange(begin,end,NULL,cc); | 19 CharClassPtr cc1 = createCharClassRange(begin,end,NULL,cc); |
20 cc1->nextState = nextState; | 20 cc1->nextState = nextState; |
21 return cc1; | 21 return cc1; |
22 } | 22 } |
26 cc1 = charClassMerge(cc->left,begin,end-1,nextState); | 26 cc1 = charClassMerge(cc->left,begin,end-1,nextState); |
27 } else { | 27 } else { |
28 cc1 = createCharClassRange(begin,end-1,NULL,NULL); | 28 cc1 = createCharClassRange(begin,end-1,NULL,NULL); |
29 cc1->nextState = nextState; | 29 cc1->nextState = nextState; |
30 } | 30 } |
31 if (cc->begin == cc->end) { | 31 if (cc->cond.range.begin == cc->cond.range.end) { |
32 CharClassPtr cc2 = createCharClassRange(cc->begin,cc->end,cc1,cc->right); | 32 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc1,cc->right); |
33 cc2->nextState = cc->nextState | nextState; | 33 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; |
34 return cc2; | 34 return cc2; |
35 } | 35 } |
36 CharClassPtr cc3; | 36 CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin+1,cc->cond.range.end,cc->left,cc->right); |
37 createCharClassRange(cc->begin+1,cc->end,cc->left,cc->end); | |
38 cc3->nextState = cc->nextState; | 37 cc3->nextState = cc->nextState; |
39 CharClassPtr cc2 = createCharClassRange(cc->begin,cc->begin,cc1,cc3); | 38 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.begin,cc1,cc3); |
40 cc2->nextState = cc->nextState | nextState; | 39 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; |
41 return cc2; | 40 return cc2; |
42 } else if (end < cc->cond.range.end) { | 41 } else if (end < cc->cond.range.end) { |
43 if (begin < cc->cond.range.begin) { // 3 | 42 if (begin < cc->cond.range.begin) { // 3 |
44 CharClassPtr cc1; | 43 CharClassPtr cc1; |
45 if (cc->left) { | 44 if (cc->left) { |
46 cc1 = charClassMerge(cc->left,begin,cc->begin-1,nextState); | 45 cc1 = charClassMerge(cc->left,begin,cc->cond.range.begin-1,nextState); |
47 } else { | 46 } else { |
48 cc1 = createCharClassRange(begin,cc->begin-1,NULL,NULL); | 47 cc1 = createCharClassRange(begin,cc->cond.range.begin-1,NULL,NULL); |
49 cc1->nextState = nextState; | 48 cc1->nextState = nextState; |
50 } | 49 } |
51 CharClassPtr cc3 = createCharClassRange(end+1,cc->end,cc->left,cc->right); | 50 CharClassPtr cc3 = createCharClassRange(end+1,cc->cond.range.end,cc->left,cc->right); |
52 cc3->nextState = cc->nextState; | 51 cc3->nextState = cc->nextState; |
53 CharClassPtr cc2 = createCharClassRange(cc->begin,end,cc1,cc3); | 52 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,end,cc1,cc3); |
54 cc2->nextState = cc->nextState | nextState; | 53 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; |
55 return cc2; | 54 return cc2; |
56 } | 55 } |
57 if (begin == cc->cond.range.begin) { // 6 | 56 if (begin == cc->cond.range.begin) { // 6 |
58 CharClassPtr cc2 = createCharClassRange(end,cc->end,NULL,cc->right); | 57 CharClassPtr cc2 = createCharClassRange(end,cc->cond.range.end,NULL,cc->right); |
59 cc2->nextState = cc->nextState; | 58 cc2->nextState = cc->nextState; |
60 CharClassPtr cc1 = createCharClassRange(begin,end,cc->left,cc2); | 59 CharClassPtr cc1 = createCharClassRange(begin,end,cc->left,cc2); |
61 cc1->nextState = cc->nextState | nextState; | 60 cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; |
62 return cc1; | 61 return cc1; |
63 } | 62 } |
64 // 9 | 63 // 9 |
65 CharClassPtr cc2 = createCharClassRange(cc->begin,begin-1,cc->left,NULL); | 64 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL); |
66 cc2->nextState = cc1->nextState; | 65 cc2->nextState = cc2->nextState; |
67 CharClassPtr cc3 = createCharClassRange(end+1,cc->end,NULL,cc->right); | 66 CharClassPtr cc3 = createCharClassRange(end+1,cc->cond.range.end,NULL,cc->right); |
68 cc3->nextState = cc->nextState; | 67 cc3->nextState = cc->nextState; |
69 CharClassPtr cc1 = createCharClassRange(begin,end,cc2,cc3); | 68 CharClassPtr cc1 = createCharClassRange(begin,end,cc2,cc3); |
70 cc1->nextState = cc->nextState | nextState; | 69 cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; |
71 return cc1; | 70 return cc1; |
72 } else if (end == cc->cond.range.end) { | 71 } else if (end == cc->cond.range.end) { |
73 if (begin == cc->cond.range.begin) { // 7 | 72 if (begin == cc->cond.range.begin) { // 7 |
74 CharClassPtr cc1 = createCharClassRange(begin,end,cc->left,cc->right); | 73 CharClassPtr cc1 = createCharClassRange(begin,end,cc->left,cc->right); |
75 cc1->nextState = cc->nextState | nextState; | 74 cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; |
76 return cc1; | 75 return cc1; |
77 } else if (begin < cc->cond.range.begin) { // 4 | 76 } else if (begin < cc->cond.range.begin) { // 4 |
78 CharClassPtr cc1; | 77 CharClassPtr cc1; |
79 if (cc->left) { | 78 if (cc->left) { |
80 cc1 = charClassMerge(cc->left,begin,end-1,nextState); | 79 cc1 = charClassMerge(cc->left,begin,cc->cond.range.begin-1,nextState); |
81 } else { | 80 } else { |
82 cc1 = createCharClassRange(begin,end-1,NULL,NULL); | 81 cc1 = createCharClassRange(begin,cc->cond.range.begin-1,NULL,NULL); |
83 cc1->nextState = nextState; | 82 cc1->nextState = nextState; |
84 } | 83 } |
85 CharClassPtr cc3 = createCharClassRange(end+1,cc->end,cc1,cc->right); | 84 CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,end,cc1,cc->right); |
86 cc3->nextState = cc->nextState | nextState; | 85 cc3->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; |
87 return cc3; | 86 return cc3; |
88 } | 87 } |
89 // 10 | 88 // 10 |
90 CharClassPtr cc2 = createCharClassRange(begin,cc->cond.range.end,NULL,cc->right); | 89 CharClassPtr cc2 = createCharClassRange(begin,cc->cond.range.end,NULL,cc->right); |
91 cc2->nextState = cc->nextState | nextState; | 90 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; |
92 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,begin-1,NULL,NULL); | 91 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,begin-1,NULL,NULL); |
93 cc1->nextState = cc->nextState; | 92 cc1->nextState = cc->nextState; |
94 return cc1; | 93 return cc1; |
95 | |
96 } | 94 } |
97 if (begin > cc->cond.range.end ) { // 13 | 95 if (begin > cc->cond.range.end ) { // 13 |
98 if (cc->right) { | 96 if (cc->right) { |
99 return createCharClassRange(cc->begin,cc->end,cc->left,charClassMerge(cc->right,begin,end,nextState)); | 97 return createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,charClassMerge(cc->right,begin,end,nextState)); |
100 } else { | 98 } else { |
101 CharClassPtr cc1 = createCharClassRange(begin,end,cc,NULL); | 99 CharClassPtr cc1 = createCharClassRange(begin,end,cc,NULL); |
102 cc1->nextState = nextState; | 100 cc1->nextState = nextState; |
103 return cc1; | 101 return cc1; |
104 } | 102 } |
105 } | 103 } |
106 if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { | 104 if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { |
107 if (end > cc->cond.range.end) { | 105 if (end > cc->cond.range.end) { |
108 if (begin == cc->cond.range.begin) { // 8 | 106 if (begin == cc->cond.range.begin) { // 8 |
109 CharClassPtr cc1; | 107 CharClassPtr cc1; |
110 if (cc->left) { | 108 if (cc->right) { |
111 cc1 = charClassMerge(cc->left,begin,end-1,nextState); | 109 cc1 = charClassMerge(cc->right,begin,cc->cond.range.end,nextState); |
112 } else { | 110 } else { |
113 cc1 = createCharClassRange(begin,end-1,NULL,NULL); | 111 cc1 = createCharClassRange(begin,cc->cond.range.end,NULL,NULL); |
114 cc1->nextState = nextState; | 112 cc1->nextState = nextState; |
115 } | 113 } |
116 CharClassPtr cc3 = createCharClassRange(end+1,cc->end,cc1,cc->right); | 114 CharClassPtr cc3 = createCharClassRange(cc->cond.range.end+1,end,cc->left,cc1); |
117 cc3->nextState = cc->nextState | nextState; | 115 cc3->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; |
118 return cc3; | 116 return cc3; |
119 } | 117 } |
120 // 11 | 118 |
121 cc->cond.range.end = end; // 11,8 | 119 if (begin > cc->cond.range.begin) { // 11 |
122 return cc; | 120 CharClassPtr cc1; |
121 if (cc->right) { | |
122 cc1 = charClassMerge(cc->right,cc->cond.range.end+1,end,nextState); | |
123 } else { | |
124 cc1 = createCharClassRange(cc->cond.range.end+1,end,NULL,NULL); | |
125 cc1->nextState = nextState; | |
126 } | |
127 CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,cc->right); | |
128 cc3->nextState = cc->nextState; | |
129 CharClassPtr cc2 = createCharClassRange(begin,cc->cond.range.end,cc3,cc1); | |
130 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
131 return cc2; | |
132 } | |
123 } | 133 } |
124 // 12 | 134 // 12 |
125 CharClassPtr cc1; | 135 if (begin == cc->cond.range.end) { |
126 if (cc->right) { | 136 CharClassPtr cc1; |
127 cc1 = charClassMerge(cc->right,begin+1,end,nextState); | 137 if (cc->right) { |
128 } else { | 138 cc1 = charClassMerge(cc->right,begin+1,end,nextState); |
129 cc1 = createCharClassRange(begin+1,end,NULL,NULL); | 139 } else { |
130 cc1->nextState = nextState; | 140 cc1 = createCharClassRange(begin+1,end,NULL,NULL); |
131 } | 141 cc1->nextState = nextState; |
132 if (cc->begin == cc->end) { | 142 } |
133 CharClassPtr cc2 = createCharClassRange(cc->begin,cc->end,cc->left,cc1); | 143 if (cc->cond.range.begin == cc->cond.range.end) { |
134 cc2->nextState = cc->nextState | nextState; | 144 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc1,cc->right); |
145 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
146 return cc2; | |
147 } | |
148 CharClassPtr cc3; | |
149 createCharClassRange(cc->cond.range.begin,cc->cond.range.end-1,cc->left,cc->right); | |
150 cc3->nextState = cc->nextState; | |
151 CharClassPtr cc2 = createCharClassRange(cc->cond.range.end,cc->cond.range.end,cc1,cc3); | |
152 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
135 return cc2; | 153 return cc2; |
136 } | 154 } |
137 CharClassPtr cc3 = createCharClassRange(cc->begin,cc->end-1,NULL,cc->right); | 155 |
156 } else if (begin < cc->cond.range.begin) { // 5 | |
157 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL); | |
158 cc2->nextState = cc1->nextState; | |
159 CharClassPtr cc3 = createCharClassRange(end+1,cc->cond.range.end,NULL,cc->right); | |
138 cc3->nextState = cc->nextState; | 160 cc3->nextState = cc->nextState; |
139 CharClassPtr cc2 = createCharClassRange(cc->cond.range.end,cc->cond.range.end,cc1,cc3); | 161 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc2,cc3); |
140 cc2->nextState = cc->nextState | nextState; | 162 cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; |
141 return cc2; | 163 return cc1; |
142 } else if (begin < cc->cond.range.begin) { // 5 | |
143 cc->cond.range.begin = begin; | |
144 cc->cond.range.end = end; | |
145 } else { | 164 } else { |
146 printf("charClassMerge Error : begin %lu end %lu cc->begin %lu cc->end %lu\n", begin,end,cc->cond.range.begin,cc->cond.range.end); | 165 printf("charClassMerge Error : begin %lu end %lu cc->begin %lu cc->end %lu\n", begin,end,cc->cond.range.begin,cc->cond.range.end); |
147 } | 166 } |
148 return cc; | 167 return cc; |
149 } | 168 } |