Aller au contenu principal

RFC 5234 - Augmented BNF for Syntax Specifications: ABNF

BNF augmentée pour les spécifications de syntaxe : ABNF

Date de publication : Janvier 2008
Statut : Norme Internet (STD 68)
Auteurs : D. Crocker (Brandenburg InternetWorking), P. Overell (THUS plc.)
Rend obsolète : RFC 4234


Résumé (Abstract)

Les spécifications techniques Internet nécessitent souvent de définir une syntaxe formelle (Formal Syntax). Au fil des années, une version modifiée de la forme de Backus-Naur (BNF, Backus-Naur Form), appelée BNF augmentée (ABNF, Augmented BNF), a été populaire parmi de nombreuses spécifications Internet. La spécification actuelle documente ABNF. Elle équilibre la compacité et la simplicité avec un pouvoir de représentation raisonnable. Les différences entre BNF standard et ABNF concernent les règles de nommage (Naming Rules), la répétition (Repetition), les alternatives (Alternatives), l'indépendance d'ordre (Order-Independence) et les plages de valeurs (Value Ranges). Cette spécification fournit également des définitions de règles supplémentaires et un encodage pour un analyseur lexical de base (Core Lexical Analyzer) du type commun à plusieurs spécifications Internet.


Statut de ce mémo (Status of This Memo)

Ce document spécifie un protocole de suivi des normes Internet pour la communauté Internet et demande des discussions et des suggestions pour l'améliorer. Veuillez vous référer à l'édition actuelle des « Normes officielles des protocoles Internet » (STD 1) pour l'état de normalisation et le statut de ce protocole. La distribution de ce mémo est illimitée.


Table des matières (Table of Contents)

Annexes (Appendices)


Concepts de base d'ABNF

Qu'est-ce qu'ABNF ?

ABNF (Augmented BNF) est un métalangage (Metalanguage) utilisé pour définir la syntaxe, largement utilisé dans les spécifications de protocoles Internet. C'est une extension de la forme classique de Backus-Naur (BNF).

Syntaxe de base

Définition de règle :

rulename = elements

Exemple :

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

Opérateurs de base

OpérateurSyntaxeDescriptionExemple
ConcaténationRule1 Rule2Concaténation séquentielle"http" "://"
AlternativesRule1 / Rule2Choisir l'un"yes" / "no"
Alt. incrémentaleRule1 =/ Rule2Ajouter une alternativedigit =/ "A"
Plage de valeurs%c##-##Plage de caractères%x30-39 (0-9)
Optionnel[Rule]Zéro ou une fois["s"]
Répétition*RuleZéro ou plus*DIGIT
Rép. spécifiquenRuleExactement n fois3DIGIT
Rép. de plagen*mRuleDe n à m fois1*3DIGIT
Groupement(Rule1 Rule2)Grouper des règles("http" / "https")
Commentaire; commentCommentaire; Ceci est un commentaire

Règles de base (Core Rules)

ABNF définit un ensemble de règles de base couramment utilisées dans diverses spécifications :

ALPHA          =  %x41-5A / %x61-7A   ; A-Z / a-z
DIGIT = %x30-39 ; 0-9
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
DQUOTE = %x22 ; " (guillemet double)
SP = %x20 ; espace
HTAB = %x09 ; tabulation horizontale
WSP = SP / HTAB ; espace blanc
LWSP = *(WSP / CRLF WSP) ; espace blanc linéaire
VCHAR = %x21-7E ; caractères visibles (imprimables)
CHAR = %x01-7F ; tout caractère US-ASCII 7 bits
OCTET = %x00-FF ; données 8 bits
CTL = %x00-1F / %x7F ; caractères de contrôle
CR = %x0D ; retour chariot
LF = %x0A ; saut de ligne
CRLF = CR LF ; retour chariot saut de ligne
BIT = "0" / "1"

Exemples pratiques

Exemple 1 : Règle simple

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

Correspond à : Hello John, Hello Alice

Exemple 2 : Adresse e-mail (simplifiée)

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

Correspond à : [email protected], [email protected]

Exemple 3 : Version HTTP

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

Correspond à : HTTP/1.1, HTTP/2.0

Exemple 4 : Schéma URI

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

Correspond à : http, https, ftp, mailto


Opérateurs de répétition expliqués

NotationSignificationExempleCorrespond à
*Rule0 ou plus*DIGIT"", "1", "123"
1*Rule1 ou plus1*DIGIT"1", "123"
2*4Rule2 à 4 fois2*4DIGIT"12", "123", "1234"
3RuleExactement 3 fois3DIGIT"123"
[Rule]0 ou 1 fois["s"]"", "s"

Priorité des opérateurs

Du plus élevé au plus bas :

  1. Noms de règles, groupes - rulename, (group)
  2. Répétition - *, n*m, n
  3. Plage de valeurs, chaînes - %c##-##, "string"
  4. Concaténation - Rule1 Rule2
  5. Alternatives - Rule1 / Rule2

Exemple :

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

Correspond à : a, ab, ac, abc, abb, acc, abbc, ...


Représentation des valeurs terminales

Chaînes

command = "GET" / "POST"

Valeurs numériques (hexadécimal)

CR = %x0D        ; retour chariot
LF = %x0A ; saut de ligne

Plages numériques

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

Valeurs de séquence

CRLF = %x0D.0A   ; séquence retour chariot saut de ligne

Comparaison ABNF vs BNF

CaractéristiqueBNFABNF
Définition de règle::==
Alternatives``
Groupement<>()
Optionnel-[]
Répétition-*, n*m
Valeurs terminalesGuillemetsGuillemets + numérique
CommentairesVarie;

Applications pratiques

ABNF est largement utilisé pour définir :

  • HTTP (RFC 7230, 7231, etc.)
  • URI (RFC 3986)
  • SMTP (RFC 5321)
  • SIP (RFC 3261)
  • JSON (RFC 7159)
  • Presque tous les protocoles IETF

  • Texte officiel : https://www.rfc-editor.org/rfc/rfc5234.txt
  • Page officielle : https://datatracker.ietf.org/doc/html/rfc5234
  • Norme : STD 68
  • Rend obsolète : RFC 4234
  • RFC associés :
    • RFC 2234 (Version précédente d'ABNF)
    • RFC 7405 (Support des chaînes sensibles à la casse dans ABNF)

Note importante : ABNF est un outil fondamental pour les spécifications de protocoles Internet. Comprendre ABNF est crucial pour lire et implémenter les spécifications RFC !