Mercurial > hg > Members > shinya > pyrect
diff src/dfareg.py @ 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 |
line wrap: on
line diff
--- 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)