2. Définition des règles
2.1. Nommage des règles
Le nom d'une règle (rule name) 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 suivie d'une combinaison de caractères alphabétiques, de chiffres et de traits d'union (tirets).
NOTE:
Les noms de règles ne sont pas sensibles à la casse.
Les noms
Contrairement à la BNF d'origine, les chevrons ("<", ">") ne sont pas obligatoires. Toutefois, des chevrons peuvent être employés autour d'un nom de règle lorsque leur présence facilite le repérage de l'utilisation d'un nom de règle. Cela se limite typiquement aux références à des noms de règles dans de la prose libre, ou sert à distinguer des règles partielles qui se combinent en une chaîne non séparée par des espaces, comme l'illustre la discussion sur la répétition ci-dessous.
2.2. Forme des règles
Une règle est définie par la séquence suivante:
name = elements crlf
où
Pour faciliter la lecture, 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 n'ont pas à correspondre à la marge gauche du document.
2.3. Valeurs terminales
Les règles se résolvent en une chaîne de valeurs terminales (terminal values), parfois appelées caractères. En ABNF, un caractère n'est qu'un entier non négatif. Dans certains contextes, une correspondance (codage) spécifique des valeurs vers un jeu de caractères (tel qu'ASCII) sera spécifiée.
Les valeurs terminales sont spécifiées par un ou plusieurs caractères numériques, l'interprétation de base de ces caractères étant indiquée explicitement. Les bases suivantes sont actuellement définies:
b = binary
d = decimal
x = hexadecimal
Ainsi:
CR = %d13
CR = %x0D
spécifient respectivement la représentation décimale et hexadécimale de [US-ASCII] pour le retour chariot.
Une chaîne concaténée de telles valeurs est spécifiée de façon compacte, à l'aide d'un point (".") pour indiquer une séparation de caractères au sein de cette valeur. Ainsi:
CRLF = %d13.10
L'ABNF permet de spécifier directement des chaînes de texte littérales, placées entre guillemets. Ainsi:
command = "command string"
Les chaînes de texte littérales sont interprétées comme un ensemble concaténé de caractères imprimables.
NOTE:
Les chaînes ABNF ne sont pas sensibles à la casse et le jeu de caractères de ces chaînes est US-ASCII.
Ainsi:
rulename = "abc"
et:
rulename = "aBc"
correspondront à "abc", "Abc", "aBc", "abC", "ABc", "aBC", "AbC" et "ABC".
Pour spécifier une règle sensible à la casse, spécifiez les caractères individuellement.
Par exemple:
rulename = %d97 %d98 %d99
ou
rulename = %d97.98.99
ne correspondront qu'à la chaîne composée uniquement des caractères minuscules, abc.
2.4. Encodages externes
Les représentations externes des caractères de valeur terminale varient selon les contraintes de l'environnement de stockage ou de transmission. Ainsi, une même grammaire fondée sur l'ABNF peut avoir plusieurs encodages externes, par exemple l'un pour un environnement US-ASCII à 7 bits, un autre pour un environnement d'octets binaires, et encore un autre lorsque l'Unicode à 16 bits est utilisé. Les détails d'encodage sortent du cadre de l'ABNF, bien que l'annexe B fournisse des définitions pour un environnement US-ASCII à 7 bits, comme cela a été courant dans une grande partie de l'Internet.
En séparant l'encodage externe de la syntaxe, on entend permettre l'utilisation d'environnements d'encodage différents pour une même syntaxe.