|
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. |
|
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. |
|
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];
}
|
|
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.
|
|