Mercurial > hg > Applications > Grep
comparison regexParser/regexParser.cc @ 192:ecf70fb215a5 pairPro
print charclass
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 25 Dec 2015 19:31:53 +0900 |
parents | 3e8e5780ad4a |
children | b0ae5273925c |
comparison
equal
deleted
inserted
replaced
191:02031fb73af8 | 192:ecf70fb215a5 |
---|---|
18 NodePtr allocateNode() { | 18 NodePtr allocateNode() { |
19 NodePtr n = NEW(Node); | 19 NodePtr n = NEW(Node); |
20 n->cc = NULL; | 20 n->cc = NULL; |
21 n->left = NULL; | 21 n->left = NULL; |
22 n->right = NULL; | 22 n->right = NULL; |
23 n->stateNum = 0; | |
24 n->nextStateNum = 0; | |
23 return n; | 25 return n; |
24 } | 26 } |
25 | 27 |
26 NodePtr createNode(RegexInfoPtr ri,unsigned char type,CharClassPtr cc, NodePtr left, NodePtr right) { | 28 NodePtr createNode(RegexInfoPtr ri,unsigned char type,CharClassPtr cc, NodePtr left, NodePtr right) { |
27 NodePtr n = allocateNode(); | 29 NodePtr n = allocateNode(); |
34 } | 36 } |
35 | 37 |
36 CharClassPtr createCharClassWord(RegexInfoPtr ri) { | 38 CharClassPtr createCharClassWord(RegexInfoPtr ri) { |
37 CharClassPtr cc = NEW(CharClass); | 39 CharClassPtr cc = NEW(CharClass); |
38 cc->type = 'a'; | 40 cc->type = 'a'; |
41 cc->left = NULL; | |
42 cc->right = NULL; | |
39 cc->cond.w.word = ri->tokenValue; | 43 cc->cond.w.word = ri->tokenValue; |
40 cc->cond.w.length = ri->ptr - ri->tokenValue; | 44 cc->cond.w.length = ri->ptr - ri->tokenValue; |
41 cc->cond.range.begin = cc->cond.range.end = *ri->tokenValue; | 45 cc->cond.range.begin = cc->cond.range.end = *ri->tokenValue; |
46 cc->cond.range.next = NULL; | |
42 return cc; | 47 return cc; |
43 } | 48 } |
44 | 49 |
45 /* | 50 /* |
46 cond.range.begin cond.range.end | 51 cond.range.begin cond.range.end |
143 RangeListPtr r = cc->cond.range.next; | 148 RangeListPtr r = cc->cond.range.next; |
144 cc->cond.range.next = 0; | 149 cc->cond.range.next = 0; |
145 for (; r; r = r->next) { | 150 for (; r; r = r->next) { |
146 cc = insertCharClass(cc, r->begin, r->end); | 151 cc = insertCharClass(cc, r->begin, r->end); |
147 } | 152 } |
148 | 153 cc->cond.range.next = 0; |
149 // TODO literal support | 154 // TODO literal support |
150 // merge rangeList here | 155 // merge rangeList here |
151 if (*ri->ptr) ri->ptr++; | 156 if (*ri->ptr) ri->ptr++; |
152 token(ri); | 157 token(ri); |
153 return n; | 158 return n; |
236 n = createNode(ri,'*',0,n,0); | 241 n = createNode(ri,'*',0,n,0); |
237 token(ri); | 242 token(ri); |
238 } | 243 } |
239 return n; | 244 return n; |
240 } | 245 } |
241 | |
242 RegexInfoPtr createRegexInfo (RegexInfoPtr ri) { | |
243 ri->stateNumber++; | |
244 return ri; | |
245 } | |
246 | |
247 | 246 |
248 // <regex> ::= <regexAtom> | <regexAtom>'*'<regex> | <regexAtom>'|'<regex> | <regexAtom><regexAtom>'*' | <regexAtom><regex> | 247 // <regex> ::= <regexAtom> | <regexAtom>'*'<regex> | <regexAtom>'|'<regex> | <regexAtom><regexAtom>'*' | <regexAtom><regex> |
249 NodePtr regex(RegexInfoPtr ri) { | 248 NodePtr regex(RegexInfoPtr ri) { |
250 token(ri); | 249 token(ri); |
251 NodePtr n = regexAtom(ri); | 250 NodePtr n = regexAtom(ri); |