Zum Hauptinhalt springen

RFC 5234 - Augmented BNF for Syntax Specifications: ABNF

Erweiterte BNF für Syntaxspezifikationen: ABNF

Veröffentlichungsdatum: Januar 2008
Status: Internetstandard (STD 68)
Autoren: D. Crocker (Brandenburg InternetWorking), P. Overell (THUS plc.)
Veraltet: RFC 4234


Zusammenfassung (Abstract)

Internet-Technische Spezifikationen müssen oft eine formale Syntax (Formal Syntax) definieren. Im Laufe der Jahre hat sich eine modifizierte Version der Backus-Naur-Form (BNF), genannt Erweiterte BNF (ABNF, Augmented BNF), bei vielen Internet-Spezifikationen als beliebt erwiesen. Die aktuelle Spezifikation dokumentiert ABNF. Sie schafft ein Gleichgewicht zwischen Kompaktheit und Einfachheit mit angemessener Darstellungskraft. Die Unterschiede zwischen Standard-BNF und ABNF betreffen Benennungsregeln (Naming Rules), Wiederholung (Repetition), Alternativen (Alternatives), Reihenfolgeunabhängigkeit (Order-Independence) und Wertebereiche (Value Ranges). Diese Spezifikation liefert auch zusätzliche Regeldefinitionen und Kodierung für einen Kern-Lexikalanalysator (Core Lexical Analyzer) des Typs, der mehreren Internet-Spezifikationen gemeinsam ist.


Status dieses Memos (Status of This Memo)

Dieses Dokument spezifiziert ein Internet Standards Track Protokoll für die Internet-Gemeinschaft und bittet um Diskussion und Vorschläge zur Verbesserung. Bitte beziehen Sie sich auf die aktuelle Ausgabe der „Internet Official Protocol Standards" (STD 1) für den Standardisierungsstatus und Status dieses Protokolls. Die Verbreitung dieses Memos ist unbegrenzt.


Inhaltsverzeichnis (Table of Contents)

Anhänge (Appendices)


ABNF-Kernkonzepte

Was ist ABNF?

ABNF (Augmented BNF) ist eine Metasprache (Metalanguage), die zur Definition von Syntax verwendet wird und in Internet-Protokollspezifikationen weit verbreitet ist. Sie ist eine Erweiterung der klassischen Backus-Naur-Form (BNF).

Grundlegende Syntax

Regeldefinition:

rulename = elements

Beispiel:

postal-address = name-part street zip-part
name-part = *(personal-part SP) last-name [SP suffix] CRLF

Kernoperatoren

OperatorSyntaxBeschreibungBeispiel
VerkettungRule1 Rule2Sequenzielle Verkettung"http" "://"
AlternativenRule1 / Rule2Eines auswählen"yes" / "no"
Inkr. AlternativeRule1 =/ Rule2Alternative hinzufügendigit =/ "A"
Wertebereich%c##-##Zeichenbereich%x30-39 (0-9)
Optional[Rule]Null oder einmal["s"]
Wiederholung*RuleNull oder mehr*DIGIT
Spez. Wdh.nRuleGenau n mal3DIGIT
Bereichs-Wdh.n*mRulen bis m mal1*3DIGIT
Gruppierung(Rule1 Rule2)Regeln gruppieren("http" / "https")
Kommentar; commentKommentar; Dies ist ein Kommentar

Kernregeln (Core Rules)

ABNF definiert einen Satz von Kernregeln, die in verschiedenen Spezifikationen häufig verwendet werden:

