Zum Hauptinhalt springen

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 mit der Zeichenkette aus Kleinbuchstaben "aba" übereinstimmt.

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

oder akzeptieren.

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 jede Anzahl einschließlich Null zulässt; 1 erfordert mindestens eins; 33 erlaubt genau 3; und 12 erlaubt eins oder zwei.

3.7. Spezifische Wiederholung (Specific Repetition): nRule​

Eine Regel der Form:

  <n>element

ist äquivalent zu

  <n>*<n>element

Das heißt genau Vorkommen von . Somit ist 2DIGIT eine zweistellige Zahl, und 3ALPHA ist eine Zeichenkette aus drei alphabetischen Zeichen.

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.