diff c/regexParser/createBitVectorList.cc @ 104:3eb3cb5d581f bitVec-Kaito

implemented 'or' node translator
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Tue, 17 Nov 2015 22:20:42 +0900
parents 4ad2a75dec4a
children 766fc2476f01
line wrap: on
line diff
--- a/c/regexParser/createBitVectorList.cc	Tue Nov 17 19:37:29 2015 +0900
+++ b/c/regexParser/createBitVectorList.cc	Tue Nov 17 22:20:42 2015 +0900
@@ -7,82 +7,106 @@
 extern BitVectorPtr bitSet(int);
 extern void bitPrint(BitVectorPtr);
 BitVectorListPtr createBitVector(NodePtr);
-BitVectorListPtr descendTreeNode(NodePtr,BitVectorListPtr);
-BitVectorListPtr setNextBitVectorList(BitVectorListPtr bvl, BitVectorListPtr next, NodePtr n);
+BitVectorListPtr descendTreeNode(NodePtr, BitVectorListPtr, BitVectorListPtr, bool&);
+BitVectorListPtr setNextBitVectorList(NodePtr n, BitVectorListPtr bvl, BitVectorListPtr next);
 
 BitVectorListPtr initBvl;
 
 BitVectorListPtr allocateBitVectorList() {
-    BitVectorListPtr bvl = (BitVectorListPtr)malloc(sizeof(BitVectorList));
-    bvl->self = bvl;
-    bvl->bi = (BitVectorPtr)malloc(sizeof(BitVector));
+  BitVectorListPtr bvl = (BitVectorListPtr)malloc(sizeof(BitVectorList));
+  bvl->self = bvl;
+  bvl->bi = (BitVectorPtr)malloc(sizeof(BitVector));
 
-    return bvl;
+  return bvl;
 }
 
 BitVectorListPtr createBitVector(NodePtr n,BitVectorListPtr bvl) {
-    BitVectorListPtr nextBvl = bvl->next[(int)n->Value.character] = allocateBitVectorList();
-    nextBvl->self = bvl->next[(int)n->Value.character];
-    nextBvl->bi = bitSet(n->nodeNumber);
-    nextBvl->initBvl = initBvl;
-
-    return nextBvl;
+  BitVectorListPtr nextBvl = allocateBitVectorList();
+  nextBvl->bi = bitSet(n->nodeNumber);
+  nextBvl->initBvl = initBvl;
+  return nextBvl;
 }
 
 
 BitVectorListPtr initBitVector() {
-
-    BitVectorListPtr bvl = allocateBitVectorList();
-    bvl->initBvl = initBvl = bvl;
-    bvl->bi = bitSet(0);
+  
+  BitVectorListPtr bvl = allocateBitVectorList();
+  bvl->initBvl = initBvl = bvl;
+  bvl->bi = bitSet(0);
 
-    for (int i = 0; i < 256; i++) {
-        bvl->next[i] = NULL;
-    }
+  for (int i = 0; i < 256; i++) {
+    bvl->next[i] = NULL;
+  }
 
-    return bvl;
+  return bvl;
 }
 
 void printBitVectorList (BitVectorListPtr bvl) {
-    bool initPrintFlag = true;
-    for (int i = 0; i < 256; i++) {
-        if (bvl->next[i] != NULL) {
-            if (initPrintFlag) {
-                puts("----");
-                printf("     state : "); bitPrint(bvl->bi);
-                initPrintFlag = false;
-            }
-            printf("input char : %c\n",i);
-            printf("next state : "); bitPrint(bvl->next[i]->bi);
-        }
+  bool isFirstPrint = true;
+  for (int i = 0; i < 256; i++) {
+    if (bvl->next[i] != NULL) {
+      if (isFirstPrint){
+        puts("----");
+        printf("     state : "); bitPrint(bvl->bi);
+        isFirstPrint = false;
+      }
+      printf("input char : %c\n",i);
+      printf("next state : ");bitPrint(bvl->next[i]->bi);
+    }
+  }
+  
+  for (int i = 0; i < 256; i++) {
+    if (bvl->next[i] != NULL) {
+      printBitVectorList(bvl->next[i]);
+    }
+  }
+}
+
+BitVectorListPtr descendTreeNode(NodePtr n,BitVectorListPtr bvl, BitVectorListPtr prev, bool &fromOr) {
+  bool leftIsOr, rightIsOr;
+  if (n->tokenType == '*') {
+    
+  } else if (n->Value.character == '|') {
+    bvl = descendTreeNode(n->left, bvl, prev, leftIsOr);
+    setNextBitVectorList(n->left, prev, bvl);
+    bvl = descendTreeNode(n->right, bvl, prev, rightIsOr);
+    setNextBitVectorList(n->right, prev, bvl);
+    fromOr = true;
+    return prev;
+  } else if (n->Value.character == '+') {
+    bvl = descendTreeNode(n->left, bvl, prev, leftIsOr);
+    setNextBitVectorList(n->left, prev, bvl);
+    prev = bvl;
+    bvl = descendTreeNode(n->right, bvl, prev, rightIsOr);
+
+    if (leftIsOr){
+      for (int i = 0; i < 256; i++)
+        if (prev->next[i] != NULL)
+          setNextBitVectorList(n->right, prev->next[i], bvl);
+    }
+    else {
+      setNextBitVectorList(n->right, prev, bvl);
     }
 
-    for (int i = 0; i < 256; i++) {
-        if (bvl->next[i] != NULL) {
-            printBitVectorList(bvl->next[i]);
-        }
-    }
+    fromOr = false;
+  } else if (n->tokenType == 'a') {
+    bvl = createBitVector(n,bvl);
+    fromOr = false;
+  }
+  return bvl;
 }
 
-BitVectorListPtr descendTreeNode(NodePtr n,BitVectorListPtr bvl) {
-
-    if (n->Value.character == '*') {
-        bvl = descendTreeNode(n->left,bvl);
-    } else if (n->Value.character == '|') {
-        bvl = descendTreeNode(n->left,bvl);
-        bvl = descendTreeNode(n->parent->right,bvl);
-    } else if (n->Value.character == '+') {
-        bvl = descendTreeNode(n->left,bvl);
-        bvl = descendTreeNode(n->right,bvl);
-    } else if (n->tokenType == 'a') {
-        bvl = createBitVector(n,bvl);
-    }
-    return bvl;
+BitVectorListPtr setNextBitVectorList(NodePtr n, BitVectorListPtr bvl, BitVectorListPtr next){
+  if (isalnum((int)n->Value.character)){
+    bvl->next[(int)n->Value.character] = next;
+  }
+  return next;
 }
 
 BitVectorListPtr createBitVectorList(NodePtr n) {
-    BitVectorListPtr bvl = initBitVector();
-    descendTreeNode(n,bvl);
-    printBitVectorList(bvl);
-    return bvl;
+  BitVectorListPtr bvl = initBitVector();
+  bool fromOr = false;
+  descendTreeNode(n, bvl, bvl, fromOr);
+  printBitVectorList(bvl);
+  return bvl;
 }