# HG changeset patch # User Masataka Kohagura # Date 1452844023 -32400 # Node ID 0c28ff35b4f042dc70883353ed26bc777fe2b712 # Parent 474fc9f844dbecae0b69a0f251c11a0cf2fe7aa0 add generateSequentialSearch diff -r 474fc9f844db -r 0c28ff35b4f0 regexParser/generateSequentialSearch.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/regexParser/generateSequentialSearch.cc Fri Jan 15 16:47:03 2016 +0900 @@ -0,0 +1,60 @@ +#include + +#include "generateSequentialSearch.h" +#include "subsetConstruction.h" + +void exportState(TransitionGeneratorPtr tg) { + StatePtr state = tg->stateList; + FILE *fp = fopen("state.cc","w"); + fputs("unsigned char *buff, *buffptr, buffend;\n",fp); + fputs( +"void stateSkip() {\n" +" matchBegin = buffptr;\n" +" state1();\n" +"}\n" +"\n" +"void stateMatch() {\n" +" fwrite(matchBegin,buffptr-matchBegin,1,fp);\n" +" fputs(\"\\n\");\n" +" stateSkip();\n" +"}\n" + ,fp); + for (;state;state = state->next) { + fprintf(fp,"void state%lx();\n",state->bitState.bitContainer); + } + fputs("\n",fp); + for (;state;state = state->next) { + fprintf(fp,"void state%lx() {\n",state->bitState.bitContainer); + if (state->bitState.bitContainer == 2) { // Accept + fputs(" // Accept\n",fp); + } else { // not Accept + fputs(" unsigned char c = *buffptr++;\n",fp); + CharClassWalkerPtr ccw = createCharClassWalker(state->cc); + bool flag = true; + while (hasNext(ccw)) { + CharClassPtr cc = getNext(ccw); + unsigned long begin = cc->cond.range.begin; + unsigned long end = cc->cond.range.end; + BitVector bi = cc->nextState; + if (flag) { + flag = false; + } else { + fputs(" else ",fp); + } + if (begin == end) { + fprintf(fp," if (c=='%c') state%lu();\n",(unsigned char)begin, bi.bitContainer); + } else { + fprintf(fp," if (c<'%c') state1();\n",(unsigned char)begin); + fprintf(fp," else if (c<='%c') state%lu();\n",(unsigned char)end, bi.bitContainer); + } + } + if (state->bitState.bitContainer == 2) { + fprintf(fp," else stateMatch();\n"); + } else { + fprintf(fp," else stateSkip();\n"); + } + } + fputs("}\n\n",fp); + } + fclose(fp); +} diff -r 474fc9f844db -r 0c28ff35b4f0 regexParser/generateSequentialSearch.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/regexParser/generateSequentialSearch.h Fri Jan 15 16:47:03 2016 +0900 @@ -0,0 +1,3 @@ +#include "regexParser.h" + +extern void exportState(TransitionGeneratorPtr tg); diff -r 474fc9f844db -r 0c28ff35b4f0 regexParser/subsetConstruction.cc --- a/regexParser/subsetConstruction.cc Fri Jan 15 16:12:19 2016 +0900 +++ b/regexParser/subsetConstruction.cc Fri Jan 15 16:47:03 2016 +0900 @@ -314,48 +314,6 @@ 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->bitState.bitContainer == 2) { // Accept - fputs(" // Accept\n",fp); - } else { // not Accept - fputs(" unsigned char c = *buffptr++;\n",fp); - CharClassWalkerPtr ccw = createCharClassWalker(state->cc); - bool flag = true; - while (hasNext(ccw)) { - CharClassPtr cc = getNext(ccw); - unsigned long begin = cc->cond.range.begin; - unsigned long end = cc->cond.range.end; - BitVector bi = cc->nextState; - if (flag) { - flag = false; - } else { - fputs(" else ",fp); - } - if (begin == end) { - sprintf(s," if (c=='%c') state%lu();\n",(unsigned char)begin, bi.bitContainer); - fputs(s,fp); - } else { - sprintf(s," if (c<'%c') state1();\n",(unsigned char)begin); - fputs(s,fp); - sprintf(s," else if (c<='%c') state%lu();\n",(unsigned char)end, bi.bitContainer); - fputs(s,fp); - } - } - sprintf(s," else state1();\n"); - fputs(s,fp); - } - fputs("}\n\n",fp); - } - fclose(fp); -} - void printState(StatePtr state) { printf("state : %lx\n",state->bitState.bitContainer); long nodeNumber = 0; diff -r 474fc9f844db -r 0c28ff35b4f0 regexParser/subsetConstruction.h --- a/regexParser/subsetConstruction.h Fri Jan 15 16:12:19 2016 +0900 +++ b/regexParser/subsetConstruction.h Fri Jan 15 16:47:03 2016 +0900 @@ -5,6 +5,9 @@ extern void setState(CharClassPtr cc, BitVector bi); extern StatePtr createState(TGValue tgv,NodePtr n); extern TGValue generateTransitionList(NodePtr n); +extern CharClassPtr getNext(CharClassWalkerPtr walk); +extern bool hasNext(CharClassWalkerPtr walk); +extern CharClassWalkerPtr createCharClassWalker (CharClassPtr next); extern void printState(TransitionGeneratorPtr tg); extern SCValue createSCValue(TGValue tgv) ; extern SCValue subsetConstruction(SCValue scv) ;