# HG changeset patch # User Masataka Kohagura # Date 1452775595 -32400 # Node ID c38a7b2dd996f5638fbef5d18e7a5706fe262fdd # Parent 78174ff2f338c0f4698d6b8d5d3884d7d3b08a7f implement exportState function (not correct working) diff -r 78174ff2f338 -r c38a7b2dd996 regexParser/Makefile --- a/regexParser/Makefile Sat Jan 02 15:34:37 2016 +0900 +++ b/regexParser/Makefile Thu Jan 14 21:46:35 2016 +0900 @@ -29,7 +29,7 @@ clean: rm -f $(TARGET) $(OBJS) - rm -f *~ \#* *.gcda *.gcno *.gcov + rm -f *~ \#* *.gcda *.gcno *.gcov state.cc .SUFFIXES: .cc .o diff -r 78174ff2f338 -r c38a7b2dd996 regexParser/main.cc --- a/regexParser/main.cc Sat Jan 02 15:34:37 2016 +0900 +++ b/regexParser/main.cc Thu Jan 14 21:46:35 2016 +0900 @@ -31,12 +31,13 @@ TGValue tgv = generateTransitionList(n); printTree(n); printState(tgv.tg); + exportState(tgv.tg); } else if (subset) { TGValue tgv = generateTransitionList(n); SCValue scv = createSCValue(tgv); subsetConstruction(scv); // Determinization printState(tgv.tg); + exportState(tgv.tg); } - return 0; } diff -r 78174ff2f338 -r c38a7b2dd996 regexParser/subsetConstruction.cc --- a/regexParser/subsetConstruction.cc Sat Jan 02 15:34:37 2016 +0900 +++ b/regexParser/subsetConstruction.cc Thu Jan 14 21:46:35 2016 +0900 @@ -8,6 +8,8 @@ #include "BitVector.h" #include "error.h" +#define SIZE 256 + CharClassPtr createCharClassRange(unsigned long begin, unsigned long end,unsigned long state, CharClassPtr left, CharClassPtr right) { CharClassPtr cc = NEW(CharClass); cc->type = 'r'; @@ -312,6 +314,39 @@ return tgv; } +void exportState(TransitionGeneratorPtr tg) { + StatePtr state = tg->stateList; + FILE *fp = fopen("state.cc","w"); + char s[SIZE]; + + fputs("unsigned char *buff, *buffptr, buffend;\n",fp); + for (;state;state = state->next) { + sprintf(s,"void state%lx() {\n",state->bitState.bitContainer); + fputs(s,fp); + if (state->cc->cond.range.begin == state->cc->cond.range.end) { + if (state->cc) { // not Accept + fputs(" unsigned char c = *buffptr++;\n",fp); + sprintf(s," if (c='%c') state%lu();\n",(unsigned char)state->cc->cond.range.begin, state->cc->nextState.bitContainer); + fputs(s,fp); + } else { // Accept + fputs(" // Accept\n",fp); + } + } else { + if (state->cc) { // not Accept + fputs(" unsigned char c = *buffptr++;\n",fp); + sprintf(s," if (c<'%c') state%lu();\n",(unsigned char)state->cc->cond.range.begin, state->cc->nextState.bitContainer); + fputs(s,fp); + sprintf(s," if (c<'%c') state%lu();\n",(unsigned char)state->cc->cond.range.end, state->cc->nextState.bitContainer); + fputs(s,fp); + } else { // Accept + fputs(" // Accept\n",fp); + } + } + fputs("}\n",fp); + } + fclose(fp); +} + void printState(StatePtr state) { printf("state : %lx\n",state->bitState.bitContainer); long nodeNumber = 0; diff -r 78174ff2f338 -r c38a7b2dd996 regexParser/subsetConstruction.h --- a/regexParser/subsetConstruction.h Sat Jan 02 15:34:37 2016 +0900 +++ b/regexParser/subsetConstruction.h Thu Jan 14 21:46:35 2016 +0900 @@ -1,6 +1,7 @@ extern CharClassPtr charClassMerge(CharClassPtr cc,unsigned long begin, unsigned long end, BitVector nextState); extern TGValue createTGValue(); extern CharClassPtr mergeTransition(StatePtr x,CharClassPtr y); +extern void exportState(TransitionGeneratorPtr tg); extern void setState(CharClassPtr cc, BitVector bi); extern StatePtr createState(TGValue tgv,NodePtr n); extern TGValue generateTransitionList(NodePtr n);