Mercurial > hg > Applications > Grep
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 } |