Aller au contenu principal

2. Rule Definition (Définition de règle)

2.1. Rule Naming (Nommage de règle)

Le nom d'une règle est simplement le nom lui-même, c'est-à-dire une séquence de caractères, commençant par un caractère alphabétique, et suivi d'une combinaison de caractères alphabétiques, de chiffres et de traits d'union (tirets).

Les noms de règles ne sont pas sensibles à la casse.

Les noms <rulename>, <Rulename>, <RULENAME> et <rUlENamE> font tous référence à la même règle.

Contrairement au BNF original, les crochets angulaires ("<", ">") ne sont pas requis. Cependant, les crochets angulaires peuvent être utilisés autour d'un nom de règle chaque fois que leur présence facilite la distinction de l'utilisation d'un nom de règle. Ceci est généralement limité aux références de noms de règles dans la prose libre, ou pour distinguer les règles partielles qui se combinent en une chaîne non séparée par des espaces blancs, comme illustré dans la discussion sur la répétition, ci-dessous.

2.2. Rule Form (Forme de règle)

Une règle est définie par la séquence suivante :

name = elements crlf

<name> est le nom de la règle, <elements> est un ou plusieurs noms de règles ou spécifications terminales (Terminal Specifications), et <crlf> est l'indicateur de fin de ligne (retour chariot suivi d'un saut de ligne).

Le signe égal (=) sépare le nom de la définition de la règle. Les éléments (Elements) forment une séquence d'un ou plusieurs noms de règles et/ou définitions de valeurs, combinés selon les divers opérateurs définis dans ce document, tels que l'alternative et la répétition.

Pour faciliter la visualisation, les définitions de règles sont alignées à gauche. Lorsqu'une règle nécessite plusieurs lignes, les lignes de continuation sont indentées. L'alignement à gauche et l'indentation sont relatifs aux premières lignes des règles ABNF et ne doivent pas nécessairement correspondre à la marge gauche du document.

2.3. Terminal Values (Valeurs terminales)

Les règles se résolvent en une chaîne de valeurs terminales (Terminal Values), parfois appelées caractères (Characters). Dans ABNF, un caractère est simplement un entier non négatif. Dans certains contextes, un mappage spécifique (encodage) de valeurs vers un jeu de caractères (tel qu'ASCII) sera spécifié.

Les terminaux sont spécifiés par un ou plusieurs caractères numériques, avec l'interprétation de base de ces caractères indiquée explicitement :

b = binaire
d = décimal
x = hexadécimal

Donc :

CR  = %d13        ; retour chariot en décimal
CR = %x0D ; retour chariot en hexadécimal

Les chaînes de texte littérales sont spécifiées directement entre guillemets.

Ces chaînes ne sont pas sensibles à la casse et le jeu de caractères est US-ASCII.

Donc :

command = "command string"

est équivalent à :

command = "Command" / "COMMAND" / "command"

et ainsi de suite.

Valeurs concaténées

Une chaîne concaténée de telles valeurs est spécifiée de manière compacte, en utilisant un point (".") pour indiquer une séparation de caractères dans cette valeur :

CRLF = %d13.10    ; séquence retour chariot saut de ligne

Plages de valeurs

Une plage de valeurs peut être spécifiée en utilisant un trait d'union ("-") :

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

2.4. External Encodings (Encodages externes)

Les représentations externes des caractères de valeurs terminales varient selon les contraintes de l'environnement de stockage ou de transmission. Par conséquent, la même grammaire basée sur ABNF peut avoir plusieurs encodages externes, tels qu'un pour un environnement US-ASCII 7 bits, un autre pour un environnement d'octets binaires, et encore un autre lorsque Unicode 16 bits est utilisé. Les détails de l'encodage sont hors de la portée d'ABNF, bien que l'annexe B fournisse des définitions pour un environnement US-ASCII 7 bits tel qu'il a été courant dans une grande partie d'Internet.

En séparant l'encodage externe de la syntaxe, il est prévu que des environnements d'encodage alternatifs puissent être utilisés pour la même syntaxe.

Remarque : Les chaînes ABNF sont sensibles à la casse, tandis que les chaînes de texte littérales ne le sont pas. Ceci est important pour certains types de spécifications URI où les noms de schéma ne sont pas sensibles à la casse mais les composants de chemin le sont.