Passa al contenuto principale

3. Operatori

3.1. Concatenazione: Rule1 Rule2​

Una regola può definire una stringa semplice e ordinata di valori (cioè una concatenazione (concatenation) di caratteri contigui) elencando una sequenza di nomi di regola. Per esempio:

      foo         =  %x61           ; a

bar = %x62 ; b

mumble = foo bar foo

In modo che la regola corrisponda alla stringa minuscola "aba".

Spazio bianco lineare (Linear white space): la concatenazione è al centro del modello di analisi (parsing) dell'ABNF. Una stringa di caratteri contigui (valori) viene analizzata secondo le regole definite in ABNF. Per le specifiche Internet, vi è una certa tradizione nel consentire che lo spazio bianco lineare (spazio e tabulazione orizzontale) sia liberamente e implicitamente intervallato attorno ai costrutti principali, quali delimitatori di caratteri speciali o stringhe atomiche.

NOTA:

La presente specifica per l'ABNF non prevede la specificazione implicita dello spazio bianco lineare.

Qualsiasi grammatica che desideri consentire spazio bianco lineare attorno a delimitatori o segmenti di stringa deve specificarlo esplicitamente. È spesso utile prevedere tale spazio bianco in regole "core" (di base), che vengono poi utilizzate in vario modo tra regole di livello superiore. Le regole "core" possono essere riunite in un analizzatore lessicale (lexical analyzer) oppure far semplicemente parte dell'insieme di regole principale (ruleset).

3.2. Alternative: Rule1 / Rule2​

Gli elementi separati da una barra obliqua ("/") sono alternative (alternatives). Pertanto,

  foo / bar

accetterà o .

NOTA:

Una stringa tra virgolette contenente caratteri alfabetici è una forma speciale per specificare caratteri alternativi ed è interpretata come un non terminale (non-terminal) che rappresenta l'insieme delle stringhe combinatorie con i caratteri contenuti, nell'ordine specificato ma con qualsiasi combinazione di maiuscole e minuscole.

3.3. Alternative incrementali: Rule1 =/ Rule2​

A volte è comodo specificare un elenco di alternative in frammenti. Vale a dire, una regola iniziale può corrispondere a una o più alternative, e le definizioni di regole successive si aggiungono all'insieme delle alternative. Ciò è particolarmente utile per specifiche altrimenti indipendenti che derivano dallo stesso insieme di regole padre (parent ruleset), come accade spesso con gli elenchi di parametri. L'ABNF consente questa definizione incrementale tramite il costrutto:

      oldrule     =/ additional-alternatives

In modo che l'insieme di regole

      ruleset     =  alt1 / alt2

ruleset =/ alt3

ruleset =/ alt4 / alt5

sia lo stesso che specificare

      ruleset     =  alt1 / alt2 / alt3 / alt4 / alt5

3.4. Alternative di intervallo di valori: %c##-##​

Un intervallo di valori numerici alternativi può essere specificato in modo compatto, usando un trattino ("-") per indicare l'intervallo di valori alternativi. Pertanto:

      DIGIT       =  %x30-39

è equivalente a:

      DIGIT       =  "0" / "1" / "2" / "3" / "4" / "5" / "6" /
                 "7" / "8" / "9"

Valori numerici concatenati e intervalli di valori numerici non possono essere specificati nella stessa stringa. Un valore numerico può usare la notazione con punti per la concatenazione, oppure può usare la notazione con trattino per specificare un solo intervallo di valori. Pertanto, per specificare un carattere stampabile tra sequenze di fine riga, la specifica potrebbe essere:

      char-line = %x0D.0A %x20-7E %x0D.0A

3.5. Gruppo di sequenza: (Rule1 Rule2)​

Gli elementi racchiusi tra parentesi sono trattati come un unico elemento, il cui contenuto è strettamente ordinato. Così,

  elem (foo / bar) blat

corrisponde a (elem foo blat) o (elem bar blat), e

  elem foo / bar blat

corrisponde a (elem foo) o (bar blat).

NOTA:

Si raccomanda vivamente di usare la notazione di raggruppamento, invece di affidarsi alla corretta lettura delle alternanze "nude" ("bare"), quando le alternative consistono di più nomi di regola o letterali.

Pertanto, si raccomanda di usare la seguente forma:

 (elem foo) / (bar blat)

Ciò eviterà interpretazioni errate da parte dei lettori occasionali.

La notazione di gruppo di sequenza è anche usata all'interno del testo libero per separare una sequenza di elementi dalla prosa.

3.6. Ripetizione variabile: *Rule​

L'operatore "*" che precede un elemento indica la ripetizione (repetition). La forma completa è:

  <a>*<b>element

dove e sono valori decimali opzionali, che indicano almeno e al massimo occorrenze dell'elemento.

I valori predefiniti sono 0 e infinito, così che consente qualsiasi numero, incluso zero; 1 richiede almeno uno; 33 consente esattamente 3; e 12 consente uno o due.

3.7. Ripetizione specifica: nRule​

Una regola della forma:

  <n>element

è equivalente a

  <n>*<n>element

Vale a dire, esattamente occorrenze di . Così, 2DIGIT è un numero a 2 cifre e 3ALPHA è una stringa di tre caratteri alfabetici.

3.8. Sequenza opzionale: [RULE]​

Le parentesi quadre racchiudono una sequenza di elementi opzionale:

  [foo bar]

è equivalente a

  *1(foo bar).

3.9. Commento: ; Comment​

Un punto e virgola inizia un commento che continua fino alla fine della riga. Questo è un modo semplice per includere note utili parallelamente alle specifiche.

3.10. Precedenza degli operatori​

I vari meccanismi descritti sopra hanno la seguente precedenza, dalla più alta (che lega più strettamente) in alto, alla più bassa (più debole) in basso:

Rule name, prose-val, Terminal value

Comment

Value range

Repetition

Grouping, Optional

Concatenation

Alternative

L'uso dell'operatore di alternativa, liberamente mescolato con concatenazioni, può essere fonte di confusione.

Ancora una volta, si raccomanda di usare l'operatore di raggruppamento per rendere espliciti i gruppi di concatenazione.