comparison regexParser/subsetConstraction.cc @ 171:684363c44d6f pairPro

remove some warning and error (not working)
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Mon, 21 Dec 2015 17:37:41 +0900
parents de2438d4146a
children 540fc12871d9
comparison
equal deleted inserted replaced
170:de2438d4146a 171:684363c44d6f
4 #include "subsetConstraction.h" 4 #include "subsetConstraction.h"
5 5
6 CharClassPtr createCharClassWord(unsigned char *w, CharClassPtr cc1, CharClassPtr cc2) { 6 CharClassPtr createCharClassWord(unsigned char *w, CharClassPtr cc1, CharClassPtr cc2) {
7 CharClassPtr cc = NEW(CharClass); 7 CharClassPtr cc = NEW(CharClass);
8 return cc; 8 return cc;
9 } 9 }
10 10
11 CharClassPtr createCharClassRange(unsigned long begin, unsigned long end,unsigned long state, CharClassPtr left, CharClassPtr right) { 11 CharClassPtr createCharClassRange(unsigned long begin, unsigned long end,unsigned long state, CharClassPtr left, CharClassPtr right) {
12 CharClassPtr cc = NEW(CharClass); 12 CharClassPtr cc = NEW(CharClass);
13 cc->type = 'r'; 13 cc->type = 'r';
14 cc->cond.range.begin = begin; 14 cc->cond.range.begin = begin;
112 return cc; 112 return cc;
113 } 113 }
114 114
115 CharClassWalkerPtr findLeftMost(CharClassPtr next,CharClassWalker walk) { 115 CharClassWalkerPtr findLeftMost(CharClassPtr next,CharClassWalker walk) {
116 while (next->left) { 116 while (next->left) {
117 CharClassStackPtr ts = NEW(CharClassStack); 117 CharClassStackPtr ccs = NEW(CharClassStack);
118 ts->next = walk->stack; 118 ccs->next = &walk.stack;
119 ts->left = false; 119 ccs->left = false;
120 ts->cc = next; 120 ccs->cc = next;
121 walk->stack = ts; 121 walk.stack = *ccs;
122 next = next->left; 122 next = next->left;
123 } 123 }
124 walk->next = next; 124 walk.next = next;
125 return walk; 125 return &walk;
126 } 126 }
127 127
128 CharClassWalkerPtr createCharClassWalker (CharClassPtr next) { 128 CharClassWalkerPtr createCharClassWalker (CharClassPtr next) {
129 CharClassWalkerPtr walk = NEW(CharClassWalker); 129 CharClassWalkerPtr walk = NEW(CharClassWalker);
130 walk->next = NULL; 130 walk->next = NULL;
131 if (!next) return walk; 131 if (!next) return walk;
132 if (!next->left) { 132 if (!next->left) {
133 walk->next = next; 133 walk->next = next;
134 return walk; 134 return walk;
135 } 135 }
136 walk->next = findLeftMost(next,walk); 136 walk = findLeftMost(next,*walk);
137 return walk; 137 return walk;
138 } 138 }
139 139
140 bool hasNext(CharClassWalkerPtr walk) { 140 bool hasNext(CharClassWalkerPtr walk) {
141 return walk->next != NULL; 141 return walk->next != NULL;
142 } 142 }
143 143
144 CharClassPtr getNext(CharClassWalkerPtr walk) { 144 CharClassPtr getNext(CharClassWalkerPtr walk) {
145 CharClassPtr current = walk->next; 145 CharClassPtr current = walk->next;
146 if (ts->left && current->right) { 146 if (walk->next->left && current->right) {
147 ts->left = true; 147 walk->stack.left = true;
148 CharClassPtr next = findLeftMost(current->right,walk); 148 CharClassPtr next = findLeftMost(current->right,*walk)->next;
149 walk->next = next; 149 walk->next = next;
150 } else { 150 } else {
151 TransitionPtr tsOld = ts; 151 TransitionPtr tsOld = ts;
152 ts = ts->next; 152 ts = ts->next;
153 free(tsOld); 153 free(tsOld);
158 } 158 }
159 return current; 159 return current;
160 } 160 }
161 161
162 TransitionPtr mergeTransition(TransitionPtr x,TransitionPtr y) { 162 TransitionPtr mergeTransition(TransitionPtr x,TransitionPtr y) {
163 CharClassWalkerPtr walk = createCharClassWalker(x); 163 CharClassWalkerPtr walk = createCharClassWalker(x->condition);
164 CharClassPtr ccy = y->condition; 164 CharClassPtr ccy = y->condition;
165 for (CharClassPtr cc = getNext(walk); hasNext(walk); cc=getNext(walk)) { 165 for (CharClassPtr cc = getNext(walk); hasNext(walk); cc=getNext(walk)) {
166 unsigned long begin = cc->range.cond.begin; 166 unsigned long begin = cc->cond.range.begin;
167 unsigned long end = cc->range.cond.end; 167 unsigned long end = cc->cond.range.end;
168 BitVectorPtr bi = cc->nextState; 168 BitVector bi = cc->nextState;
169 ccy = charClassMerge(ccy,begin,end,*bi); 169 ccy = charClassMerge(ccy,begin,end,bi);
170 } 170 }
171 TransitionPtr z = createTransition(ccy); 171 TransitionPtr z = createTransition(ccy);
172 free(walk); 172 free(walk);
173 return z; 173 return z;
174 } 174 }
175 175
176 TGValue generateTransition(NodePtr n,TransitionGenerator tg) { 176 TGValue generateTransition(NodePtr n,TransitionGenerator tg) {
177 TGValue tgv2; 177 TGValue tgv2;
178 if (n->tokenType == '+') { 178 if (n->tokenType == '+') {
179 TGValue tgv = generateTransition(n->right,tg); 179 TGValue tgv = generateTransition(n->right,tg);
180 TGValue tgv1 = generateTransition(n->left,tgv.tg); 180 TGValue tgv1 = generateTransition(n->left,tg);
181 if (tgv.asterisk) { 181 if (tgv.asterisk) {
182 tgv1.ts = mergeTransition(tgv.ts,tgv1.ts); 182 tgv1.ts = mergeTransition(tgv.ts,tgv1.ts);
183 return tgv1; 183 return tgv1;
184 } 184 }
185 return tgv; 185 return tgv;
186 } else if (n->tokenType == '|') { 186 } else if (n->tokenType == '|') {
187 TGValue tgv = generateTransition(n->left,tg); 187 TGValue tgv = generateTransition(n->left,tg);
188 TGValue tgv1 = generateTransition(n->right,tgv.tg); 188 TGValue tgv1 = generateTransition(n->right,tg);
189 tgv.tg = tgv1.tg; 189 tgv.tg = tgv1.tg;
190 tgv.ts = mergeTransition(tgv.ts,tgv1.ts); 190 tgv.ts = mergeTransition(tgv.ts,tgv1.ts);
191 tgv.asterisk |= tgv1.asterisk; 191 tgv.asterisk |= tgv1.asterisk;
192 return tgv; 192 return tgv;
193 } else if (n->tokenType == '*') { 193 } else if (n->tokenType == '*') {
199 return tgv2; 199 return tgv2;
200 } else if (n->tokenType == 'a'){ 200 } else if (n->tokenType == 'a'){
201 TGValue tgv; 201 TGValue tgv;
202 tgv.ts = (TransitionPtr)malloc(sizeof(Transition)); 202 tgv.ts = (TransitionPtr)malloc(sizeof(Transition));
203 tgv.ts->condition = n->cc; 203 tgv.ts->condition = n->cc;
204 tgv.ts->nextState = (BitVectorPtr)malloc(sizeof(BitVector)); 204 bitSet(&tgv.ts->condition->nextState,n->nodeNumber);
205 bitSet(tgv.ts->nextState,n->nodeNumber);
206 tg.ts = appendTransition(tg.ts,tgv.ts); 205 tg.ts = appendTransition(tg.ts,tgv.ts);
207 return tgv; 206 return tgv;
208 } else { 207 } else {
209 // error 208 // error
210 } 209 }