Mercurial > hg > Members > shinya > pyrect
changeset 41:ffbbdd33881d
modify cbcgrep, remove global variable to args(interface).
author | Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 02 Aug 2010 04:02:19 +0900 |
parents | 962ae4154724 |
children | 84059ea1a2db |
files | pyrect/cbcgrep_translator.py pyrect/template/grep.cbc |
diffstat | 2 files changed, 56 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/pyrect/cbcgrep_translator.py Tue Jul 20 17:26:54 2010 +0900 +++ b/pyrect/cbcgrep_translator.py Mon Aug 02 04:02:19 2010 +0900 @@ -22,6 +22,8 @@ if cg.type == "NFA": raise CbCGREPTranslateExeption("can't translate grep from NFA") GREPTranslator.__init__(self, regexp, cg) self.funType = '__code ' + self.interface = "char *s, char* cur, char* buf, FILE *f, char* filename" + self.args = "s, cur, buf, f, filename" self.callType = 'goto ' self.breakStatement = '' self.print_file = False @@ -35,42 +37,46 @@ bufsize = property(getbufsize, setbufsize) def emit_accept_state(self): - self.emit("__code accept(char* s) {\n") + self.emit("__code accept(%s) {\n" % self.interface) if self.print_file: self.emit(" printf(\"%s: %s\\n\", filename, buf);\n") else: self.emit(" printf(\"%s\\n\", buf);\n") - self.emit(" goto next_line(s);\n}\n\n") + self.emit(" goto next_line(%s);\n}\n\n" % self.args) def emit_reject_state(self): self.emit(""" -__code reject(char* s) { - goto next_ptr(); +__code reject(%s) { + goto next_ptr(%s); } -""") +""" % (self.interface, self.args)) def emit_next_state(self): self.emit (""" -__code next_ptr() { +__code next_ptr(%s) { if(*cur++ == '\\0') - goto next_line(); - goto DFA(cur); + goto next_line(%s); + s = cur; + goto DFA(%s); } -""") +""" % (self.interface, self.args, self.args)) self.emit(""" -__code next_line() { - if(fgets(buf, sizeof buf, f) == NULL) +__code next_line(%s) { + if(fgets(buf, LINEBUFSIZE, f) == NULL) { goto returner(); + } int n = strlen(buf); if (n > 0 && buf[n-1] == '\\n') buf[n-1] = '\\0'; cur = buf; - goto DFA(buf); + s = cur; + goto DFA(%s); } -""") +""" % (self.interface, self.args)) self.emit(""" __code returner() { + puts(\"returner\"); return; }""") @@ -80,18 +86,15 @@ self.emit("#include <string.h>\n\n") self.emit("#define LINEBUFSIZE 1024\n") self.emit("#define READBUFSIZE %d\n\n" % self.bufsize) - self.emit("char readbuf[READBUFSIZE], buf[LINEBUFSIZE];\n") - self.emit("char *cur, *filename;\n\n") - self.emit("FILE* f;") - self.emit("%sDFA(char* s);\n" % self.funType) + self.emit("%sDFA(%s);\n" % (self.funType, self.interface)) for state in self.cg.map.iterkeys(): - self.emit(self.funType + self.modify_state_name(state) + "(char* s);\n") - self.emit(self.funType + 'accept(char* s);\n') - self.emit(self.funType + 'reject(char* s);\n') - self.emit(self.funType + 'next_ptr();\n') - self.emit(self.funType + 'next_line();\n') - self.emit(self.funType + 'returner();\n') + self.emit(self.funType + self.modify_state_name(state) + "(" + self.interface + ");\n") + self.emit(self.funType + 'accept(%s);\n' % self.interface) + self.emit(self.funType + 'reject(%s);\n' % self.interface) + self.emit(self.funType + 'next_ptr(%s);\n' % self.interface) + self.emit(self.funType + 'next_line(%s);\n' % self.interface) + self.emit(self.funType + 'returner();\n\n') grepsource = open("template/grep.cbc") self.emit(grepsource.read()) self.emit_next_state() @@ -107,15 +110,28 @@ } """) self.emit(""" -%sDFA(char* s) { - goto %s(s); +%sDFA(%s) { + goto %s(%s); } -""" % (self.funType, self.modify_state_name(self.cg.start))) +""" % (self.funType, self.interface, self.modify_state_name(self.cg.start), self.args)) + + def emit_switch(self, case, default=None): + self.emit("\tswitch(*s++) {\n") + for input, next_states in case.iteritems(): + if input != '': + self.emit("\t\tcase '%s': \n" % (input)) + for next_state in next_states: + self.emit("\t\t\t%s%s(%s);\n" % (self.callType, self.modify_state_name(next_state), self.args)) + if self.breakStatement != '': self.emit(self.breakStatement+'\n') + + if default: + self.emit( """\t\tdefault:\n\t\t\t%s%s(%s);\n""" % (self.callType, default, self.args)) + self.emit("\t}\n") def emit_state(self, cur_state, transition): - self.emit(self.funType + self.modify_state_name(cur_state) + "(char* s) {\n") + self.emit(self.funType + self.modify_state_name(cur_state) + "(" + self.interface + ") {\n") if cur_state in self.cg.accepts: - self.emit("\tgoto accept(s);\n") + self.emit("\tgoto accept(%s);\n" % self.args) else: if transition: if self.cg.type == "DFA":
--- a/pyrect/template/grep.cbc Tue Jul 20 17:26:54 2010 +0900 +++ b/pyrect/template/grep.cbc Mon Aug 02 04:02:19 2010 +0900 @@ -1,17 +1,25 @@ -void grep(char * regexp, FILE *f) { - goto next_line(); +char linebuf[LINEBUFSIZE]; +char readbuf[READBUFSIZE]; + +void grep(char* s, char *cur, char *buf, FILE *f, char* filename) { + goto next_line(s, cur, buf, f, filename); return; } void grepmain(int argc, char* argv[]) { int i; + char *buf = linebuf; + char *cur = buf; + char *s = cur; + char *filename; + FILE *f; if (argc < 2) { fprintf(stderr, "usage: grep regexp [file ...]"); exit(0); } if (argc == 2) { - grep(argv[1], stdin); + grep(s, cur, buf, stdin, NULL); } else { for (i = 2; i < argc; i++) { filename = argv[i]; @@ -22,7 +30,7 @@ } if (READBUFSIZE > 0) setvbuf(f, readbuf, _IOFBF, READBUFSIZE); - grep(argv[1], f); + grep(s, cur, buf, f, filename); fclose(f); } }