Mercurial > hg > Members > shinya > pyrect
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"