comparison c/regexParser/regexParser.cc @ 150:a4940a8dd263 pairPro

implement insertCharClass
author masa
date Wed, 16 Dec 2015 16:42:18 +0900
parents f1880f25fabf
children 6ba059ce9109
comparison
equal deleted inserted replaced
149:f1880f25fabf 150:a4940a8dd263
83 83
84 |----------------| 84 |----------------|
85 13. b--e 85 13. b--e
86 86
87 */ 87 */
88 CharClassPtr insertCharClass(CharClassPtr cc, unsigned char begin, unsigned char end) { 88 CharClassPtr insertCharClass(CharClassPtr cc, unsigned long begin, unsigned long end) {
89 89
90 if (end < cc->cond.range.begin ) { // 1 90 if (end < cc->cond.range.begin ) { // 1
91 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);
92 if (cc->left) { 92 if (cc->left) {
93 cc1->left = insertCharClass(cc->left,begin,end); 93 cc1->left = insertCharClass(cc->left,begin,end);
96 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); 96 CharClassPtr cc2 = createCharClassRange(begin,end,0,0);
97 cc1->left = cc2; 97 cc1->left = cc2;
98 return cc1; 98 return cc1;
99 } 99 }
100 } else if (end == cc->cond.range.begin ) { // 2 100 } else if (end == cc->cond.range.begin ) { // 2
101 CharClassPtr cc2 = createCharClassRange(begin,end,0,0);
102 cc->cond.range.begin = begin; 101 cc->cond.range.begin = begin;
102 return cc;
103 } else if (end <= cc->cond.range.end) { // 3,4,6,7,9,10 103 } else if (end <= cc->cond.range.end) { // 3,4,6,7,9,10
104 if (begin < cc->cond.range.begin) { // 3,4 104 if (begin < cc->cond.range.begin) { // 3,4
105 cc->cond.range.begin = begin; 105 cc->cond.range.begin = begin;
106 } 106 }
107 return cc;
107 } else if (begin > cc->cond.range.end ) { // 13 108 } else if (begin > cc->cond.range.end ) { // 13
108 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right); 109 CharClassPtr cc1 = createCharClassRange(cc->cond.range.begin,cc->cond.range.end,cc->left,cc->right);
109 if (cc->right) { 110 if (cc->right) {
110 cc1->right = insertCharClass(cc->right,begin,end); 111 cc1->right = insertCharClass(cc->right,begin,end);
111 return cc1; 112 return cc1;
112 } else { 113 } else {
113 CharClassPtr cc2 = createCharClassRange(begin,end,0,0); 114 CharClassPtr cc2 = createCharClassRange(begin,end,0,0);
114 cc1->right = cc2; 115 cc1->right = cc2;
115 return cc1; 116 return cc1;
116 } 117 }
117 } else if (begin == cc->cond.range.end ) { // 12 118 }
118 cc->cond.range.end = end; 119 if (cc->right) {
120 return insertCharClass(cc->right,cc->cond.range.begin,end);
121 }
122 if (begin >= cc->cond.range.begin && begin <= cc->cond.range.end) { // 12
123 if (end > cc->cond.range.end) cc->cond.range.end = end; // 11
119 } else if (begin < cc->cond.range.begin) { // 5 124 } else if (begin < cc->cond.range.begin) { // 5
120 cc->cond.range.begin = begin; 125 cc->cond.range.begin = begin;
126 cc->cond.range.end = end;
127 } else {
128 printf("insertCharClass Error : begin %lu end %lu cc->begin %lu cc->end %lu\n", begin,end,cc->cond.range.begin,cc->cond.range.end);
121 } 129 }
122 return cc; 130 return cc;
123 } 131 }
124 132
125 // <charClass> ::= '['<literal>'-'<literal>']' 133 // <charClass> ::= '['<literal>'-'<literal>']'
148 rangeList->begin = *ri->ptr; 156 rangeList->begin = *ri->ptr;
149 rangeList->end = *ri->ptr; 157 rangeList->end = *ri->ptr;
150 rangeList->next = NULL; 158 rangeList->next = NULL;
151 } 159 }
152 160
153 for (RangeListPtr r = &cc->cond.range; r; r = r->next) { 161 RangeListPtr r = cc->cond.range.next;
162 cc->cond.range.next = 0;
163 for (; r; r = r->next) {
154 cc = insertCharClass(cc, r->begin, r->end); 164 cc = insertCharClass(cc, r->begin, r->end);
155 } 165 }
156 166
157 n->cc = cc; 167 n->cc = cc;
158 // TODO literal support 168 // TODO literal support