view regexParser/node.cc @ 236:c90d155c1063

add test
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Tue, 19 Jan 2016 18:21:09 +0900
parents a9e3512120e2
children 3e78631a6222
line wrap: on
line source

#include <stdio.h>
#include "regexParser.h"
#include "node.h"

void printCharacterClass(CharClassPtr cc, long nodeNumber,int d) {
    if (!cc) return;
    if (cc->type == 'a' || cc->type == 'r') {
        if (cc->left) {
            printCharacterClass(cc->left,nodeNumber,d+1);
        }
        printf("%*c",d*4, ' ');
        for (RangeList range = cc->cond.range; range.begin != 0;) {
           printf("[%c-%c] ",(unsigned char)range.begin,(unsigned char)range.end);
           if (range.next != NULL) {
                range = *range.next;
           } else {
                break;
           }
        }
        printf("(%lx)\n",cc->nextState.bitContainer);
        if (cc->right) {
            printCharacterClass(cc->right,nodeNumber,d+1);
        }
    }
}

void descendTree(NodePtr n, int d) {
    if (n->left != NULL) {
        descendTree(n->left, d+1);
    }
    if (n->tokenType == 'a') {
        printf("%*c",d*4, ' ');
        for (int i = 0; i < n->cc->cond.w.length; i++) {
            putchar(n->cc->cond.w.word[i]);
        }
        if (n->state && n->nextState) {
            printf("(%ld)->(%ld)\n",n->state->bitState.bitContainer,n->nextState->bitState.bitContainer);
        } else if (n->state) {
            printf("(%ld)\n",n->state->bitState.bitContainer);
        } else {
            printf("\n");
        }
    } else if (n->tokenType == 'c') {
        printCharacterClass(n->cc,n->stateNum,d);
    } else if (n->tokenType == 'a') {
        printf("%*c%c(%d)\n",d*4, ' ',n->tokenType,n->stateNum);
    } else {
        printf("%*c%c\n",d*4, ' ',n->tokenType);
    }

    if (n->right != NULL) {
        descendTree(n->right, d+1);
    }
}

void printTree(NodePtr n) {
    puts("---Print Node----");
    int d = 0;
    descendTree(n,d);
    puts("-----------------");
}