comparison c/regexParser/regexParser.cc @ 135:e1a262ec75f0 pairPro

impl charclass
author masa
date Fri, 04 Dec 2015 19:07:10 +0900
parents dbafc753078e
children 15815fcb6c2f
comparison
equal deleted inserted replaced
134:dbafc753078e 135:e1a262ec75f0
55 55
56 56
57 // <charClass> ::= '['<literal>'-'<literal>']' 57 // <charClass> ::= '['<literal>'-'<literal>']'
58 static 58 static
59 NodePtr charClass(RegexInfoPtr ri) { 59 NodePtr charClass(RegexInfoPtr ri) {
60
61 CharClassPtr cc = NEW(CharClass); 60 CharClassPtr cc = NEW(CharClass);
61 NodePtr n = createNode(ri,'c',cc,0,0);
62 cc->type = 'r'; 62 cc->type = 'r';
63 cc->cond = NEW(Condition); 63 cc->cond = NEW(Condition);
64 cc->cond->range = NEW(RangeList); 64 cc->cond->range = NEW(RangeList);
65 cc->cond->range->begin = ri->ptr; 65 cc->cond->range->begin = ri->ptr;
66 cc->cond->range->end = ri->ptr + 1; 66 cc->cond->range->end = ri->ptr;
67 cc->cond->range->next = NULL; 67 cc->cond->range->next = NULL;
68 68
69 int i = 0;
70 69
71 RangeListPtr rangeList = cc->cond->range; 70 RangeListPtr rangeList = cc->cond->range;
72 71
73 while (ri->ptr[i] != ']') { 72 for (ri->ptr++; *ri->ptr && *ri->ptr != ']'; ri->ptr++) {
74 if (ri->ptr[i] == '-') i++; 73 if (*ri->ptr == '-') {
75 74 rangeList->end = ri->ptr + 1;
76 rangeList->end = ri->ptr + i; 75 ri->ptr++;
76 continue;
77 }
78 if (ri->ptr[0] == 0 || ri->ptr[0] == ']') break;
79 if (ri->ptr[0] == rangeList->end[0] + 1) {
80 rangeList->end = ri->ptr;
81 continue;
82 }
77 rangeList->next = NEW(RangeList); 83 rangeList->next = NEW(RangeList);
78 rangeList = rangeList->next; 84 rangeList = rangeList->next;
79 rangeList->begin = ri->ptr+i+1; 85 rangeList->begin = ri->ptr;
86 rangeList->end = ri->ptr;
80 rangeList->next = NULL; 87 rangeList->next = NULL;
81 i++;
82 } 88 }
83 // TODO literal support 89 // TODO literal support
84 90
85 rangeList->end = ri->ptr + i - 1; 91 if (*ri->ptr) ri->ptr++;
86 NodePtr n = createNode(ri,'c',cc,0,0); 92 token(ri);
87 token(ri); 93 token(ri);
88 return n; 94 return n;
89 } 95 }
90 96
91 // <literal> ::= [a-z][A-Z][0-9] 97 // <literal> ::= [a-z][A-Z][0-9]
110 ri->tokenValue = ri->ptr; 116 ri->tokenValue = ri->ptr;
111 return; 117 return;
112 } else if (ri->ptr[0] == '[') { 118 } else if (ri->ptr[0] == '[') {
113 ri->ptr++; 119 ri->ptr++;
114 ri->tokenType = 'c'; 120 ri->tokenType = 'c';
121 ri->tokenValue = ri->ptr;
122 return;
123 } else if (ri->ptr[0] == ']') {
124 ri->ptr++;
125 ri->tokenType = ']';
115 ri->tokenValue = ri->ptr; 126 ri->tokenValue = ri->ptr;
116 return; 127 return;
117 } else if (ri->ptr[0] == '|'){ 128 } else if (ri->ptr[0] == '|'){
118 ri->ptr++; 129 ri->ptr++;
119 ri->tokenType = '|'; 130 ri->tokenType = '|';