Mercurial > hg > Applications > Grep
comparison c/regexParser/subsetConstraction.cc @ 144:d8a4922eceae pairPro
remove some errors (not working)
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 14 Dec 2015 17:14:33 +0900 |
parents | 32977f5a2ed0 |
children | 1c74ac7d56ec |
comparison
equal
deleted
inserted
replaced
143:32977f5a2ed0 | 144:d8a4922eceae |
---|---|
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 | |
6 static | |
7 CharClassPtr createCharClassWord(unsigned char *w, CharClassPtr cc1, CharClassPtr cc2) { | |
8 return cc1; | |
9 } | |
5 | 10 |
6 CharClassPtr charClassMerge(CharClassPtr src, CharClassPtr add) { | 11 CharClassPtr charClassMerge(CharClassPtr src, CharClassPtr add) { |
7 // 重なっているccの領域を分割する | 12 // 重なっているccの領域を分割する |
8 // 必要ならばnextStateを重ねあわせる | 13 // 必要ならばnextStateを重ねあわせる |
9 // 変更があった場合は新しくリストを作って返す | 14 // 変更があった場合は新しくリストを作って返す |
10 if (src->type == 'a') { | 15 if (src->type == 'a') { |
11 if (add->type == 'a') { | 16 if (add->type == 'a') { |
12 if (src->cond.w.word[0] > add->cond.w.word[0]) { | 17 if (src->cond.w.word[0] > add->cond.w.word[0]) { |
13 // add のほうが小さいので小さい順のccをつくる | 18 // add のほうが小さいので小さい順のccをつくる |
14 CharClassPtr left = charClassMerge(add->left.src); | 19 CharClassPtr left = charClassMerge(add->left,src); |
15 return createCharClassWord(add->cond->w.word, left, add->right); | 20 return createCharClassWord(add->cond.w.word, left, add->right); |
16 } else { | 21 } else { |
17 | 22 |
18 } | 23 } |
19 } else if (add->type == 'c') { | 24 } else if (add->type == 'c') { |
20 // | |
21 if (src->cond.w.word[0] < add->cond.range.begin) { | 25 if (src->cond.w.word[0] < add->cond.range.begin) { |
22 | 26 |
23 } else (src->cond->w.word[0] < add->end) { | 27 } else if (src->cond.w.word[0] < add->cond.range.end) { |
28 | |
29 } | |
30 } | |
24 } else if (src->type == 'c') { | 31 } else if (src->type == 'c') { |
25 | 32 |
26 } | 33 } |
27 } | 34 } |
28 | 35 |
29 void printTransition(TransitionPtr ts) { | 36 void printTransition(TransitionPtr ts) { |
30 for (;;) { | 37 |
31 printf("Input Condition : %c\n",ts->condition->cond->w->word); | |
32 printf("Next State : "); bitPrint(ts->nextState); printf("\n"); | |
33 if (ts->next == NULL) break; | |
34 ts = ts->next; | |
35 } | |
36 } | 38 } |
37 | 39 |
38 TGValue generateTransition(NodePtr n,TransitionGenerator tg) { | 40 TGValue generateTransition(NodePtr n,TransitionGenerator tg) { |
39 | |
40 if (n->tokenType == '+') { | 41 if (n->tokenType == '+') { |
41 TGValue tgv = generateTransition(n->left,tg); | 42 TGValue tgv = generateTransition(n->left,tg); |
42 if (tgv.asterisk) { | 43 if (tgv.asterisk) { |
43 TGValue tgv1 = generateTransition(n->right,tg); | 44 TGValue tgv1 = generateTransition(n->right,tg); |
44 tgv.state |= tgv1.state; | 45 tgv.ts->state->bitContainer |= tgv1.ts->state->bitContainer; |
45 return tgv; | 46 return tgv; |
46 } | 47 } |
47 tgv.state = n->right->nodeNumber; | 48 bitSet(tgv.ts->state,n->right->nodeNumber); |
48 return tgv; | 49 return tgv; |
49 } else if (n->tokenType == '|') { | 50 } else if (n->tokenType == '|') { |
50 tgv0 = generateTransition(n->left,tg); | 51 |
51 tgv1 = generateTransition(n->right,tg); | |
52 tg->state->transition = appendTransition(tgv0->ts,tgv1->ts); | |
53 } else if (n->tokenType == '*') { | 52 } else if (n->tokenType == '*') { |
54 tgv0 = generateTransition(n->left,tg); | 53 |
55 tgv0->asterisk = true; | 54 } else if (n->tokenType == 'c'){ |
55 | |
56 } else if (n->tokenType == 'a'){ | |
57 | |
56 } else { | 58 } else { |
57 tgv0 = (TGValuePtr)malloc(sizeof(TGValue)); | 59 // error |
58 BitVectorPtr bi = createBitVector(n); | |
59 tgv0->ts = createTransition(n->cc,bi); | |
60 tgv0->asterisk = false; | |
61 } | 60 } |
62 | |
63 return tgv0; | |
64 } | 61 } |
65 | 62 |
66 StatePtr createStateList(NodePtr n) { | 63 StatePtr createStateList(NodePtr n) { |
67 StatePtr s0 = NULL; | 64 StatePtr s0 = NULL; |
68 if (n->left != NULL) { | 65 if (n->left != NULL) { |
71 | 68 |
72 if (n->tokenType == 'a') { | 69 if (n->tokenType == 'a') { |
73 BitVectorPtr bi = createBitVector(n); | 70 BitVectorPtr bi = createBitVector(n); |
74 StatePtr s1 = createState(bi,0,0); | 71 StatePtr s1 = createState(bi,0,0); |
75 } else if (n->tokenType == '+' || n->tokenType == '|') { | 72 } else if (n->tokenType == '+' || n->tokenType == '|') { |
76 | 73 |
77 } | 74 } |
78 | 75 |
79 if (n->right != NULL) { | 76 if (n->right != NULL) { |
80 s0 = createStateList(n->right); | 77 s0 = createStateList(n->right); |
81 } | 78 } |
82 return s0; | 79 return s0; |
83 } | 80 } |
84 | 81 |
85 TransitionGeneratorPtr generateTransitionList(NodePtr n) { | 82 TransitionGenerator generateTransitionList(NodePtr n) { |
86 TransitionGeneratorPtr tg = (TransitionGeneratorPtr)malloc(sizeof(TransitionGenerator)); | 83 TransitionGenerator tg; |
87 int d = 0; | 84 tg.state = createStateList(n); |
88 tg->state = createStateList(n); | |
89 generateTransition(n,tg); | 85 generateTransition(n,tg); |
90 return tg; | 86 return tg; |
91 } | 87 } |