Logo jkrieger.de section logo
invisible corner_top_left.gif
divider design elem. Home design elem.   design elem. Software design elem.   design elem. Links design elem.   design elem. Science design elem.   design elem. Photographie design elem.   design elem. everythingelse design elem.   design elem. eMail design elem.
divider_end corner_top_right
Verlauf

Tools: Graphviz


Das Programm Graphviz (http://www.graphviz.org/) ist ein einfaches Tool zur Erstellung von Graphen, wie sie in der Informatik häufig vorkommen. Es genügt dabei als Eingabe in einer Textdatei die Knoten des Graphen zu bestimmen. Darunter gibt man dann die (gerichteten) Beziehungen zwischen den Knoten an. Das Programm erledigt die Anordnung der Knoten und der Beziehungen automatisch.

Das Programm dot (aus dem Graphviz-Paket) erstellt aus den Eingabedaten eine Postscript-Datei (oder aus PNG, SVG usw.), die man dann - etwa in CorelDraw -  weiterverarbeiten kann. Man stellt in diesem einfachen Programm nur Input und Output fil ein, wählt das Export-Format und klickt dann auf "Do LAyout". Ist alles gut verlaufen meldet das Programm erfolg und der Graph steht in der angegebenen output-Datei. Hier ein kleines Beispiel:

Übergangsgraph eines Automaten:
zunächst das Beschreibungsfile:
digraph G {
  size="4,2";
  rankdir=LR;
  order=out;
  s [shape=plaintext, label="", width=0, group="g1"]
  s0 [shape=circle, group="g1"];
  s1 [shape=circle, group="g1"];
  s2 [shape=doublecircle, group="g1"];
  s3 [shape=doublecircle, group="g2"];
  s -> s0;
  s0 -> s1 [label="b", fontname="Courier-Bold"];
  s0 -> s3 [label="a", fontname="Courier-Bold"];
  s1 -> s3 [label="b", fontname="Courier-Bold"];
  s1 -> s2 [label="l", fontname="Symbol"];
  s2 -> s3 [label="a", fontname="Courier-Bold"];
  s2 -> s2 [label="a", fontname="Courier-Bold"];
}
Zunächst sieht man einige allgemeine Definitionen. Danach werden die einzelnen Knoten definiert. In den eckigen Klammern stehen Parameter, die die Beschriftung die das Aussehen der Knoten festlegen. Danach folgen die Beziehungen zwischen den Knoten. Diese werden durch Pfeile "->" dargetsellt. Auch bei ihnen kann man Parameter, z.B. für die Beschriftung, angeben. Wie man sieht sind in der Postscript-Ausgabe auch alternative Fonts erlaubt.
Übergangsgraph eines Utomaten mit Graphviz
Graphen mit Subgraphen:
Das folgende Beispiel ist schon etwas komplizier:
digraph G  {
  size ="8,8";
  subgraph cluster0 {
    rankdir=TB;
    color=white;
    st [label="Symboltabelle\nSyntaxgraph", shape=octagon, rank=0];
  }

  subgraph cluster1 {
    color=white;
    rankdir=TB;
    rank=samerank;
    source [label="Quellcode", shape=plaintext];
    pre [label="Praecompiler", shape=box];
    lexer [label="lexikalische Analyse", shape=box];
    syntax [label="Syntaxanalyse", shape=box];
    semantic [label="semantische Analyse", shape=box];
    bcode [label="Zwischencode", shape=box];
    opt [label="Optimierung", shape=box];
    mcode [label="Codeerzeugung", shape=box];
    mopt [label="Optimierung", shape=box];
    pp [label="Postprocessing", shape=box];
    mp [label="Zielprogramm", shape=plaintext];
  }
  source -> pre -> lexer -> syntax -> semantic -> bcode -> opt -> mcode -> mopt -> pp -> mp;
  st -> {lexer; syntax; semantic; bcode; opt; mcode} [arrowhead=none];
}

Es zeigt die Möglichkeit Subgraphen anzulegen. Außerdem werden einige weitere Möglichkeiten in der Syntax gezeigt, so kann man etwa eine ganze Kette von Beziehungen angeben. Es ist auch möglich eine Liste von Knoten aufzuschreiben, auf die ein Knoten verweisen soll.
Graphviz-Beispiel
Ableitungsbaum:
Das nächste Beispiel zeigt einen Ableitungsbaum für einen formalen Ausdruck.
digraph G  {
  ordering=out;
  ranksep=.25;
  E0 [label="E", shape=plaintext, width=0.2];
  E1 [label="E", shape=plaintext, width=0.2];
  T1 [label="+", shape=plaintext, fontname="Courier", width=0.2];
  F1 [label="F", shape=plaintext, width=0.2];
  F2 [label="F", shape=plaintext, width=0.2];
  T2 [label="(", shape=plaintext, fontname="Courier", width=0.2];
  E2 [label="E", shape=plaintext, width=0.2];
  T3 [label=")", shape=plaintext, fontname="Courier", width=0.2];
  id1 [label="id", shape=plaintext, fontname="Courier", width=0.2];
  E3 [label="E", shape=plaintext, width=0.2];
  T4 [label="+", shape=plaintext, fontname="Courier", width=0.2];
  F3 [label="F", shape=plaintext, width=0.2];
  F4 [label="F", shape=plaintext, width=0.2];
  id2 [label="id", shape=plaintext, fontname="Courier", width=0.2];
  id3 [label="id", shape=plaintext, fontname="Courier", width=0.2];
 

  E0 -> {E1; T1; F1} [arrowsize=0.5];
  E1 -> F2 -> id1 [arrowsize=0.5];
  F1 -> {T2; E2; T3} [arrowsize=0.5];
  E2 -> {E3; T4; F3} [arrowsize=0.5];
  E3 -> F4 -> id3 [arrowsize=0.5];
  F3 -> id2 [arrowsize=0.5];
}
Ableitungsbaum mit Graphviz

Das Programm Graphviz beherscht eine große Auswahl an Beziehungsformen (Pfeilspitzen) und diverse Formen für die Knoten. Es können auch Knoten erstellt werden, die eine interne Unterteilung aufweisen. Die Dokumentation des Programmes gibt hier eine sehr gute Einführung. Obwohl die Syntax der Beschreibungsfiles sehr einfach ist bietet Graphviz ein mächtiges Werkzeug, um schnell (ansprechende ... naja meist ;-) Graphen zu erzeugen.








 printable version Impressum
corner_top_right2
verlauf_right.gif
corner_bottom_left.gif corner_bottom_left2 Copyright (c) J. Krieger corner_bottom_right.gif
invisible
last updated: 18.06.2008
file: http://www.jkrieger.de/tools/graph/graphviz.html
invisible