1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
\section{Syntaxdiagramme}
\label{paket:syntaxdi}
Mit den Paketen \pkg{syntaxdi} und \pkg{tikz} ist es möglich,
einfache Syntaxdiagramme zu erstellen. Dazu sind einige Elemente
definiert worden, die automatisch durch Pfeile miteinander
verbunden werden.
Hierzu definiert das Paket \pkg{syntaxdi} einige TikZ-Stile, die
einfach genutzt werden können.
\subsection{TikZ-Stile}
\begin{options}
\opt{nonterminal} definiert ein Non-Terminal.
\opt{terminal} definiert ein Terminal.
\opt{fnonterminal} definiert ein Non-Terminal ohne automatische
Verzweigung.
\opt{fterminal} definiert ein Terminal ohne automatische
Verzweigung.
\opt{point} definiert einen Punkt, der ohne ankommenden Pfeil
gezeichnet wird.
\opt{endpoint} definiert einen Punkt, der mit ankommenden Pfeil
gezeichnet wird.
\end{options}
\subsection{Beispiel}
Damit kann \zB\xspace das folgende Syntaxdiagramm gezeichnet werden.
\begin{example}[gobble=0]
\begin{tikzpicture}[syntaxdiagramm]
\node [] {};
\node [terminal] {if};
\node [nonterminal] {Bedingung};
\node [terminal] {:};
\node [nonterminal] {Anweisungsblock};
\node (ersteReiheEnde) [point] {};
\node (ersteReiheEndeUnten) [point, below=of ersteReiheEnde] {};
\node (zweiteReiheStartOben) [point, left=of ersteReiheEndeUnten,
xshift=-75mm] {};
\node (zweiteReiheStart) [point, below=of zweiteReiheStartOben] {};
{
[start chain=elif going right]
\chainin (zweiteReiheStart);
\node [terminal] {elif};
\node [nonterminal] {Bedingung};
\node [terminal] {:};
\node [nonterminal] {Anweisungsblock};
\node (elifEnde) [point] {};
\node (elifEndeOben) [point, above=of elifEnde] {};
\draw[->,left] (elifEndeOben) -- (ersteReiheEndeUnten);
}
\node (dritteReiheStart) [point, below=of zweiteReiheStart,
yshift=-5mm] {};
\node (vierteReiheStart) [point, below=of dritteReiheStart,
yshift=-5mm] {};
\node (vierteReiheEnde) [point, xshift=84mm] {};
{
[start chain=else going right]
\chainin (dritteReiheStart);
\node [terminal] {else};
\node [terminal] {:};
\node (elseEnde) [nonterminal] {Anweisungsblock};
\draw[->] (elseEnde) -| (vierteReiheEnde);
}
\node (ende) [endpoint] {};
\end{tikzpicture}
\end{example}
|