Verschiedentlich musste ich Syntaxdiagramme erstellen.
Dazu hat mir rail sehr geholfen.
Eine EBNF-Artige Eingabe wird in ein Rail-Diagramm konvertiert. Auf einem Rail-Diagramm kann man analog einem Zug in vordefinierten Wegen entlangfahren.
Man beginnt links und fährt auf den Schienen und kann an Weichen entscheiden was man macht, Schleifen sind möglich. Am Ende verlässt man das Diagramm nach rechts.
Auf dem Weg begegnen einem Terminale, die echten Code entsprechen. Für Nicht-Terminale sollten weitere Rail-Diagramme existieren, die definieren wie es weitergeht. Entlang der Wege sind Beschriftungen möglich.
- http://texcatalogue.sarovar.org/entries/rail.html
- http://www.dante.ctan.org/tex-archive/support/rail/
- ftp://dante.ctan.org/tex-archive/support/rail/
- ftp://tug.ctan.org/pub/tex-archive/support/rail.zip
Anwendung
Das Rail-Paket besteht aus zwei Teilen:
- Ein LaTeX-Paket rail.sty
- Ein Programm rail (rail.exe für Windows liegt kompiliert vor).
- rail.sty definiert eine Umgebung rail, die eine EBNF-artige Eingabe erlaubt.
- Mit einem LaTeX-Lauf wird eine .rai-Datei.
- rail.exe verarbeitet die .rai-Datie und erzeugt eine .rao-Datei.
- In einem zweiten LaTeX-Lauf wird die .rao-Datei eingelesen und ein rail-Diagramm erzeugt.
Coding
Beispiel
\begin{rail}
body : [1] ( ( '[' string ']' ) ? body[2--6] + '|' ) | [2] body[3--6] '*' body[5--6] | [2] body[3--6] '+' body[5--6] | [3] ( body[4--5] + ) | [4] body[5] '?' | [5] identifier ( '[' string ']' ) ? | [5] quote string quote | [5] dquote string dquote | [5] '(' body[1--6] ')' | [5] cr | [6] ;
\end{rail}
ergibt:
Die verwendete EBNF-Syntax
Gruppierung
Mit Klammern () können Blöcke gebildet werden.
Alternativen
wert1 | wert2
Optionale Wege sind definierbar, indem man vor oder nach dem | keinen Wert angibt.
optional | | optional
Optional
( anweisung ) ?
Wiederholungen
- + macht eine Wiederholung, bei der der Wert mindestens einmal verwendet wird.
- * macht eine Wiederholung, bei der der Wert auch fehlen kann.
- Nach +/* kommen Werte, die zwischen die wiederholten Werte kommen (z.B. trennende Kommas)
Beispiel kommagetrennte Werte:
( value + ',' )
Da bei Wiederholungen ein Block der wiederholt wird und ein Block zwischen zwei Wiederholungen existiert sollte man Wiederholungsbereiche immer mit () umgeben.
Wegbeschriftungen
[text]
definiert Beschriftungen entlang des Syntaxweges.
Sonderzeichen
Sonderzeichen wie { und } sind primär nicht verwendbar. Mittels
\railalias{identifier}{text} railterm{identifier}
können aber rail-variablen definiert werden, die es ermöglichen diese Zeichen zu nutzen.
Um alle LaTeX-Sonderzeichen zu nutzen können folgende Definition eingefügt werden:
\railalias{lbrace}{\{} \railalias{rbrace}{\}} \railalias{underscore}{\_} \railalias{dollar}{\$} \railalias{percent}{\%} \railalias{ampersand}{<>} \railalias{backslash}{\char"5C}
Sollen diese Zeichen zugleich Terminale sein, so kann man das ebenfalls definieren:
\railterm{lbrace,rbrace,dollar,percent,ampersand,backslash,underscore}
Fallen
- Die Rail-Definition endet mit einem ;
- LaTeX-Sonderzeichen sind über den Umweg neuer Terminale verwendbar.