3. Operatoren
3.1. Verkettung (Concatenation): Rule1 Rule2
Eine Regel kann eine einfache, geordnete Zeichenkette von Werten (d. h. eine Verkettung (concatenation) aufeinanderfolgender Zeichen) definieren, indem sie eine Sequenz von Regelnamen auflistet. Zum Beispiel:
foo = %x61 ; a
bar = %x62 ; b
mumble = foo bar foo
Sodass die Regel
Linearer Leerraum (linear white space): Die Verkettung ist der Kern des ABNF-Parsing-Modells. Eine Zeichenkette aufeinanderfolgender Zeichen (Werte) wird gemäß den in ABNF definierten Regeln geparst. Für Internet-Spezifikationen gibt es eine gewisse Tradition, linearen Leerraum (Leerzeichen und horizontalen Tabulator) frei und implizit um wichtige Konstrukte herum zuzulassen, etwa um Sonderzeichen oder atomare Zeichenketten abzugrenzen.
HINWEIS:
Diese Spezifikation für ABNF sieht keine implizite Spezifikation von linearem Leerraum vor.
Jede Grammatik, die linearen Leerraum um Begrenzungszeichen oder Zeichenkettensegmente zulassen möchte, muss ihn explizit angeben. Es ist oft nützlich, solchen Leerraum in "Kern"-Regeln vorzusehen, die dann in unterschiedlicher Weise unter Regeln höherer Ebene verwendet werden. Die "Kern"-Regeln könnten zu einem lexikalischen Analysator geformt werden oder einfach Teil des Hauptregelsatzes sein.
3.2. Alternativen (Alternatives): Rule1 / Rule2
Elemente, die durch einen Schrägstrich ("/") getrennt sind, sind Alternativen. Daher wird
foo / bar
HINWEIS:
Eine Zeichenkette in Anführungszeichen, die alphabetische Zeichen enthält, ist eine spezielle Form zur Angabe alternativer Zeichen und wird als Non-Terminal interpretiert, das die Menge der kombinatorischen Zeichenketten mit den enthaltenen Zeichen in der angegebenen Reihenfolge, aber in beliebiger Mischung aus Groß- und Kleinbuchstaben repräsentiert.
3.3. Inkrementelle Alternativen (Incremental Alternatives): Rule1 =/ Rule2
Es ist manchmal praktisch, eine Liste von Alternativen in Fragmenten zu spezifizieren. Das heißt, eine anfängliche Regel kann auf eine oder mehrere Alternativen passen, wobei spätere Regeldefinitionen die Menge der Alternativen erweitern. Dies ist besonders nützlich für ansonsten unabhängige Spezifikationen, die vom selben übergeordneten Regelsatz abgeleitet sind, wie es häufig bei Parameterlisten vorkommt. ABNF erlaubt diese inkrementelle Definition durch das Konstrukt:
oldrule =/ additional-alternatives
Sodass der Regelsatz
ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5
dasselbe ist wie die Angabe von
ruleset = alt1 / alt2 / alt3 / alt4 / alt5
3.4. Wertebereichs-Alternativen (Value Range Alternatives): %c##-##
Ein Bereich alternativer numerischer Werte kann kompakt spezifiziert werden, wobei ein Bindestrich ("-") den Bereich der alternativen Werte angibt. Daher:
DIGIT = %x30-39
ist äquivalent zu:
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" /
"7" / "8" / "9"
Verkettete numerische Werte und numerische Wertebereiche können nicht in derselben Zeichenkette spezifiziert werden. Ein numerischer Wert kann entweder die Punktnotation für die Verkettung oder die Bindestrichnotation zur Angabe eines Wertebereichs verwenden. Um also ein druckbares Zeichen zwischen Zeilenende-Sequenzen zu spezifizieren, könnte die Spezifikation lauten:
char-line = %x0D.0A %x20-7E %x0D.0A
3.5. Sequenzgruppe (Sequence Group): (Rule1 Rule2)
Elemente, die in Klammern eingeschlossen sind, werden als ein einzelnes Element behandelt, dessen Inhalt streng geordnet ist. Somit
elem (foo / bar) blat
passt auf (elem foo blat) oder (elem bar blat), und
elem foo / bar blat
passt auf (elem foo) oder (bar blat).
HINWEIS:
Es wird dringend empfohlen, die Gruppierungsnotation zu verwenden, anstatt sich auf die korrekte Lesart von "nackten" Alternationen zu verlassen, wenn Alternativen aus mehreren Regelnamen oder Literalen bestehen.
Daher wird empfohlen, die folgende Form zu verwenden:
(elem foo) / (bar blat)
Sie vermeidet Fehlinterpretationen durch flüchtige Leser.
Die Sequenzgruppennotation wird auch innerhalb von freiem Text verwendet, um eine Elementsequenz vom Fließtext abzusetzen.
3.6. Variable Wiederholung (Variable Repetition): *Rule
Der Operator "*" vor einem Element zeigt eine Wiederholung an. Die vollständige Form ist:
<a>*<b>element
wobei und optionale Dezimalwerte sind, die mindestens und höchstens Vorkommen des Elements angeben.
Die Standardwerte sind 0 und unendlich, sodass
3.7. Spezifische Wiederholung (Specific Repetition): nRule
Eine Regel der Form:
<n>element
ist äquivalent zu
<n>*<n>element
Das heißt genau
3.8. Optionale Sequenz (Optional Sequence): [RULE]
Eckige Klammern schließen eine optionale Elementsequenz ein:
[foo bar]
ist äquivalent zu
*1(foo bar).
3.9. Kommentar (Comment): ; Comment
Ein Semikolon beginnt einen Kommentar, der bis zum Zeilenende reicht. Dies ist eine einfache Möglichkeit, nützliche Anmerkungen parallel zu den Spezifikationen aufzunehmen.
3.10. Operatorrangfolge (Operator Precedence)
Die verschiedenen oben beschriebenen Mechanismen haben die folgende Rangfolge, von der höchsten (am stärksten bindenden) oben bis zur niedrigsten (am lockersten bindenden) unten:
Rule name, prose-val, Terminal value
Comment
Value range
Repetition
Grouping, Optional
Concatenation
Alternative
Die Verwendung des Alternativoperators, frei gemischt mit Verkettungen, kann verwirrend sein.
Auch hier wird empfohlen, den Gruppierungsoperator zu verwenden, um Verkettungsgruppen explizit zu machen.