Mercurial > hg > Members > shinya > pyrect
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"]; + +}
--- 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)