comparison c/regexParser/regexParser.cc @ 149:f1880f25fabf pairPro

add insertCharClass images
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Wed, 16 Dec 2015 15:37:14 +0900
parents d1ebba6e117a
children a4940a8dd263
comparison
equal deleted inserted replaced
148:d1ebba6e117a 149:f1880f25fabf
57 cc->cond.w.length = ri->ptr - ri->tokenValue; 57 cc->cond.w.length = ri->ptr - ri->tokenValue;
58 cc->nextState.bitContainer = 0; 58 cc->nextState.bitContainer = 0;
59 return cc; 59 return cc;
60 } 60 }
61 61
62 /*
63 cond.range.begin cond.range.end
64 |----------------|
65 1.b---e
66 2.b------e
67 3.b------------e
68 4.b-----------------------e
69 5.b----------------------------e
70
71 |----------------|
72 6. b---------e
73 7. b----------------e
74 8. b---------------------e
75
76 |----------------|
77 9. b-----e
78 10. b--------e
79 11. b-------------e
80
81 |----------------|
82 12. b-----e
83
84 |----------------|
85 13. b--e
86
87 */
62 CharClassPtr insertCharClass(CharClassPtr cc, unsigned char begin, unsigned char end) { 88 CharClassPtr insertCharClass(CharClassPtr cc, unsigned char begin, unsigned char end) {
63 if (end < cc->cond.range.begin ) { 89
90 if (end < cc->cond.range.begin ) { // 1
64 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right); 91 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right);
65 if (cc->left) { 92 if (cc->left) {
66 cc1->left = insertCharClass(cc->left,begin,end); 93 cc1->left = insertCharClass(cc->left,begin,end);
67 return cc1; 94 return cc1;
68 } else { 95 } else {
69 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); 96 CharClassPtr cc2 = createCharClassRange(begin,end,0,0);
70 cc1->left = cc2; 97 cc1->left = cc2;
71 return cc1; 98 return cc1;
72 } 99 }
73 } else if (end == cc->cond.range.begin ) { 100 } else if (end == cc->cond.range.begin ) { // 2
101 CharClassPtr cc2 = createCharClassRange(begin,end,0,0);
74 cc->cond.range.begin = begin; 102 cc->cond.range.begin = begin;
75 } else if (end <= cc->cond.range.end) { 103 } else if (end <= cc->cond.range.end) { // 3,4,6,7,9,10
76 if (begin < cc->cond.range.begin) { 104 if (begin < cc->cond.range.begin) { // 3,4
77 cc->cond.range.begin = begin; 105 cc->cond.range.begin = begin;
78 } 106 }
79 } else if (begin > cc->cond.range.end ) { 107 } else if (begin > cc->cond.range.end ) { // 13
80 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right); 108 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right);
81 if (cc->right) { 109 if (cc->right) {
82 cc1->right = insertCharClass(cc->right,begin,end); 110 cc1->right = insertCharClass(cc->right,begin,end);
83 return cc1; 111 return cc1;
84 } else { 112 } else {
85 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); 113 CharClassPtr cc2 = createCharClassRange(begin,end,0,0);
86 cc1->right = cc2; 114 cc1->right = cc2;
87 return cc1; 115 return cc1;
88 } 116 }
89 } else if (begin == cc->cond.range.end ) { 117 } else if (begin == cc->cond.range.end ) { // 12
90 cc->cond.range.end = end; 118 cc->cond.range.end = end;
91 } else if (begin < cc->cond.range.begin) { 119 } else if (begin < cc->cond.range.begin) { // 5
92 cc->cond.range.begin = begin; 120 cc->cond.range.begin = begin;
93 } 121 }
94 return cc; 122 return cc;
95 } 123 }
96 124
113 rangeList->end = *(ri->ptr + 1); 141 rangeList->end = *(ri->ptr + 1);
114 ri->ptr++; 142 ri->ptr++;
115 continue; 143 continue;
116 } 144 }
117 if (ri->ptr[0] == 0 || ri->ptr[0] == ']') break; 145 if (ri->ptr[0] == 0 || ri->ptr[0] == ']') break;
118 if (ri->ptr[0] == rangeList->end + 1) {
119 rangeList->end = *ri->ptr;
120 continue;
121 }
122 rangeList->next = NEW(RangeList); 146 rangeList->next = NEW(RangeList);
123 rangeList = rangeList->next; 147 rangeList = rangeList->next;
124 rangeList->begin = *ri->ptr; 148 rangeList->begin = *ri->ptr;
125 rangeList->end = *ri->ptr; 149 rangeList->end = *ri->ptr;
126 rangeList->next = NULL; 150 rangeList->next = NULL;