A syntax diagram (or railroad diagram) for a if-then-elif-else expression in Python.

Edit and compile if you like:
% Mobile ad-hoc network
% Author: Dr. Ludger Humbert
% Source: https://haspe.homeip.net/projekte/ddi/browser/tex/pgf2
% https://haspe.homeip.net/projekte/ddi/browser/tex/pgf2/Python_if-then-elif-else.tex $:
%
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{tikz}
\usepackage{xxcolor}
\usetikzlibrary{chains,matrix,scopes,decorations.shapes,arrows,shapes}
% fuer Railroad-Diagramme
\tikzset{
nonterminal/.style={
% The shape:
rectangle,
% The size:
minimum size=6mm,
% The border:
very thick,
draw=red!50!black!50, % 50% red and 50% black,
% and that mixed with 50% white
% The filling:
top color=white, % a shading that is white at the top...
bottom color=red!50!black!20, % and something else at the bottom
% Font
font=\itshape
},
terminal/.style={
% The shape:
rounded rectangle,
minimum size=6mm,
% The rest
very thick,draw=black!50,
top color=white,bottom color=black!20,
font=\ttfamily},
skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}}
}
{
\tikzset{terminal/.append style={text height=1.5ex,text depth=.25ex}}
\tikzset{nonterminal/.append style={text height=1.5ex,text depth=.25ex}}
}
\renewcommand\familydefault{\sfdefault}
\listfiles
\begin{document}
%% if_stmt ::= "if" expression ":" suite
%% ( "elif" expression ":" suite )*
%% ["else" ":" suite]
%%
\hspace{-35ex}
\begin{tikzpicture}[point/.style={coordinate},>=stealth',thick,draw=black!50,
tip/.style={->,shorten >=0.007pt},every join/.style={rounded corners},
hv path/.style={to path={-| (\tikztotarget)}},
vh path/.style={to path={|- (\tikztotarget)}},
text height=1.5ex,text depth=.25ex] % um die Hoehe des Punktes festzuzurren
\matrix[ampersand replacement=\&,column sep=4mm] {
\node (p1) [point] {}; \& \node (ifs) [terminal] {if}; \&
\node (p2) [point] {}; \& \node (expr1) [nonterminal] {expr}; \&
\node (p3) [point] {}; \& \node (colon1) [terminal] {:}; \&
\node (p4) [point] {}; \& \node (suite1) [nonterminal] {suite}; \&
\node (p5) [point] {}; \& \node (p6) [point] {}; \&
\node (p6a) [point] {}; \& \node (p6b) [point] {}; \&
\node (p7) [point] {}; \& \node (elif) [terminal] {elif}; \&
\node (p8) [point] {}; \& \node (expr2) [nonterminal] {expr}; \&
\node (p9) [point] {}; \& \node (colon2) [terminal] {:}; \&
\node (p10) [point] {}; \& \node (suite2) [nonterminal] {suite}; \&
\node (p11) [point] {}; \& \node (p12) [point] {}; \&
\node (p12a)[point] {}; \& \node (p12b) [point] {}; \&
\node (p13) [point] {}; \& \node (else) [terminal] {else}; \&
\node (p14) [point] {}; \& \node (colon3) [terminal] {:}; \&
\node (p15) [point] {}; \& \node (suite3) [nonterminal] {suite}; \&
\node (p16) [point] {}; \& \node (p17) [point] {};\\
};
{ [start chain]
\chainin (p1);
\chainin (ifs) [join=by tip];
\chainin (p2) [join];
\chainin (expr1) [join=by tip];
\chainin (p3) [join];
\chainin (colon1) [join=by tip];
\chainin (p4) [join];
\chainin (suite1) [join=by tip];
\chainin (p7) [join];
\chainin (elif) [join=by tip];
\chainin (p8) [join];
\chainin (expr2) [join=by tip];
\chainin (p9) [join];
\chainin (colon2) [join=by tip];
\chainin (p10) [join];
\chainin (suite2) [join=by tip];
\chainin (p12a) [join,join=with p6 by {skip loop=-11mm,tip}];
\chainin (p13) [join];
\chainin (else) [join=by tip];
\chainin (p14) [join];
\chainin (colon3) [join=by tip];
\chainin (p15) [join];
\chainin (suite3) [join=by tip];
\chainin (p16) [join];
\chainin (p17) [join=by tip];
\chainin (p16) [join,join=with p12b by {skip loop=-11mm,tip}];
\chainin (p6b) [join=with p11 by {skip loop=11mm,tip}];
}
\end{tikzpicture}
\end{document}
Click to download: python-if-then-else-syntax-diagram.tex • python-if-then-else-syntax-diagram.pdf
Open in Overleaf: python-if-then-else-syntax-diagram.tex