diff -r 01f8c7aabb7e -r 06c2228e39cb thirdparty/python-graph/examples/lts2graph.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/thirdparty/python-graph/examples/lts2graph.py Wed Nov 26 23:56:19 2008 +0000 @@ -0,0 +1,115 @@ +#!/usr/bin/env python + +# Copyright (c) 2007-2008 Pedro Matiello +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: + +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + + +""" +This small application will build and draw a graph for a given finite definite automaton described +as a labelled transition system. + +This is a very naive, probably useless, possibly incorrect, barely tested implementation. No +validation is ever performed. Take care or it will burn your house and kill your cat. +""" + + +# Module metadata +__authors__ = "Pedro Matiello" +__license__ = "MIT" + + +# Imports +import sys +sys.path.append('..') +import graph +sys.path.append('/usr/lib/graphviz/python/') +import gv + + +def load_automaton(filename): + """ + Read a automaton described as a labelled transition system and build the equivalent graph. + + @type filename: string + @param filename: Name of the file containing the LTS-described automaton. + + @rtype: graph + @return: Automaton's graph. + """ + gr = graph.digraph() + infile = file(filename,'r') + line = infile.readline() + final = [] + while (line): + line = line.replace("\n",'').split(' ') + datatype = line[0] + data = line[1:] + if (datatype == 'Q'): + # States + for each in data: + gr.add_node(each) + if (datatype == 'A'): + # Alphabet + pass + if (datatype == 'F'): + # Final states + final = final + data + if (datatype == 's'): + # Initial state + gr.add_node('.',attrs=[('shape','point')]) + gr.add_edge('.',data[0]) + if (datatype == 't'): + # Transitions + if (gr.has_edge(data[1], data[2])): + gr.set_edge_label(data[1], data[2], \ + gr.get_edge_label(data[1], data[2]) + ', ' + data[0]) + else: + gr.add_edge(data[1], data[2], label=data[0]) + line = infile.readline() + + for node in gr: + if (node in final and node != '.'): + gr.add_node_attribute(node, ('shape','doublecircle')) + elif (node != '.'): + gr.add_node_attribute(node, ('shape','circle')) + + return gr, final + + +# Main +try: + filename = sys.argv[1] + gr, final = load_automaton(sys.argv[1]) + dot = gr.write(fmt='dot') +except IndexError: + print "Syntax: %s filename" % sys.argv[0] + sys.exit(1) +except IOError: + print "Can't open file %s" % filename + sys.exit(2) + + +# Print graph as PNG image +gvv = gv.readstring(dot) +gv.layout(gvv,'circo') +gv.render(gvv,'png',filename + '.png')