changeset 82:f3cbc5d373f8

experimentation, use table-lookup at first state's transition.
author Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp>
date Wed, 10 Nov 2010 22:46:47 +0900
parents 3dc381c90870
children
files pyrect/translator/grep_translator.py
diffstat 1 files changed, 19 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/pyrect/translator/grep_translator.py	Wed Nov 10 22:00:24 2010 +0900
+++ b/pyrect/translator/grep_translator.py	Wed Nov 10 22:46:47 2010 +0900
@@ -43,21 +43,20 @@
 
     def emit_initialization(self):
         self.emit("#include <stdio.h>")
-        self.emit("#define GREP grep")
         self.emit("#include <stdlib.h>")
         self.emit("#include <sys/mman.h>")
         self.emit("#include <sys/types.h>")
         self.emit("#include <sys/stat.h>")
         self.emit("#include <fcntl.h>")
         self.emit("#include <unistd.h>")
-        self.emit("#include <string.h>")
+        self.emit("#include <string.h>", 2)
 
         self.emit("typedef unsigned char   UCHAR;")
-        self.emit("typedef unsigned char *UCHARP;")
+        self.emit("typedef unsigned char *UCHARP;", 2)
 
         self.emit('void reject(%s);' % self.interface)
-        self.emit("void matcher(%s);" % self.interface, 2)
-        self.emit('void accept(%s);' % self.interface)
+        self.emit("void matcher(%s);" % self.interface)
+        self.emit('void accept(%s);' % self.interface, 2)
 
         key = None
 
@@ -86,6 +85,15 @@
         else:
             self.skip_boost = False
 
+        self.emiti("void (*first_state_tbl[256])(UCHARP, UCHARP, UCHARP) = {")
+        tbl = ["booster"] * 256
+        for c, n in self.cg.map[self.cg.start].iteritems():
+            if type(c) != Character: continue
+            else: tbl[c.char] = self.state_name(n)
+        tbl[0] = tbl[10] = tbl[13] = "reject"
+        self.emit(", ".join(tbl))
+        self.emitd("};", 2)
+
         grepsource = open(self.BASE_DIR + "/template/grep.c")
         self.emit(grepsource.read())
 
@@ -210,7 +218,7 @@
         else:
             self.emit(   "%s(%s);" % (self.state_name(self.cg.start), self.args))
         self.emit(   "return;")
-        self.emitd("}")
+        self.emitd("}", 2)
         return
 
     def emit_accept_state(self):
@@ -258,6 +266,11 @@
             self.emitd("}", 2)
             return
 
+        if cur_state == self.cg.start:
+            self.emit(   "return first_state_tbl[*buf++](%s);" % self.args)
+            self.emitd("}", 2)
+            return
+
         default = self.state_name(self.cg.start)
         for eol in self.eols:
             transition[eol] = "reject"