Mercurial > hg > Applications > Grep
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; +}