diff regexParser/subsetConstruction.cc @ 222:c38a7b2dd996

implement exportState function (not correct working)
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Thu, 14 Jan 2016 21:46:35 +0900
parents 4dc8d327cc7d
children e430b7d0b33d
line wrap: on
line diff
--- 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;