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

impl charclass
author masa
date Fri, 04 Dec 2015 19:07:10 +0900
parents dbafc753078e
children 15815fcb6c2f
line wrap: on
line diff
--- a/c/regexParser/regexParser.cc	Fri Dec 04 17:45:09 2015 +0900
+++ b/c/regexParser/regexParser.cc	Fri Dec 04 19:07:10 2015 +0900
@@ -57,33 +57,39 @@
 // <charClass> ::= '['<literal>'-'<literal>']'
 static
 NodePtr charClass(RegexInfoPtr ri) {
-
     CharClassPtr cc = NEW(CharClass);
+    NodePtr n = createNode(ri,'c',cc,0,0);
     cc->type = 'r';
     cc->cond = NEW(Condition);
     cc->cond->range = NEW(RangeList);
     cc->cond->range->begin = ri->ptr;
-    cc->cond->range->end = ri->ptr + 1;
+    cc->cond->range->end = ri->ptr;
     cc->cond->range->next = NULL;
 
-    int i = 0;
 
     RangeListPtr rangeList = cc->cond->range;
 
-    while (ri->ptr[i] != ']') {
-        if (ri->ptr[i] == '-') i++;
-
-        rangeList->end = ri->ptr + i;
+    for (ri->ptr++; *ri->ptr && *ri->ptr != ']'; ri->ptr++) {
+        if (*ri->ptr == '-') {
+            rangeList->end = ri->ptr + 1;
+            ri->ptr++;
+            continue;
+        }
+        if (ri->ptr[0] == 0 || ri->ptr[0] == ']') break;
+        if (ri->ptr[0] == rangeList->end[0] + 1) {
+            rangeList->end = ri->ptr;
+            continue;
+        }
         rangeList->next = NEW(RangeList);
         rangeList = rangeList->next;
-        rangeList->begin = ri->ptr+i+1;
+        rangeList->begin = ri->ptr;
+        rangeList->end = ri->ptr;
         rangeList->next = NULL;
-        i++;
     }
             // TODO literal support
 
-    rangeList->end = ri->ptr + i - 1;
-    NodePtr n = createNode(ri,'c',cc,0,0);
+    if (*ri->ptr) ri->ptr++;
+    token(ri);
     token(ri);
     return n;
 }
@@ -114,6 +120,11 @@
             ri->tokenType = 'c';
             ri->tokenValue = ri->ptr;
             return;
+        } else if (ri->ptr[0] == ']') {
+            ri->ptr++;
+            ri->tokenType = ']';
+            ri->tokenValue = ri->ptr;
+            return;
         } else if (ri->ptr[0] == '|'){
             ri->ptr++;
             ri->tokenType = '|';