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