3. Operators (Opérateurs)
3.1. Concatenation: Rule1 Rule2 (Concaténation)
Une règle peut définir une chaîne simple et ordonnée de valeurs (c'est-à-dire une concaténation de caractères contigus) en listant une séquence de noms de règles. Par exemple :
foo = %x61 ; a
bar = %x62 ; b
mumble = foo bar foo
De sorte que la règle <mumble> correspond à la chaîne minuscule "aba".
Espace blanc linéaire : La concaténation est au cœur du modèle d'analyse ABNF. Une chaîne de caractères contigus (valeurs) est analysée selon les règles définies dans ABNF. Pour les spécifications Internet, il existe une certaine histoire de permettre aux espaces blancs linéaires (espace et tabulation horizontale) d'être librement et implicitement entremêlés autour des constructions majeures, telles que la délimitation de caractères spéciaux ou de chaînes atomiques.
3.2. Alternatives: Rule1 / Rule2
Les éléments séparés par une barre oblique ("/") sont des alternatives. Par conséquent :
foo / bar
acceptera <foo> ou <bar>.
3.3. Incremental Alternatives: Rule1 =/ Rule2 (Alternatives incrémentales)
Il est parfois pratique de spécifier une liste d'alternatives en fragments. C'est-à-dire qu'une règle initiale peut correspondre à une ou plusieurs alternatives, avec des alternatives supplémentaires définies plus tard. Ceci est particulièrement utile pour les spécifications par ailleurs indépendantes qui dérivent du même ensemble de règles parent, comme c'est souvent le cas avec les listes de paramètres. ABNF permet cette définition incrémentale à travers la construction :
oldrule =/ additional-alternatives
3.4. Value Range Alternatives: %c##-## (Alternatives de plage de valeurs)
Une plage de valeurs numériques alternatives peut être spécifiée de manière compacte, en utilisant un tiret ("-") pour indiquer la plage de valeurs alternatives. Donc :
DIGIT = %x30-39
est équivalent à :
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"
3.5. Sequence Group: (Rule1 Rule2) (Groupe de séquence)
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).
elem foo / bar blat
correspond à (elem foo) ou (bar blat).
3.6. Variable Repetition: *Rule (Répétition variable)
L'opérateur "*" précédant un élément indique une répétition. La forme complète est :
<a>*<b>element
où <a> et <b> sont des valeurs décimales optionnelles, indiquant au moins <a> et au plus <b> occurrences de l'élément.
Les valeurs par défaut sont 0 et l'infini, de sorte que *<element> permet n'importe quel nombre, y compris zéro ; 1*<element> nécessite au moins un ; 3*3<element> permet exactement 3 ; et 1*2<element> permet un ou deux.
3.7. Specific Repetition: nRule (Répétition spécifique)
Une règle de la forme :
<n>element
est équivalente à :
<n>*<n>element
C'est-à-dire exactement <n> occurrences de <element>. Ainsi, 2DIGIT est un nombre à 2 chiffres, et 3ALPHA est une chaîne de trois caractères alphabétiques.
3.8. Optional Sequence: [RULE] (Séquence optionnelle)
Les crochets englobent une séquence d'éléments optionnelle :
[foo bar]
est équivalent à :
*1(foo bar)
3.9. Comment: ; Comment (Commentaire)
Un point-virgule commence un commentaire qui se poursuit jusqu'à la fin de la ligne. C'est une façon simple d'inclure des notes utiles en parallèle avec les spécifications.
3.10. Operator Precedence (Priorité des opérateurs)
Les différents mécanismes décrits ci-dessus ont la priorité suivante, du plus élevé (liaison la plus forte) en haut, au plus bas (le plus lâche) en bas :
- Nom de règle, valeur de prose, Valeur terminale
- Commentaire
- Plage de valeurs
- Répétition
- Groupement, optionnel
- Concaténation
- Alternative
L'utilisation de l'opérateur alternatif, librement mélangé avec des concaténations, peut être déroutante. Il est recommandé d'utiliser l'opérateur de groupement pour rendre explicites les groupes de concaténation.