changeset 202:39ca25ed0607

add searchBit test
author Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
date Sat, 26 Dec 2015 19:49:34 +0900
parents b8bc24abaf8a
children e809a2dd0731
files regexParser/Makefile regexParser/TODO regexParser/bitVector.h regexParser/subsetConstraction.cc regexParser/test/searchBit.cc
diffstat 5 files changed, 76 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/regexParser/Makefile	Sat Dec 26 18:13:32 2015 +0900
+++ b/regexParser/Makefile	Sat Dec 26 19:49:34 2015 +0900
@@ -15,6 +15,8 @@
 $(TARGET):$(OBJS)
 	$(CC) -o $@ $(OBJS)
 
+test/searchBit: test/searchBit.cc
+	$(CC) -I. $< bitVector.cc -o $@
 
 clean:
 	rm -f $(TARGET) $(OBJS)
--- a/regexParser/TODO	Sat Dec 26 18:13:32 2015 +0900
+++ b/regexParser/TODO	Sat Dec 26 19:49:34 2015 +0900
@@ -1,3 +1,4 @@
 2015年 12月26日 土曜日 18時07分00秒 JST
     TODO CharClassWalker のテストルーチンを作成する
     TODO CharClassMerge のテストルーチンを作成する
+    TODO serchBit のテストルーチンを作成する
--- a/regexParser/bitVector.h	Sat Dec 26 18:13:32 2015 +0900
+++ b/regexParser/bitVector.h	Sat Dec 26 19:49:34 2015 +0900
@@ -2,3 +2,7 @@
 extern const BitVectorPtr allocateBitVector();
 extern void bitSet(BitVectorPtr bi, int bitSetPosition);
 extern void bitPrint(BitVectorPtr bi);
+
+inline int searchBit(BitVector bi) {
+    return __builtin_ffs(bi.bitContainer);
+}
--- a/regexParser/subsetConstraction.cc	Sat Dec 26 18:13:32 2015 +0900
+++ b/regexParser/subsetConstraction.cc	Sat Dec 26 19:49:34 2015 +0900
@@ -349,3 +349,58 @@
         putchar('\n');
     }
 }
+
+SCValue createSCValue(TGValue tgv) {
+    SCValue scv;
+    scv.stateTop = tgv.tg->stateList;
+    scv.stateEnd = scv.stateTop;
+    while (scv.stateEnd->next) {
+        scv.stateEnd = scv.stateEnd->next;
+    }
+    return;
+}
+
+SCValue createState(SCValue scv,BitVector bi) {
+    StatePtr s = NEW(State);
+    s->stateNum = ++scv.tg->totalStateCount;
+    s->next = NULL;
+    scv.stateEnd->next = s;
+    scv.stateEnd = s;
+    s->bitState = bi;
+    s->cc = NULL;
+    return scv;
+}
+
+/**
+    現在のステートに含まれる組み合わせ状態をとってくる
+    組み合わされた個々の charclass をmerge して新しい charclass をつくり、組み合わせ状態に登録する
+    生成した状態は stateArray に格納するA
+    新しい状態ができなくなったら終了
+    
+    charClassMerge の段階で新しい状態をリストに登録したら、charclasswalk をする必要がなくなる
+ */
+SCValue subsetConstraction(SCValue scv) {
+    for (;scv.stateTop;scv.stateTop = scv.stateTop->next) {
+        CharClassWalker cw = createCharClassWalker(scv.stateTop->cc);
+        while (hasNext(cw)) {
+            CharClassPtr cc = getNext(cw);
+            unsigned long bi = cc->nextState.bitContainer;
+            if (scv.stateArray[bi]) continue;
+            scv = createState(scv,bi);
+            StatePtr s = scv.stateEnd;
+            for (;bi.bitContainer;) {
+                int bitPosition = searchBit(bi);
+                unsigned long baseNum = 1 << bitPosition;
+                bi.bitContainer ^= baseNum; 
+                StatePtr base = scv.stateArray[baseNum];
+                if (base == NULL) {// error
+                    continue;
+                }
+                CharClassPtr merge = mergeTransition(s,base->cc);
+                s->cc = merge;
+            }
+            scv.stateArray[bi] = s;
+        }
+    }
+    return;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/regexParser/test/searchBit.cc	Sat Dec 26 19:49:34 2015 +0900
@@ -0,0 +1,14 @@
+#include <stdio.h>
+#include "regexParser.h"
+#include "bitVector.h"
+
+int main () {
+    unsigned long x1 = 0x1000011;
+    BitVector bi = createBitVector(0);
+    bi.bitContainer = x1;
+    printf("%lx pos %d\n",bi.bitContainer,searchBit(bi));
+    unsigned long x2 = 0x1000010;
+    bi.bitContainer = x2;
+    printf("%lx pos %d\n",bi.bitContainer,searchBit(bi));
+    return 1;
+}