changeset 95:f42e37e2fe93

implement table-lookup at booster.
author Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp>
date Mon, 06 Dec 2010 05:02:15 +0900
parents 492f543703d5
children 7649b26eeb4d
files pyrect/translator/goto_grep_translator.py pyrect/translator/grep_translator.py
diffstat 2 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/pyrect/translator/goto_grep_translator.py	Mon Dec 06 04:48:06 2010 +0900
+++ b/pyrect/translator/goto_grep_translator.py	Mon Dec 06 05:02:15 2010 +0900
@@ -274,7 +274,7 @@
     def emit_state(self, cur_state, transition):
         if self.filter_only: return
 
-        self.demiti("%s:;" % self.state_name(cur_state))
+        self.demiti("%s:" % self.state_name(cur_state))
 
         if cur_state in self.cg.accepts:
             self.emit(   "buf--;")
@@ -297,7 +297,7 @@
                 tbl[eol.char] = "reject"
             for c, n in transition.iteritems():
                 tbl[c.char] = self.state_name(n)
-            self.emit(   "static const void *%s_table[256] = {[0 ... 255] &&%s, %s};"
+            self.emit(   ";static const void *%s_table[256] = {[0 ... 255] &&%s, %s};"
                          % (self.state_name(cur_state), default,
                             ", ".join(["[%d] &&%s" % (i, s) for (i, s) in tbl.items()])))
             self.emit(   "goto *%s_table[*buf++];" % self.state_name(cur_state))
--- a/pyrect/translator/grep_translator.py	Mon Dec 06 04:48:06 2010 +0900
+++ b/pyrect/translator/grep_translator.py	Mon Dec 06 05:02:15 2010 +0900
@@ -194,11 +194,17 @@
         self.emit(   "UCHARP end_ = end - %d;" % (min_len-1))
         self.emit(   "if (buf > end_) return;")
         self.emiti(  "do {")
-        self.emiti(    "switch (buf[%d]) {" % (min_len-1))
-        for c in chars:
-            self.emit(   "case %d: /* %s */" % (ord(c), Character.ascii(c)))
-        self.emit(       "goto ret;")
-        self.demit(    "}")
+        if self.table_lookup and False:
+            self.emit("static const void *tbl[256] = {[0 ... 255] &&ends, %s};"
+                      % ", ".join("[%d] &&ret" % ord(x) for x in chars))
+            self.emit("goto *tbl[buf[%d]];" % (min_len-1))
+            self.emit("ends:;")
+        else:
+            self.emiti(    "switch (buf[%d]) {" % (min_len-1))
+            for c in chars:
+                self.emit(   "case %d: /* %s */" % (ord(c), Character.ascii(c)))
+            self.emit(       "goto ret;")
+            self.demit(    "}")
         self.demit(  "} while((buf += %d) <= end_);" % min_len)
         self.emit(   "ret: return %s(%s);" % (self.state_name(self.cg.start) , self.args))
         self.demit("}", 2)