diff c/regexParser/subsetConstraction.cc @ 110:a3adc5c24e19 pairPro

start branch
author masa
date Fri, 20 Nov 2015 21:02:00 +0900
parents c/regexParser/createBitVectorList.cc@6401c708f5dd
children 66c633575b53
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/c/regexParser/subsetConstraction.cc	Fri Nov 20 21:02:00 2015 +0900
@@ -0,0 +1,88 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "bitVector.h"
+#include "regexParser.h"
+
+
+void printBitVectorList (BitVectorListPtr bvl) {
+    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);
+            bvl->isLoop = bvl->isLoopAnker;
+        }
+    }
+
+    for (int i = 0; i < 256; i++) {
+        if ((bvl->next[i] != NULL) && !(bvl->isLoop && bvl->isLoopAnker)) {
+        // if ((bvl->next[i] != NULL) ) {
+            printBitVectorList(bvl->next[i]);
+        }
+    }
+}
+
+BitVectorListPtr descendTreeNode(NodePtr n,BitVectorListPtr bvl, BitVectorListPtr prev, bool &fromOr, bool &fromAsterisk) {
+    bool leftIsOr, rightIsOr;
+    if (n->Value.character == '*') {
+        bvl = descendTreeNode(n->left, bvl, prev, leftIsOr, fromAsterisk);
+        unsigned char repertChar = 0;
+        for (int i = 0; i < 256; i++) {
+            if (prev->next[i] != NULL) repertChar = i;
+        }
+        setNextBitVectorList(repertChar, bvl, prev->next[repertChar]); // here
+        bvl->isLoopAnker = true;
+        fromAsterisk = true;
+
+        return prev;
+    } else if (n->Value.character == '|') {
+        bvl = descendTreeNode(n->left, bvl, prev, leftIsOr, fromAsterisk);
+        setNextBitVectorList(n->left->Value.character, prev, bvl);
+        bvl = descendTreeNode(n->right, bvl, prev, rightIsOr, fromAsterisk);
+        setNextBitVectorList(n->right->Value.character, prev, bvl);
+        fromOr = true;
+        return prev;
+    } else if (n->Value.character == '+') {
+        bvl = descendTreeNode(n->left, bvl, prev, leftIsOr, fromAsterisk);
+        setNextBitVectorList(n->left->Value.character, prev, bvl);
+        prev = bvl;
+        bvl = descendTreeNode(n->right, bvl, prev, rightIsOr, fromAsterisk);
+
+        if (leftIsOr){
+            for (int i = 0; i < 256; i++)
+                if (prev->next[i] != NULL)
+                    setNextBitVectorList(n->right->Value.character, prev->next[i], bvl);
+        }
+        else {
+            setNextBitVectorList(n->right->Value.character, prev, bvl);
+        }
+
+        fromOr = false;
+    } else if (n->tokenType == 'a') {
+        bvl = createBitVector(n,bvl);
+        fromOr = false;
+    }
+    return bvl;
+}
+
+BitVectorListPtr setNextBitVectorList(unsigned char inputChar, BitVectorListPtr bvl, BitVectorListPtr next){
+    if (isalnum((int)inputChar)){
+        bvl->next[(int)inputChar] = next;
+    }
+    return next;
+}
+
+BitVectorListPtr createBitVectorList(NodePtr n) {
+    BitVectorListPtr bvl = initBitVector();
+    bool fromOr = false;
+    bool fromAsterisk = false;
+    descendTreeNode(n, bvl, bvl, fromOr, fromAsterisk);
+    printBitVectorList(bvl);
+    return bvl;
+}