changeset 4:7e47839a54ad

add Regexp.emitDot(), Dot file can be converted tex->pdf
author ryoma <e075725@ie.u-ryukyu.ac.jp>
date Tue, 29 Jun 2010 12:46:29 +0900
parents a193b4ff3909
children 11fba907c0af
files code/graph/reg.dot code/graph/reg.pdf src/dfareg.py
diffstat 3 files changed, 69 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/code/graph/reg.dot	Tue Jun 29 12:46:29 2010 +0900
@@ -0,0 +1,31 @@
+
+digraph G {
+    d2ttikzedgelabels = true;
+    d2tstyleonly = true;
+    d2tdocpreamble = "\usetikzlibrary{automata}";
+    d2tfigpreamble = "	ikzstyle{every state}=    [draw=blue!50, shape=circle, very thick,fill=blue!20]";
+    edge [lblstyle="fill=blue!20", style="arrows=->", topath="bend left"];
+    node [shape="circle", style="state"];
+
+
+    state13567 [style="state, initial"]
+    state8 [style="state, accepting"]
+    state13567 -> state12357 [texlbl="A"];
+
+    state13567 -> state8 [texlbl="C"];
+
+    state13567 -> state13457 [texlbl="B"];
+
+    state13457 -> state12357 [texlbl="A"];
+
+    state13457 -> state8 [texlbl="C"];
+
+    state13457 -> state13457 [texlbl="B"];
+
+    state12357 -> state12357 [texlbl="A"];
+
+    state12357 -> state8 [texlbl="C"];
+
+    state12357 -> state13457 [texlbl="B"];
+
+}
Binary file code/graph/reg.pdf has changed
--- a/src/dfareg.py	Tue Jun 29 11:44:40 2010 +0900
+++ b/src/dfareg.py	Tue Jun 29 12:46:29 2010 +0900
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 import copy
-import sys
+import sys, re
 from optparse import OptionParser
 
 class NondeterministicFiniteAutomaton(object):
@@ -420,6 +420,31 @@
 \tprintf(\"\\nstring does not match regexp. \\n\\n\");
 }\n""" % fun_type
 
+def dfa2Dot(cg, regexp):
+    print """
+digraph G {
+    d2ttikzedgelabels = true;
+    d2tstyleonly = true;
+    d2tdocpreamble = \"\usetikzlibrary{automata}\";
+    d2tfigpreamble = \"\tikzstyle{every state}=\
+    [draw=blue!50, shape=circle, very thick,fill=blue!20]\";
+    edge [lblstyle=\"fill=blue!20\", style=\"arrows=->\", topath=\"bend left\"];
+    node [shape=\"circle\", style=\"state\"];\n
+"""
+    def escape(string):
+        return re.sub("_", "", string)
+
+    print "    %s [style=\"state, initial\"]" % (escape(cg.start))
+    for accept in cg.accepts:
+        print "    %s [style=\"state, accepting\"]" % (escape(accept))
+
+    for cur_state, trans in cg.map.iteritems():
+        for case, next_state in trans.iteritems():
+            if next_state != "accept":
+                print "    %s -> %s [texlbl=\"%s\"];\n" % (escape(cur_state), escape(next_state), case)
+    print "}"
+
+
 class Regexp(object):
     def __init__(self, regexp):
         self.regexp = regexp
@@ -433,13 +458,17 @@
         self.nfa = parser_.expression()
         self.dfa = nfa2dfa(self.nfa)
 
+    def matches(self, string):
+        runtime = self.dfa.getRuntime()
+        return runtime.doesAccept(string)
+
     def emitCbC(self, emitCFlag=False):
         cg = CallGraph(self.dfa)
         dfa2CbC(cg, self.regexp, emitCFlag)
 
-    def matches(self, string):
-        runtime = self.dfa.getRuntime()
-        return runtime.doesAccept(string)
+    def emitDot(self):
+        cg = CallGraph(self.dfa)
+        dfa2Dot(cg, self.regexp)
 
 def compile(regexp):
     return Regexp(regexp)
@@ -448,11 +477,15 @@
     myusage = "%prog [-C] regexp"
     psr = OptionParser(usage=myusage)
     psr.add_option("-C", action="store_true", dest="emitCFlag", default=False, help="emit C-source")
+    psr.add_option("-D", action="store_true", dest="emitDot", default=False, help="emit Dot file")
     (opts, args) = psr.parse_args(sys.argv)
     if len(args) == 1:
         psr.print_help()
         exit()
     r = compile(args[1])
-    r.emitCbC(opts.emitCFlag)
+    if opts.emitDot:
+        r.emitDot()
+    else:
+        r.emitCbC(opts.emitCFlag)
 
 if __name__ == '__main__' : main(sys.argv)