3. Opérateurs
3.1. Concaténation: Rule1 Rule2
Une règle peut définir une chaîne de valeurs simple et ordonnée (c'est-à-dire une concaténation (concatenation) de caractères contigus) en énumérant une séquence de noms de règles. Par exemple:
foo = %x61 ; a
bar = %x62 ; b
mumble = foo bar foo
Ainsi, la règle
Espaces linéaires: la concaténation est au cœur du modèle d'analyse de l'ABNF. Une chaîne de caractères (valeurs) contigus est analysée selon les règles définies dans l'ABNF. Pour les spécifications Internet, il est d'usage historique de permettre aux espaces linéaires (espace et tabulation horizontale) d'être librement et implicitement intercalés autour des principales constructions, par exemple pour délimiter des caractères spéciaux ou des chaînes atomiques.
NOTE:
La présente spécification de l'ABNF ne prévoit pas la spécification implicite des espaces linéaires.
Toute grammaire qui souhaite autoriser des espaces linéaires autour des délimiteurs ou des segments de chaîne doit les spécifier explicitement. Il est souvent utile de prévoir de tels espaces dans des règles "de base" qui sont ensuite utilisées de diverses manières parmi les règles de niveau supérieur. Les règles "de base" peuvent être regroupées dans un analyseur lexical ou simplement faire partie de l'ensemble de règles principal.
3.2. Alternatives: Rule1 / Rule2
Les éléments séparés par une barre oblique ("/") sont des alternatives. Par conséquent,
foo / bar
acceptera
NOTE:
Une chaîne entre guillemets contenant des caractères alphabétiques est une forme spéciale permettant de spécifier des caractères alternatifs; elle est interprétée comme un non-terminal représentant l'ensemble des chaînes combinatoires formées avec les caractères contenus, dans l'ordre spécifié mais avec un mélange quelconque de majuscules et de minuscules.
3.3. Alternatives incrémentales: Rule1 =/ Rule2
Il est parfois commode de spécifier une liste d'alternatives par fragments. C'est-à-dire qu'une règle initiale peut correspondre à une ou plusieurs alternatives, des définitions de règles ultérieures venant enrichir l'ensemble des alternatives. Cela est particulièrement utile pour des spécifications par ailleurs indépendantes qui dérivent du même ensemble de règles parent, comme cela se produit souvent avec les listes de paramètres. L'ABNF permet cette définition incrémentale au moyen de la construction:
oldrule =/ additional-alternatives
Ainsi, l'ensemble de règles
ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5
est identique à la spécification
ruleset = alt1 / alt2 / alt3 / alt4 / alt5
3.4. Alternatives de plage de valeurs: %c##-##
Une plage de valeurs numériques alternatives peut être spécifiée de façon compacte, en utilisant un tiret ("-") pour indiquer la plage de valeurs alternatives. Ainsi:
DIGIT = %x30-39
est équivalent à:
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" /
"7" / "8" / "9"
Les valeurs numériques concaténées et les plages de valeurs numériques ne peuvent pas être spécifiées dans la même chaîne. Une valeur numérique peut utiliser la notation pointée pour la concaténation, ou la notation à tiret pour spécifier une plage de valeurs. Ainsi, pour spécifier un caractère imprimable entre des séquences de fin de ligne, la spécification pourrait être:
char-line = %x0D.0A %x20-7E %x0D.0A
3.5. Groupe de séquence: (Rule1 Rule2)
Les éléments entre parenthèses sont traités comme un seul élément, dont le contenu est strictement ordonné. Ainsi,
elem (foo / bar) blat
correspond à (elem foo blat) ou (elem bar blat), et
elem foo / bar blat
correspond à (elem foo) ou (bar blat).
NOTE:
Il est vivement conseillé d'utiliser la notation de regroupement, plutôt que de se fier à la bonne lecture des alternations "nues", lorsque les alternatives se composent de plusieurs noms de règles ou littéraux.
Par conséquent, il est recommandé d'utiliser la forme suivante:
(elem foo) / (bar blat)
Elle évitera toute interprétation erronée par les lecteurs occasionnels.
La notation de groupe de séquence est également utilisée dans le texte libre pour détacher une séquence d'éléments de la prose.
3.6. Répétition variable: *Rule
L'opérateur "*" précédant un élément indique une répétition. La forme complète est:
<a>*<b>element
où et sont des valeurs décimales facultatives, indiquant au moins et au plus occurrences de l'élément.
Les valeurs par défaut sont 0 et l'infini, de sorte que
3.7. Répétition spécifique: nRule
Une règle de la forme:
<n>element
est équivalente à
<n>*<n>element
C'est-à-dire exactement
3.8. Séquence facultative: [RULE]
Les crochets encadrent une séquence d'éléments facultative:
[foo bar]
est équivalent à
*1(foo bar).
3.9. Commentaire: ; Comment
Un point-virgule commence un commentaire qui se poursuit jusqu'à la fin de la ligne. C'est un moyen simple d'inclure des notes utiles en parallèle des spécifications.
3.10. Priorité des opérateurs
Les divers mécanismes décrits ci-dessus ont la priorité suivante, de la plus élevée (liaison la plus forte) en haut à la plus faible (liaison la plus lâche) en bas:
Nom de règle, prose-val, Valeur terminale
Commentaire
Plage de valeurs
Répétition
Regroupement, Facultatif
Concaténation
Alternation
L'utilisation de l'opérateur d'alternation, mélangé librement à des concaténations, peut prêter à confusion.
Là encore, il est recommandé d'utiliser l'opérateur de regroupement pour expliciter les groupes de concaténation.