view c/regexParser/createBitVectorList.cc @ 101:2cc097419169 impl-bitvector

fix print
author masasann
date Tue, 17 Nov 2015 06:51:12 +0900
parents 804e51f19f17
children 07f4761c6c58
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "bitVector.h"
#include "regexParser.h"

extern BitVectorPtr bitSet(int);
extern void bitPrint(BitVectorPtr);
BitVectorListPtr createBitVector(NodePtr);
BitVectorListPtr descendTreeNode(NodePtr,BitVectorListPtr);
BitVectorListPtr setNextBitVectorList(BitVectorListPtr bvl, BitVectorListPtr next, NodePtr n);

BitVectorListPtr initBvl;

BitVectorListPtr allocateBitVectorList() {
    BitVectorListPtr bvl = (BitVectorListPtr)malloc(sizeof(BitVectorList));
    bvl->self = bvl;
    bvl->bi = (BitVectorPtr)malloc(sizeof(BitVector));

    return bvl;
}

BitVectorListPtr createBitVector(NodePtr n,BitVectorListPtr bvl) {
  //    BitVectorListPtr nextBvl = bvl->next[(int)n->Value.character] = allocateBitVectorList();
    BitVectorListPtr nextBvl = allocateBitVectorList();
    //    nextBvl->self = bvl->next[(int)n->Value.character];
    nextBvl->bi = bitSet(n->nodeNumber);
    nextBvl->initBvl = initBvl;

    return nextBvl;
}


BitVectorListPtr initBitVector() {

    BitVectorListPtr bvl = allocateBitVectorList();
    bvl->initBvl = initBvl = bvl;
    bvl->bi = bitSet(0);

    for (int i = 0; i < 256; i++) {
        bvl->next[i] = NULL;
    }

    return bvl;
}

void printBitVectorList (BitVectorListPtr bvl) {
  bool flag = true;
    for (int i = 0; i < 256; i++) {
        if (bvl->next[i] != NULL) {
	  if (flag){
	    puts("----");
	    printf("     state : "); bitPrint(bvl->bi);
	    flag = 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 = bvl;
    if (n->tokenType == '*') {

    } else if (n->Value.character == '|') {
      setNextBitVectorList(prev,descendTreeNode(n->left,bvl),n->left);
      bvl = setNextBitVectorList(bvl,descendTreeNode(n->right,bvl),n->right);
	
    } else if (n->Value.character == '+') {
      bvl = setNextBitVectorList(prev,descendTreeNode(n->left,bvl),n->left);
      bvl = setNextBitVectorList(bvl,descendTreeNode(n->right,bvl),n->right);
    } else if (n->tokenType == 'a') {
        bvl = createBitVector(n,bvl);
    }
    return bvl;
}

BitVectorListPtr setNextBitVectorList(BitVectorListPtr bvl, BitVectorListPtr next, NodePtr n){
  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;
}