Mercurial > hg > Applications > Grep
annotate regexParser/grepWalk.cc @ 308:1188debbef10
separate CharClass
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Feb 2016 12:45:45 +0900 |
parents | bdfe0a32c48f |
children | 66012db6a717 |
rev | line source |
---|---|
231 | 1 #include <stdio.h> |
299 | 2 #include <stdlib.h> |
231 | 3 |
4 #include "grepWalk.h" | |
234
df4d04b3c34a
implement grepWalk (not confirm correct working)
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
232
diff
changeset
|
5 #include "subsetConstruction.h" |
308 | 6 #include "CharClass.h" |
299 | 7 #include "threadedSearch.h" |
234
df4d04b3c34a
implement grepWalk (not confirm correct working)
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
232
diff
changeset
|
8 |
299 | 9 StatePtr nextState(BitVector bi,TransitionGeneratorPtr tg) { |
10 // create tSearch in next state. | |
11 StatePtr state = tg->stateArray[bi.bitContainer]; | |
12 if (state == NULL) { | |
13 // on the fly subset construction. | |
14 state = createState(tg,bi); | |
15 determinize(state,tg); | |
16 tg->stateArray[bi.bitContainer] = state; | |
17 } | |
18 return state; | |
293
948428caf616
NFA maximum match worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
266
diff
changeset
|
19 } |
948428caf616
NFA maximum match worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
266
diff
changeset
|
20 |
299 | 21 void grepWalk(TransitionGeneratorPtr tg,Buffer buff) { |
22 TSValue tsv = createTSValue(tg,buff); | |
23 tg->stateStart = NEW(State); | |
24 *tg->stateStart = *tg->stateList; | |
25 tg->stateStart->accept = false; // Start state never accept | |
26 StatePtr state = tg->stateStart; | |
234
df4d04b3c34a
implement grepWalk (not confirm correct working)
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
232
diff
changeset
|
27 |
299 | 28 #if DEBUG |
29 TSValuePtr tsvp = &tsv; // make tsv visible in lldb | |
30 #endif | |
31 next: while (tsv.buff.buffptr < tsv.buff.buffend) { | |
32 if (state->accept) { | |
33 tsv = tg->stateMatch(tsv); | |
34 } | |
35 CharClassWalkerPtr ccw = createCharClassWalker(state->cc); | |
36 if (!hasNext(ccw)) { | |
37 // matched start again | |
38 state = tg->stateStart; | |
39 ccw = createCharClassWalker(state->cc); | |
235
4aab1e93a971
fix condition grepWalk.cc
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
234
diff
changeset
|
40 } |
299 | 41 unsigned char c = *tsv.buff.buffptr++; |
42 // printState(tsv.current->state); | |
43 while (hasNext(ccw)) { | |
44 CharClassPtr cc = getNext(ccw); | |
45 if (c<cc->cond.range.begin) { | |
46 state = tg->stateStart; | |
47 tsv = tg->stateSkip(tsv); | |
48 goto next; | |
49 } else if (c<=cc->cond.range.end) { | |
50 // range matched. | |
51 if (cc->cond.w.word) { | |
52 // match the word. | |
53 // if (not match) continue; | |
54 } | |
55 state = nextState(cc->nextState,tg); | |
56 goto next; | |
57 } | |
58 } | |
59 state = tg->stateStart; | |
60 tsv = tg->stateSkip(tsv); | |
234
df4d04b3c34a
implement grepWalk (not confirm correct working)
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
232
diff
changeset
|
61 } |
299 | 62 #if DEBUG |
63 *tsvp = tsv; | |
64 #endif | |
234
df4d04b3c34a
implement grepWalk (not confirm correct working)
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
232
diff
changeset
|
65 } |
df4d04b3c34a
implement grepWalk (not confirm correct working)
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
232
diff
changeset
|
66 |