7. Estensione di lista ABNF: #rule
Un'estensione #rule alle regole ABNF di [RFC5234] è usata per migliorare la leggibilità nelle definizioni di alcuni valori dei campi di intestazione.
È definito un costrutto "#", simile a "*", per definire elenchi di elementi delimitati da virgole. La forma completa è "
In qualsiasi produzione che usi il costrutto di lista, un mittente MUST NOT generare elementi di lista vuoti. In altre parole, un mittente MUST generare liste che soddisfino la seguente sintassi:
1#element => element *( OWS "," OWS element )
e:
#element => [ 1#element ]
e per n >= 1 e m > 1:
<n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element )
Per compatibilità con le regole di lista legacy, un destinatario MUST analizzare e ignorare un numero ragionevole di elementi di lista vuoti: un numero sufficiente a gestire gli errori comuni dei mittenti che uniscono i valori, ma non così elevato da poter essere usato come meccanismo di denial-of-service. In altre parole, un destinatario MUST accettare liste che soddisfino la seguente sintassi:
#element => [ ( "," / element ) *( OWS "," [ OWS element ] ) ]
1#element => *( "," OWS ) element *( OWS "," [ OWS element ] )
Gli elementi vuoti non contribuiscono al conteggio degli elementi presenti. Ad esempio, date queste produzioni ABNF:
example-list = 1#example-list-elmt
example-list-elmt = token ; see Section 3.2.6
Allora i seguenti sono valori validi per example-list (escluse le virgolette doppie, che sono presenti solo per delimitazione):
"foo,bar"
"foo ,bar,"
"foo , ,bar,charlie "
Al contrario, i seguenti valori sarebbero non validi, poiché la produzione example-list richiede almeno un elemento non vuoto:
""
","
", ,"
L'Appendice B mostra l'ABNF raccolto per i destinatari dopo che i costrutti di lista sono stati espansi.