Backus Naur Form

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

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

Beispiel
*( (generalHeader | requestHeader | entityHeader) CRLF ) CRLF
  1. Das Folgende kann 0 - N mal vorkommen (durch den * gekennzeichnet)
  2. Die Zeile enthält eine der 3 Dinge (durch | als xor gekennzeichnet und mit () gruppiert)
  3. Die Zeile muss mit einem CRLF (Zeilenumbruch) enden.
  4. Der Block (nach den Zeilen) wird mit einem weiteren Zeilenumbruch (also Leerzeile) abgeschlossen.
HTTP-Anfrage
.Request = RequestLine *( (generalHeader | requestHeader | entityHeader) CRLF ) CRLF [messageBody] RequestLine = Method SP RequestURI SP httpVersion CRLF Method = "GET" | "POST" | "PUT" RequestURI = "*" | absoluteURI | absolutePath | authority absoluteURI = scheme ":" (netPath | absolutePath) ["?" query] scheme = "http" netPath = "//"authority[absolutePath] authority = host [":"port] host = hostname | IPV4adress requestHeader = Accept | ... | Host | ... | UserAgent Host = "Host" ":" host [ ":"port ] ...
  1. Ein Request besteht aus einer RequestLine gefolgt von den im ersten Beispiel erläuterten Zeilen und dem messageBody, welcher optional ist.
  2. Definition der RequestLine: Diese besteht aus einer Methode dann einem Leerzeichen, dem RequestURI einem Leerzeichen, der httpVersion und schließt mit einem Zeilenumbruch ab.
  3. Welche Methoden können verwendet werden: GET oder POST oder PUT
  4. Wie sieht die RequestURI aus: Entweder nur der * oder eine absoluteURI oder einem absolutenPath oder einer authority
  5. 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.
Beachten Sie: Das Beispiel ist unvollständig.

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