Mercurial > hg > Applications > Grep
comparison regexParser/subsetConstraction.cc @ 167:3bf2c6d6d53e pairPro
move regexparser dir
author | masa |
---|---|
date | Sat, 19 Dec 2015 15:38:45 +0900 |
parents | c/regexParser/subsetConstraction.cc@96854eba17e5 |
children | 6b31d6ef9ba4 |
comparison
equal
deleted
inserted
replaced
166:96854eba17e5 | 167:3bf2c6d6d53e |
---|---|
1 #include <stdio.h> | |
2 #include <stdlib.h> | |
3 #include <ctype.h> | |
4 #include "subsetConstraction.h" | |
5 | |
6 CharClassPtr createCharClassWord(unsigned char *w, CharClassPtr cc1, CharClassPtr cc2) { | |
7 CharClassPtr cc = NEW(CharClass); | |
8 return cc; | |
9 } | |
10 | |
11 CharClassPtr mergeCCTree(CharClassPtr cc,unsigned char mBegin,unsigned char mEnd,BitVector nextState) { | |
12 CharClassPtr cc1; | |
13 if (cc) { | |
14 cc1 = charClassMerge(cc,mBegin,mEnd,nextState); | |
15 } else { | |
16 cc1 = createCharClassRange(mBegin,mEnd,NULL,NULL); | |
17 cc1->nextState = nextState; | |
18 } | |
19 return cc1; | |
20 } | |
21 | |
22 CharClassPtr charClassMerge(CharClassPtr cc,unsigned long begin, unsigned long end, BitVector nextState) { | |
23 // 重なっているccの領域を分割する | |
24 // 必要ならばnextStateを重ねあわせる | |
25 // 変更があった場合は新しくリストを作って返す | |
26 if (end < cc->cond.range.begin ) { // 1 | |
27 if (cc->left) { | |
28 return createCharClassRange(cc->cond.range.begin,cc->cond.range.end,charClassMerge(cc->left,begin,end,nextState),cc->right); | |
29 } else { | |
30 CharClassPtr cc1 = createCharClassRange(begin,end,NULL,cc); | |
31 cc1->nextState = nextState; | |
32 return cc1; | |
33 } | |
34 } else if (end == cc->cond.range.begin && begin != end ) { // 2 | |
35 CharClassPtr cc1 = mergeCCTree(cc->left,begin,end-1,nextState); | |
36 if (cc->cond.range.begin == cc->cond.range.end) { | |
37 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc1,cc->right); | |
38 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
39 return cc2; | |
40 } | |
41 CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin+1,cc->cond.range.end,cc->left,cc->right); | |
42 cc3->nextState = cc->nextState; | |
43 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.begin,cc1,cc3); | |
44 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
45 return cc2; | |
46 } else if (end < cc->cond.range.end) { // range.begin < end | |
47 if (begin < cc->cond.range.begin) { // 3 | |
48 CharClassPtr cc1 = mergeCCTree(cc->left,begin,cc->cond.range.begin-1,nextState); | |
49 CharClassPtr cc3 = createCharClassRange(end+1,cc->cond.range.end,cc->left,cc->right); | |
50 cc3->nextState = cc->nextState; | |
51 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,end,cc1,cc3); | |
52 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
53 return cc2; | |
54 } | |
55 if (begin == cc->cond.range.begin) { // 6 | |
56 CharClassPtr cc2 = createCharClassRange(end+1,cc->cond.range.end,NULL,cc->right); | |
57 cc2->nextState = cc->nextState; | |
58 CharClassPtr cc1 = createCharClassRange(begin,end,cc->left,cc2); | |
59 cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
60 return cc1; | |
61 } | |
62 // 9 | |
63 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL); | |
64 cc2->nextState = cc->nextState; | |
65 CharClassPtr cc3 = createCharClassRange(end+1,cc->cond.range.end,NULL,cc->right); | |
66 cc3->nextState = cc->nextState; | |
67 CharClassPtr cc1 = createCharClassRange(begin,end,cc2,cc3); | |
68 cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
69 return cc1; | |
70 } else if (end == cc->cond.range.end) { | |
71 if (begin == cc->cond.range.begin) { // 7 | |
72 CharClassPtr cc1 = createCharClassRange(begin,end,cc->left,cc->right); | |
73 cc1->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
74 return cc1; | |
75 } else if (begin < cc->cond.range.begin) { // 4 | |
76 CharClassPtr cc1 = mergeCCTree(cc->left,begin,cc->cond.range.begin-1,nextState); | |
77 CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,end,cc1,cc->right); | |
78 cc3->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
79 return cc3; | |
80 } | |
81 // 10 cond.range.begin < begin | |
82 CharClassPtr cc2 = createCharClassRange(begin,cc->cond.range.end,NULL,cc->right); | |
83 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
84 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,cc2); | |
85 cc1->nextState = cc->nextState; | |
86 return cc1; | |
87 } | |
88 if (begin > cc->cond.range.end ) { // 13 | |
89 if (cc->right) { | |
90 return createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,charClassMerge(cc->right,begin,end,nextState)); | |
91 } else { | |
92 CharClassPtr cc1 = createCharClassRange(begin,end,cc,NULL); | |
93 cc1->nextState = nextState; | |
94 return cc1; | |
95 } | |
96 } | |
97 if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { | |
98 if (end > cc->cond.range.end) { // cond.range.end < end | |
99 if (begin == cc->cond.range.begin) { // 8 | |
100 CharClassPtr cc1 = mergeCCTree(cc->right,cc->cond.range.end+1,end,nextState); | |
101 CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc1); | |
102 cc3->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
103 return cc3; | |
104 } | |
105 if (begin > cc->cond.range.begin) { // 11 | |
106 CharClassPtr cc1 = mergeCCTree(cc->right,cc->cond.range.end+1,end,nextState); | |
107 CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,begin-1,cc->left,NULL); | |
108 cc3->nextState = cc->nextState; | |
109 CharClassPtr cc2 = createCharClassRange(begin,cc->cond.range.end,cc3,cc1); | |
110 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
111 return cc2; | |
112 } | |
113 } | |
114 // begin != end && end != cc->cond.range.end | |
115 if (begin == cc->cond.range.end) { // 12 | |
116 CharClassPtr cc1 = mergeCCTree(cc->right,begin+1,end,nextState); | |
117 if (cc->cond.range.begin == cc->cond.range.end) { | |
118 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc1,cc->right); | |
119 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
120 return cc2; | |
121 } | |
122 CharClassPtr cc3 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end-1,cc->left,NULL); | |
123 cc3->nextState = cc->nextState; | |
124 CharClassPtr cc2 = createCharClassRange(cc->cond.range.end,cc->cond.range.end,cc1,cc3); | |
125 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
126 return cc2; | |
127 } | |
128 } else if (begin < cc->cond.range.begin) { // 5 | |
129 CharClassPtr cc1 = mergeCCTree(cc->left,begin,cc->cond.range.begin-1,nextState); | |
130 CharClassPtr cc3 = mergeCCTree(cc->right,cc->cond.range.end+1,end,nextState); | |
131 CharClassPtr cc2 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc1,cc3); | |
132 cc2->nextState.bitContainer = cc->nextState.bitContainer | nextState.bitContainer; | |
133 return cc2; | |
134 } else { | |
135 printf("charClassMerge Error : begin %lu end %lu cc->begin %lu cc->end %lu\n", begin,end,cc->cond.range.begin,cc->cond.range.end); | |
136 } | |
137 return cc; | |
138 } | |
139 | |
140 TGValue generateTransition(NodePtr n,TransitionGenerator tg) { | |
141 TGValue tgv2; | |
142 if (n->tokenType == '+') { | |
143 TGValue tgv = generateTransition(n->left,tg); | |
144 if (tgv.asterisk) { | |
145 TGValue tgv1 = generateTransition(n->right,tg); | |
146 tgv.ts->nextState->bitContainer |= tgv1.ts->nextState->bitContainer; | |
147 return tgv; | |
148 } | |
149 TGValue tgv1 = generateTransition(n->right,tg); | |
150 tgv.ts->nextState = tgv1.ts->nextState; | |
151 return tgv; | |
152 } else if (n->tokenType == '|') { | |
153 TGValue tgv = generateTransition(n->left,tg); | |
154 TGValue tgv1 = generateTransition(n->right,tg); | |
155 tgv.ts = appendTransition(tgv.ts,tgv1.ts); | |
156 return tgv; | |
157 } else if (n->tokenType == '*') { | |
158 TGValue tgv = generateTransition(n->left,tg); | |
159 tgv.asterisk = true; | |
160 return tgv; | |
161 } else if (n->tokenType == 'c'){ | |
162 return tgv2; | |
163 } else if (n->tokenType == 'a'){ | |
164 TGValue tgv; | |
165 tgv.ts = (TransitionPtr)malloc(sizeof(Transition)); | |
166 tgv.ts->condition = n->cc; | |
167 tgv.ts->nextState = (BitVectorPtr)malloc(sizeof(BitVector)); | |
168 bitSet(tgv.ts->nextState,n->nodeNumber); | |
169 tg.ts = appendTransition(tg.ts,tgv.ts); | |
170 return tgv; | |
171 } else { | |
172 // error | |
173 } | |
174 return tgv2; | |
175 } | |
176 | |
177 void printTransitionList(TransitionPtr ts) { | |
178 for (;ts;ts = ts->next) { | |
179 printf("\n"); | |
180 } | |
181 } | |
182 | |
183 TransitionGenerator generateTransitionList(NodePtr n) { | |
184 TransitionGenerator tg; | |
185 tg.ts = (TransitionPtr)malloc(sizeof(Transition)); | |
186 generateTransition(n,tg); | |
187 printTransitionList(tg.ts); | |
188 return tg; | |
189 } |