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);
     }
   }