Mercurial > hg > Applications > Grep
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 = '|'; |