# HG changeset patch # User Kaito Tokumori # Date 1447766442 -32400 # Node ID 3eb3cb5d581f2e46bad139b207d4f8e3a19a18de # Parent 4ad2a75dec4a282e71458cd439de47fe8a800eb2 implemented 'or' node translator diff -r 4ad2a75dec4a -r 3eb3cb5d581f c/regexParser/createBitVectorList.cc --- 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; } diff -r 4ad2a75dec4a -r 3eb3cb5d581f c/regexParser/createRegexParser.cc --- a/c/regexParser/createRegexParser.cc Tue Nov 17 19:37:29 2015 +0900 +++ b/c/regexParser/createRegexParser.cc Tue Nov 17 22:20:42 2015 +0900 @@ -41,19 +41,14 @@ // ::= '[''-'']' NodePtr charClass(RegexInfoPtr ri) { NodePtr n = (NodePtr)malloc(sizeof(Node)); - unsigned char startChar = ri->ptr[0]; while (ri->ptr[0] == '-') { ri->ptr++; } - unsigned char endChar = ri->ptr[0]; - unsigned char *charTable = (unsigned char*)malloc(sizeof(char)*256); - return n; } // ::= [a-z][A-Z][0-9] NodePtr literal(RegexInfoPtr ri) { - unsigned char *top = ri->ptr; NodePtr n = createNode(ri,ri->ptr[0],0,0); ri->ptr++; return n;