3. Syntax (Sintassi)
3.1. Introduction (Introduzione)
La sintassi fornita in questa sezione definisce la sintassi legale dei messaggi Internet. I messaggi conformi a questa specifica DEVONO conformarsi alla sintassi di questa sezione. Se ci sono opzioni in questa sezione in cui un'opzione DOVREBBE essere generata, ciò è indicato nel testo o in un commento accanto alla sintassi.
Per le espressioni definite, viene fornita una breve descrizione della sintassi e dell'uso, seguita dall'ABNF, seguita da un'analisi semantica. I token primitivi utilizzati ma non altrimenti specificati in questo documento sono tratti dalle "Regole di base" dell'Appendice B.1 di RFC 5234: CR, LF, CRLF, HTAB, SP, WSP, DQUOTE, DIGIT, ALPHA e VCHAR.
In alcune definizioni, ci saranno non-terminali i cui nomi iniziano con "obs-". Questi elementi "obs-" si riferiscono ai token definiti nella sintassi obsoleta nella Sezione 4. In tutti i casi, queste produzioni dovrebbero essere ignorate ai fini della generazione di messaggi Internet legali e NON DEVONO essere utilizzate come parte di tali messaggi. Tuttavia, nell'interpretare i messaggi, questi token DEVONO essere rispettati come parte della sintassi legale. In questo senso, la Sezione 3 definisce una grammatica per la generazione di messaggi, con elementi "obs-" che devono essere ignorati, mentre la Sezione 4 aggiunge a quella grammatica per specificare una grammatica per l'interpretazione dei messaggi.
Concetti chiave:
| Concetto | Descrizione |
|---|---|
| Generazione di messaggi | Sintassi della Sezione 3, ignorare elementi obs- |
| Analisi di messaggi | Sezione 3 + Sezione 4, includere elementi obs- |
| Elementi obs- | Sintassi obsoleta, NON DEVE generare ma DEVE analizzare |
3.2. Lexical Tokens (Token lessicali)
Le seguenti regole vengono utilizzate per definire un analizzatore lessicale sottostante che fornisce token ai parser di livello superiore. Questa sezione definisce i token utilizzati nei corpi dei campi di intestazione strutturati.
Nota: I lettori di questa specifica devono prestare particolare attenzione a come questi token lessicali vengono utilizzati sia nella sintassi di basso che di alto livello più avanti nel documento. In particolare, i token di spazio bianco e di commento definiti nella Sezione 3.2.2 sono utilizzati nelle definizioni dei token di basso livello definiti qui, e questi token di basso livello sono a loro volta utilizzati come parti dei token di alto livello definiti successivamente. Pertanto, anche se lo spazio bianco e i commenti potrebbero non apparire esplicitamente in una particolare definizione, possono essere consentiti tra i token in una costruzione di livello superiore.
3.2.1. Quoted characters (Caratteri quotati)
Alcuni caratteri sono riservati per interpretazione speciale, come delimitare i token lessicali. Per consentire l'uso di questi caratteri come dati non interpretati, viene fornito un meccanismo di quotazione.
quoted-pair = ("\" (VCHAR / WSP)) / obs-qp
Ovunque appaia un quoted-pair, deve essere interpretato come il singolo carattere ottenuto rimuovendo il backslash. Cioè, il carattere "" che appare come parte di un quoted-pair è semanticamente "invisibile".
Nota: Il carattere "" può apparire in un messaggio dove non fa parte di un quoted-pair. Un carattere "" che non appare in un quoted-pair non è semanticamente invisibile. Gli unici luoghi in questa specifica dove quoted-pair appare attualmente sono in ccontent, qcontent e in obs-dtext nella Sezione 4.
Esempi:
Backslash quotato: "\\" → Interpretato come: \
Virgolette quotate: "\"" → Interpretato come: "
Spazio quotato: "\ " → Interpretato come: (spazio)
3.2.2. Folding White Space and Comments (Spazio bianco pieghevole e commenti)
I caratteri di spazio bianco, compresi quelli utilizzati nel folding (descritti nella Sezione 2.2.3), possono apparire tra molti elementi nei corpi dei campi di intestazione. Inoltre, stringhe di caratteri trattate come commenti possono essere incluse nei corpi dei campi strutturati come caratteri racchiusi tra parentesi. Le seguenti definizioni definiscono lo spazio bianco pieghevole (FWS, Folding White Space) e le costruzioni di commenti.
Le stringhe di caratteri racchiuse tra parentesi sono considerate commenti purché non appaiano all'interno di una "quoted-string", come definito nella Sezione 3.2.4. I commenti possono essere annidati.
Ci sono diversi luoghi in questa specifica dove i commenti e il FWS possono essere inseriti liberamente. Per accogliere quella sintassi, viene definito un token "CFWS" aggiuntivo per i luoghi dove i commenti e/o il FWS possono apparire. Tuttavia, dove CFWS appare in questa specifica, NON DEVE essere inserito in modo tale che qualsiasi riga di un campo di intestazione piegato sia costituita interamente da caratteri WSP e nient'altro.
FWS = ([*WSP CRLF] 1*WSP) / obs-FWS
; Spazio bianco pieghevole
ctext = %d33-39 / ; Caratteri US-ASCII
%d42-91 / ; stampabili non includenti
%d93-126 / ; "(", ")", o "\"
obs-ctext
ccontent = ctext / quoted-pair / comment
comment = "(" *([FWS] ccontent) [FWS] ")"
CFWS = (1*([FWS] comment) [FWS]) / FWS
In tutta questa specifica, dove FWS (il token di spazio bianco pieghevole) appare, indica un luogo dove il folding, come discusso nella Sezione 2.2.3, può avvenire. Ovunque il folding appaia in un messaggio (cioè, un corpo di campo di intestazione contenente un CRLF seguito da qualsiasi WSP), l'unfolding (rimozione del CRLF) viene eseguito prima che venga eseguita qualsiasi ulteriore analisi semantica su quel campo di intestazione. Cioè, qualsiasi CRLF che appare in FWS è semanticamente "invisibile".
Esempio di commento:
From: Pete (A nice \) chap) <[email protected]>
↑ ↑
└── Inizio commento └── Parentesi escaped
Nome visualizzato analizzato: Pete
Mailbox effettiva: [email protected]
3.2.3. Atom (Atomo)
Diverse produzioni nei corpi dei campi di intestazione strutturati sono semplicemente stringhe di certi caratteri di base. Tali produzioni sono chiamate atomi (Atoms).
Alcuni corpi di campi di intestazione strutturati consentono anche il carattere punto (".", valore ASCII 46) all'interno di sequenze di atext. Un token "dot-atom" aggiuntivo è definito per questi scopi.
atext = ALPHA / DIGIT / ; Caratteri US-ASCII
"!" / "#" / ; stampabili non includenti
"$" / "%" / ; specials. Usato per atomi.
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
atom = [CFWS] 1*atext [CFWS]
dot-atom-text = 1*atext *("." 1*atext)
dot-atom = [CFWS] dot-atom-text [CFWS]
specials = "(" / ")" / ; Caratteri speciali che non
"<" / ">" / ; appaiono in atext
"[" / "]" /
":" / ";" /
"@" / "\" /
"," / "." /
DQUOTE
Sia atom che dot-atom sono interpretati come un'unica unità, composta dalla stringa di caratteri che la compongono. Semanticamente, i commenti e il FWS opzionali che circondano il resto dei caratteri non fanno parte dell'atomo; l'atomo è solo la sequenza di caratteri atext in un atomo, o i caratteri atext e "." in un dot-atom.
Esempi:
Esempi di atomi:
- john
- example
- user_name
- info+tag
Esempi di dot-atom:
- john.doe
- first.middle.last
- [email protected] (per parte locale mailbox)
3.2.4. Quoted Strings (Stringhe quotate)
Le stringhe di caratteri che includono caratteri diversi da quelli consentiti negli atomi possono essere rappresentate in un formato di stringa quotata, dove i caratteri sono circondati da caratteri di virgolette (DQUOTE, valore ASCII 34).
qtext = %d33 / ; Caratteri US-ASCII
%d35-91 / ; stampabili non includenti
%d93-126 / ; "\" o il carattere di virgolette
obs-qtext
qcontent = qtext / quoted-pair
quoted-string = [CFWS]
DQUOTE *([FWS] qcontent) [FWS] DQUOTE
[CFWS]
Una quoted-string è trattata come un'unità. Cioè, quoted-string è identica ad atom, semanticamente. Poiché una quoted-string può contenere FWS, il folding è permesso. Si noti anche che poiché quoted-pair è consentito in una quoted-string, i caratteri di virgolette e backslash possono apparire in una quoted-string purché appaiano come quoted-pair.
Esempi:
"Joe Q. Public" → Joe Q. Public
"First Last" → First Last
"Giant; \"Big\" Box" → Giant; "Big" Box
3.2.5. Miscellaneous Tokens (Token vari)
Tre token aggiuntivi sono definiti: word e phrase per combinazioni di atomi e/o quoted-strings, e unstructured per campi di intestazione non strutturati e in alcuni luoghi all'interno dei campi di intestazione strutturati.
word = atom / quoted-string
phrase = 1*word / obs-phrase
unstructured = (*([FWS] VCHAR) *WSP) / obs-unstruct
3.3. Date and Time Specification (Specifica di data e ora)
I valori di data e ora appaiono in diversi campi di intestazione. Questa sezione specifica la sintassi per una specifica completa di data e ora. Sebbene lo spazio bianco pieghevole sia consentito in tutta la specifica date-time, è RACCOMANDATO che un singolo spazio sia utilizzato in ogni posizione dove appare FWS (sia richiesto che opzionale); alcune implementazioni più vecchie non interpreteranno correttamente sequenze più lunghe di spazio bianco pieghevole.
date-time = [ day-of-week "," ] date time [CFWS]
day-of-week = ([FWS] day-name) / obs-day-of-week
day-name = "Mon" / "Tue" / "Wed" / "Thu" /
"Fri" / "Sat" / "Sun"
date = day month year
day = ([FWS] 1*2DIGIT FWS) / obs-day
month = "Jan" / "Feb" / "Mar" / "Apr" /
"May" / "Jun" / "Jul" / "Aug" /
"Sep" / "Oct" / "Nov" / "Dec"
year = (FWS 4*DIGIT FWS) / obs-year
time = time-of-day zone
time-of-day = hour ":" minute [ ":" second ]
hour = 2DIGIT / obs-hour
minute = 2DIGIT / obs-minute
second = 2DIGIT / obs-second
zone = (FWS ( "+" / "-" ) 4DIGIT) / obs-zone
Esempi di data-ora:
Formato completo:
Date: Fri, 21 Nov 1997 09:55:06 -0600
Date: Mon, 20 Dec 2025 10:00:00 +0800
Senza giorno della settimana:
Date: 21 Nov 1997 09:55:06 -0600
Ora UTC:
Date: 21 Nov 1997 15:55:06 +0000
3.4. Address Specification (Specifica dell'indirizzo)
Gli indirizzi appaiono in diversi campi di intestazione dei messaggi per indicare mittenti e destinatari dei messaggi. Un indirizzo può essere sia una singola mailbox che un gruppo di mailbox.
address = mailbox / group
mailbox = name-addr / addr-spec
name-addr = [display-name] angle-addr
angle-addr = [CFWS] "<" addr-spec ">" [CFWS] /
obs-angle-addr
group = display-name ":" [group-list] ";" [CFWS]
display-name = phrase
mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list
address-list = (address *("," address)) / obs-addr-list
group-list = mailbox-list / CFWS / obs-group-list
Esempi di indirizzi:
Forma semplice (solo indirizzo):
[email protected]
Forma completa (con nome visualizzato):
Alice Smith <[email protected]>
"Joe Q. Public" <[email protected]>
Più destinatari:
To: [email protected], [email protected]
Indirizzo di gruppo:
To: Development Team: [email protected], [email protected];
3.4.1. Addr-Spec Specification (Specifica addr-spec)
Un addr-spec è un identificatore Internet specifico che contiene una stringa interpretata localmente seguita dal carattere at-sign ("@", valore ASCII 64) seguito da un dominio Internet.
addr-spec = local-part "@" domain
local-part = dot-atom / quoted-string / obs-local-part
domain = dot-atom / domain-literal / obs-domain
domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
dtext = %d33-90 / ; Caratteri US-ASCII
%d94-126 / ; stampabili non includenti
obs-dtext ; "[", "]", o "\"
Esempi di indirizzi:
Formato standard:
[email protected]
[email protected]
Con parte locale quotata:
"joe smith"@example.com
Letterale di dominio (indirizzo IP):
user@[192.0.2.1]
Riepilogo del Capitolo 3
Elementi sintattici chiave
Gerarchia della struttura dei messaggi:
Messaggio (Message)
├── Token lessicali (Lexical Tokens)
│ ├── atom, quoted-string
│ ├── word, phrase
│ └── comment, FWS
├── Data-ora (Date-Time)
│ └── Day, DD Mon YYYY HH:MM:SS +ZZZZ
└── Indirizzo (Address)
├── mailbox: name <user@domain>
└── group: name: addr1, addr2;
Lista di controllo dell'implementazione
- Gestire correttamente lo spazio bianco pieghevole (FWS)
- Supportare i commenti (parentesi annidate)
- Analizzare stringhe quotate e quoted-pairs
- Validare formato e validità di data-ora
- Analizzare indirizzi mailbox e di gruppo
- Gestire parte locale e dominio
- Supportare sintassi obsoleta (solo analizzare, non generare)
Successivo: 4. Obsolete Syntax (Sintassi obsoleta)
Precedente: 2. Lexical Analysis of Messages (Analisi lessicale dei messaggi)