Mercurial > hg > Applications > Grep
comparison c/regexParser/subsetConstraction.cc @ 154:1fad21fd6028 pairPro
remove errors and warnings
author | masa |
---|---|
date | Fri, 18 Dec 2015 14:16:02 +0900 |
parents | e2e717fbeb2f |
children | 6cd0141bed6c |
comparison
equal
deleted
inserted
replaced
153:e2e717fbeb2f | 154:1fad21fd6028 |
---|---|
1 #include <stdio.h> | 1 #include <stdio.h> |
2 #include <stdlib.h> | 2 #include <stdlib.h> |
3 #include <ctype.h> | 3 #include <ctype.h> |
4 #include "subsetConstraction.h" | 4 #include "subsetConstraction.h" |
5 | 5 |
6 static | |
7 CharClassPtr createCharClassWord(unsigned char *w, CharClassPtr cc1, CharClassPtr cc2) { | 6 CharClassPtr createCharClassWord(unsigned char *w, CharClassPtr cc1, CharClassPtr cc2) { |
8 CharClassPtr cc = NEW(CharClass); | 7 CharClassPtr cc = NEW(CharClass); |
9 return cc1; | 8 return cc; |
10 } | 9 } |
11 | 10 |
12 CharClassPtr charClassMerge(CharClassPtr cc,unsigned long begin, unsigned long end, BitVector nextState) { | 11 CharClassPtr charClassMerge(CharClassPtr cc,unsigned long begin, unsigned long end, BitVector nextState) { |
13 // 重なっているccの領域を分割する | 12 // 重なっているccの領域を分割する |
14 // 必要ならばnextStateを重ねあわせる | 13 // 必要ならばnextStateを重ねあわせる |
17 CharClassPtr cc1 = charClassMerge(cc,cc->cond.range.begin,cc->cond.range.end,nextState); | 16 CharClassPtr cc1 = charClassMerge(cc,cc->cond.range.begin,cc->cond.range.end,nextState); |
18 if (cc->left) { | 17 if (cc->left) { |
19 cc1->left = charClassMerge(cc->left,begin,end,nextState); | 18 cc1->left = charClassMerge(cc->left,begin,end,nextState); |
20 return cc1; | 19 return cc1; |
21 } else { | 20 } else { |
22 CharClassPtr cc2 = charClassMerge(begin,end,0,0); | 21 CharClassPtr cc2 = charClassMerge(cc,begin,end,nextState); |
23 cc2->nextState = nextState; | 22 cc2->nextState = nextState; |
24 cc1->left = cc2; | 23 cc1->left = cc2; |
25 return cc1; | 24 return cc1; |
26 } | 25 } |
27 } else if (end == cc->cond.range.begin ) { // 2 | 26 } else if (end == cc->cond.range.begin ) { // 2 |
32 cc->cond.range.begin = begin; | 31 cc->cond.range.begin = begin; |
33 } | 32 } |
34 return cc; | 33 return cc; |
35 } else if (begin > cc->cond.range.end ) { // 13 | 34 } else if (begin > cc->cond.range.end ) { // 13 |
36 if (cc->right) { | 35 if (cc->right) { |
37 cc->right = charClassMerge(cc->right,begin,end); | 36 cc->right = charClassMerge(cc->right,begin,end,nextState); |
38 } else { | 37 } else { |
39 cc->right = charClassMerge(begin,end,0,0); | 38 cc->right = charClassMerge(cc,begin,end,nextState); |
40 } | 39 } |
41 return cc; | 40 return cc; |
42 } | 41 } |
43 if (cc->right) { | 42 if (cc->right) { |
44 CharClassPtr right = cc->right; | 43 CharClassPtr right = cc->right; |
45 begin = cc->cond.range.begin; | 44 begin = cc->cond.range.begin; |
46 free(cc); | 45 free(cc); |
47 return charClassMerge(right,begin,end); | 46 return charClassMerge(right,begin,end,nextState); |
48 } | 47 } |
49 if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { // 12 | 48 if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { // 12 |
50 if (end > cc->cond.range.end) cc->cond.range.end = end; // 11,8 | 49 if (end > cc->cond.range.end) cc->cond.range.end = end; // 11,8 |
51 } else if (begin < cc->cond.range.begin) { // 5 | 50 } else if (begin < cc->cond.range.begin) { // 5 |
52 cc->cond.range.begin = begin; | 51 cc->cond.range.begin = begin; |
56 } | 55 } |
57 return cc; | 56 return cc; |
58 } | 57 } |
59 | 58 |
60 TGValue generateTransition(NodePtr n,TransitionGenerator tg) { | 59 TGValue generateTransition(NodePtr n,TransitionGenerator tg) { |
60 TGValue tgv2; | |
61 if (n->tokenType == '+') { | 61 if (n->tokenType == '+') { |
62 TGValue tgv = generateTransition(n->left,tg); | 62 TGValue tgv = generateTransition(n->left,tg); |
63 if (tgv.asterisk) { | 63 if (tgv.asterisk) { |
64 TGValue tgv1 = generateTransition(n->right,tg); | 64 TGValue tgv1 = generateTransition(n->right,tg); |
65 tgv.ts->nextState->bitContainer |= tgv1.ts->nextState->bitContainer; | 65 tgv.ts->nextState->bitContainer |= tgv1.ts->nextState->bitContainer; |
76 } else if (n->tokenType == '*') { | 76 } else if (n->tokenType == '*') { |
77 TGValue tgv = generateTransition(n->left,tg); | 77 TGValue tgv = generateTransition(n->left,tg); |
78 tgv.asterisk = true; | 78 tgv.asterisk = true; |
79 return tgv; | 79 return tgv; |
80 } else if (n->tokenType == 'c'){ | 80 } else if (n->tokenType == 'c'){ |
81 | 81 return tgv2; |
82 } else if (n->tokenType == 'a'){ | 82 } else if (n->tokenType == 'a'){ |
83 TGValue tgv; | 83 TGValue tgv; |
84 tgv.ts = (TransitionPtr)malloc(sizeof(Transition)); | 84 tgv.ts = (TransitionPtr)malloc(sizeof(Transition)); |
85 tgv.ts->condition = n->cc; | 85 tgv.ts->condition = n->cc; |
86 tgv.ts->nextState = (BitVectorPtr)malloc(sizeof(BitVector)); | 86 tgv.ts->nextState = (BitVectorPtr)malloc(sizeof(BitVector)); |
88 tg.ts = appendTransition(tg.ts,tgv.ts); | 88 tg.ts = appendTransition(tg.ts,tgv.ts); |
89 return tgv; | 89 return tgv; |
90 } else { | 90 } else { |
91 // error | 91 // error |
92 } | 92 } |
93 return tgv2; | |
93 } | 94 } |
94 | 95 |
95 void printTransitionList(TransitionPtr ts) { | 96 void printTransitionList(TransitionPtr ts) { |
96 for (;ts;ts = ts->next) { | 97 for (;ts;ts = ts->next) { |
97 printf("\n"); | 98 printf("\n"); |