# HG changeset patch # User Ryoma SHINYA # Date 1291579335 -32400 # Node ID f42e37e2fe931ca9c65e2ab21feca322ccdda7a9 # Parent 492f543703d583d0fcc89594208f7ffff6218e5d implement table-lookup at booster. diff -r 492f543703d5 -r f42e37e2fe93 pyrect/translator/goto_grep_translator.py --- 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)) diff -r 492f543703d5 -r f42e37e2fe93 pyrect/translator/grep_translator.py --- 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)