Backus Naur Form
Die Backus-Naur-Form (kurz BNF) ist eine Sprache zur Beschreibung einer Syntax (Syntaxbeschreibungssprache). Diese Form besteht aus wenigen, einfachen Regeln. Verwendet wird die BNF häufig für die Beschreibung von Protokollen in RFCs (z.b. RFC 2616 für HTTP 1.1)
wichtige Regeln
- "literal"
- Alles was zwischen Anführungszeichen steht (umgangssprachlich auch liebevoll „Gänsefüßchen“ genannt), wird als reiner Text in das Protokoll eingefügt und ist so ein gesetzter Wert, d. h. der zwischen den Gänsefüßchen festgelegte Teil wird so auch 1 zu 1 zwischen Host und Client übermittelt.
- absoluteURI | absolutePath
- Die Pipe | wird wie bei der Programmierung als ODER (in vielen Sprachen als
||
bekannt) verwendet und trennt in der BNF die möglichen Alternativen. Dabei ist es aber als exklusives ODER zu lesen, da nur das eine ODER das andere erlaubt ist. Beides gleichzeitig geht nicht.
- ( generalHeader CRLF )
- Mit den runden Klammern werden die umschlossenen Elemente als eine Einheit zusammengefasst. Dabei gehen die Klammern aber nicht ins Protokoll ein. Hierbei ist Vorsicht beim Lesen einer Beschreibung geboten, da hin und wieder die runde Klammer auch in Anführungszeichen vorkommt und dann sehr wohl ins Protokoll gehört!
- * (generalHeader CRLF)
- Der hier verwendete Stern (*) bedeutet, dass das nachfolgende Element beliebig oft wiederholt werden darf. Das Element darf aber auch ausgelassen werden.
- [ messageBody ]
- Die eckigen Klammern umschließen optionale Angaben. Diese Inhalte können, müssen aber nicht gesetzt werden.
- CR
- Carriage Return, ASCII-Zeichencode 13
- LF
- Line Feed (Zeilenvorschub), ASCII-Zeichencode 10.
- SP
- Space (Leerzeichen), ASCII-Zeichencode 32.
Diese Regeln reichen aus, um z.b. HTTP und URIs vollständig definieren zu können.
Beispiele mit HTTP
- Das Folgende kann 0 - N mal vorkommen (durch den * gekennzeichnet)
- Die Zeile enthält eine der 3 Dinge (durch | als xor gekennzeichnet und mit () gruppiert)
- Die Zeile muss mit einem CRLF (Zeilenumbruch) enden.
- Der Block (nach den Zeilen) wird mit einem weiteren Zeilenumbruch (also Leerzeile) abgeschlossen.
- Ein Request besteht aus einer RequestLine gefolgt von den im ersten Beispiel erläuterten Zeilen und dem
messageBody
, welcher optional ist. - Definition der RequestLine: Diese besteht aus einer Methode dann einem Leerzeichen, dem RequestURI einem Leerzeichen, der httpVersion und schließt mit einem Zeilenumbruch ab.
- Welche Methoden können verwendet werden: GET oder POST oder PUT
- Wie sieht die RequestURI aus: Entweder nur der * oder eine absoluteURI oder einem absolutenPath oder einer authority
- Wie sieht der absoluteURI aus: Erst kommt das scheme gefolgt von einem Doppelpunkt und dann entweder dem netPath oder dem absolutePath. Optional kann mit
?
eine query angehängt werden.
Setzt man diese Regeln fort, erhält man so für die erste Zeile einer HTTP-Anfrage:
GET http://wiki.selfhtml.org/index.php?foo=bar HTTP/1.1 CRLF CRLF
Hier wurde also die Methode GET
verwendet, das scheme http
eingefügt und als absolute URI nach der datei index.php
gefragt. Als query wurde foo=bar
angehängt und als httpVersion
wurde HTTP/1.1
angegeben. Die Zeile schließt hier mit 2 Zeilenumbrüchen. Das heißt es könnte nur noch der messageBody
folgen, in welchem die eigentliche Datenübertragung protokolliert wird.
Weblinks
- Wikipedia: Backus-Naur-Form