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)
- 1. Introduction
- 2. Rule Definition (Définition de règle)
- 2.1. Rule Naming (Nommage de règle)
- 2.2. Rule Form (Forme de règle)
- 2.3. Terminal Values (Valeurs terminales)
- 2.4. External Encodings (Encodages externes)
- 3. Operators (Opérateurs)
- 3.1. Concatenation (Concaténation)
- 3.2. Alternatives
- 3.3. Incremental Alternatives (Alternatives incrémentales)
- 3.4. Value Range Alternatives (Alternatives de plage de valeurs)
- 3.5. Sequence Group (Groupe de séquence)
- 3.6. Variable Repetition (Répétition variable)
- 3.7. Specific Repetition (Répétition spécifique)
- 3.8. Optional Sequence (Séquence optionnelle)
- 3.9. Comment (Commentaire)
- 3.10. Operator Precedence (Priorité des opérateurs)
- 4. ABNF Definition of ABNF (Définition ABNF d'ABNF)
- 5. Security Considerations (Considérations de sécurité)
- 6. References (Références)
- 6.1. Normative References (Références normatives)
- 6.2. Informative References (Références informatives)
Annexes (Appendices)
- Appendix A. Acknowledgements (Remerciements)
- Appendix B. Core ABNF of ABNF (ABNF de base d'ABNF)
- B.1. Core Rules (Règles de base)
- B.2. Common Encoding (Encodage commun)
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érateur | Syntaxe | Description | Exemple |
|---|---|---|---|
| Concaténation | Rule1 Rule2 | Concaténation séquentielle | "http" "://" |
| Alternatives | Rule1 / Rule2 | Choisir l'un | "yes" / "no" |
| Alt. incrémentale | Rule1 =/ Rule2 | Ajouter une alternative | digit =/ "A" |
| Plage de valeurs | %c##-## | Plage de caractères | %x30-39 (0-9) |
| Optionnel | [Rule] | Zéro ou une fois | ["s"] |
| Répétition | *Rule | Zéro ou plus | *DIGIT |
| Rép. spécifique | nRule | Exactement n fois | 3DIGIT |
| Rép. de plage | n*mRule | De n à m fois | 1*3DIGIT |
| Groupement | (Rule1 Rule2) | Grouper des règles | ("http" / "https") |
| Commentaire | ; comment | Commentaire | ; 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
| Notation | Signification | Exemple | Correspond à |
|---|---|---|---|
*Rule | 0 ou plus | *DIGIT | "", "1", "123" |
1*Rule | 1 ou plus | 1*DIGIT | "1", "123" |
2*4Rule | 2 à 4 fois | 2*4DIGIT | "12", "123", "1234" |
3Rule | Exactement 3 fois | 3DIGIT | "123" |
[Rule] | 0 ou 1 fois | ["s"] | "", "s" |
Priorité des opérateurs
Du plus élevé au plus bas :
- Noms de règles, groupes -
rulename,(group) - Répétition -
*,n*m,n - Plage de valeurs, chaînes -
%c##-##,"string" - Concaténation -
Rule1 Rule2 - 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éristique | BNF | ABNF |
|---|---|---|
| Définition de règle | ::= | = |
| Alternatives | ` | ` |
| Groupement | <> | () |
| Optionnel | - | [] |
| Répétition | - | *, n*m |
| Valeurs terminales | Guillemets | Guillemets + numérique |
| Commentaires | Varie | ; |
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
Ressources associées (Related Resources)
- 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 !