ALPHA          =  %x41-5A / %x61-7A   ; A-Z / a-z
DIGIT = %x30-39 ; 0-9
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
DQUOTE = %x22 ; " (doppeltes Anführungszeichen)
SP = %x20 ; Leerzeichen
HTAB = %x09 ; horizontaler Tabulator
WSP = SP / HTAB ; Leerraum
LWSP = *(WSP / CRLF WSP) ; linearer Leerraum
VCHAR = %x21-7E ; sichtbare (druckbare) Zeichen
CHAR = %x01-7F ; beliebiges 7-Bit US-ASCII-Zeichen
OCTET = %x00-FF ; 8-Bit-Daten
CTL = %x00-1F / %x7F ; Steuerzeichen
CR = %x0D ; Wagenrücklauf
LF = %x0A ; Zeilenvorschub
CRLF = CR LF ; Wagenrücklauf Zeilenvorschub
BIT = "0" / "1"

Praktische Beispiele

Beispiel 1: Einfache Regel

greeting = "Hello" SP name
name = 1*ALPHA

Entspricht: Hello John, Hello Alice

Beispiel 2: E-Mail-Adresse (vereinfacht)

email = local-part "@" domain
local-part = 1*(ALPHA / DIGIT / "." / "-" / "_")
domain = subdomain *("." subdomain)
subdomain = 1*(ALPHA / DIGIT / "-")

Entspricht: [email protected], [email protected]

Beispiel 3: HTTP-Version

HTTP-version = "HTTP/" 1*DIGIT "." 1*DIGIT

Entspricht: HTTP/1.1, HTTP/2.0

Beispiel 4: URI-Schema

scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )

Entspricht: http, https, ftp, mailto


Wiederholungsoperatoren erklärt

NotationBedeutungBeispielEntspricht
*Rule0 oder mehr*DIGIT"", "1", "123"
1*Rule1 oder mehr1*DIGIT"1", "123"
2*4Rule2 bis 4 mal2*4DIGIT"12", "123", "1234"
3RuleGenau 3 mal3DIGIT"123"
[Rule]0 oder 1 mal["s"]"", "s"

Operatorrangfolge

Von höchster bis niedrigster:

  1. Regelnamen, Gruppen - rulename, (group)
  2. Wiederholung - *, n*m, n
  3. Wertebereich, Zeichenketten - %c##-##, "string"
  4. Verkettung - Rule1 Rule2
  5. Alternativen - Rule1 / Rule2

Beispiel:

foo = "a" *("b" / "c")

Entspricht: a, ab, ac, abc, abb, acc, abbc, ...


Terminalwertdarstellung

Zeichenketten

command = "GET" / "POST"

Numerische Werte (Hexadezimal)

CR = %x0D        ; Wagenrücklauf
LF = %x0A ; Zeilenvorschub

Numerische Bereiche

DIGIT = %x30-39  ; 0-9
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z

Sequenzwerte

CRLF = %x0D.0A   ; Wagenrücklauf Zeilenvorschub Sequenz

ABNF vs BNF Vergleich

MerkmalBNFABNF
Regeldefinition::==
Alternativen``
Gruppierung<>()
Optional-[]
Wiederholung-*, n*m
TerminalwerteAnführungszeichenAnführungszeichen + numerisch
KommentareVariiert;

Praktische Anwendungen

ABNF wird weithin verwendet zur Definition von:

  • HTTP (RFC 7230, 7231, usw.)
  • URI (RFC 3986)
  • SMTP (RFC 5321)
  • SIP (RFC 3261)
  • JSON (RFC 7159)
  • Fast alle IETF-Protokolle

  • Offizieller Text: https://www.rfc-editor.org/rfc/rfc5234.txt
  • Offizielle Seite: https://datatracker.ietf.org/doc/html/rfc5234
  • Standard: STD 68
  • Veraltet: RFC 4234
  • Verwandte RFCs:
    • RFC 2234 (Frühere Version von ABNF)
    • RFC 7405 (Groß-/Kleinschreibungsunterstützung in ABNF)

Wichtiger Hinweis: ABNF ist ein fundamentales Werkzeug für Internet-Protokollspezifikationen. Das Verständnis von ABNF ist entscheidend für das Lesen und Implementieren von RFC-Spezifikationen!