3. Syntax (Syntaxe)
3.1. Introduction
La syntaxe donnée dans cette section définit la syntaxe légale des messages Internet. Les messages conformes à cette spécification DOIVENT se conformer à la syntaxe de cette section. S'il existe des options dans cette section où une option DEVRAIT être générée, cela est indiqué soit dans le texte, soit dans un commentaire à côté de la syntaxe.
Pour les expressions définies, une brève description de la syntaxe et de l'utilisation est donnée, suivie de l'ABNF, puis d'une analyse sémantique. Les jetons primitifs utilisés mais non spécifiés ailleurs dans ce document sont tirés des "Règles de base" de l'annexe B.1 de la RFC 5234: CR, LF, CRLF, HTAB, SP, WSP, DQUOTE, DIGIT, ALPHA et VCHAR.
Dans certaines définitions, il y aura des non-terminaux dont les noms commencent par "obs-". Ces éléments "obs-" font référence aux jetons définis dans la syntaxe obsolète de la section 4. Dans tous les cas, ces productions doivent être ignorées aux fins de générer des messages Internet légaux et NE DOIVENT PAS être utilisées comme partie de tels messages. Cependant, lors de l'interprétation des messages, ces jetons DOIVENT être honorés comme partie de la syntaxe légale. En ce sens, la section 3 définit une grammaire pour la génération de messages, avec des éléments "obs-" qui doivent être ignorés, tandis que la section 4 ajoute à cette grammaire pour spécifier une grammaire d'interprétation des messages.
Concepts de base:
| Concept | Description |
|---|---|
| Génération de message | Syntaxe de la section 3, ignorer les éléments obs- |
| Analyse de message | Section 3 + Section 4, inclure les éléments obs- |
| Éléments obs- | Syntaxe obsolète, NE DOIT PAS générer mais DOIT analyser |
3.2. Lexical Tokens (Jetons lexicaux)
Les règles suivantes sont utilisées pour définir un analyseur lexical sous-jacent qui fournit des jetons aux analyseurs de niveau supérieur. Cette section définit les jetons utilisés dans les corps de champs d'en-tête structurés.
Note: Les lecteurs de cette spécification doivent prêter une attention particulière à la façon dont ces jetons lexicaux sont utilisés à la fois dans la syntaxe de bas niveau et de haut niveau plus loin dans le document. En particulier, les jetons d'espace blanc et de commentaire définis dans la section 3.2.2 sont utilisés dans les définitions des jetons de bas niveau définis ici, et ces jetons de bas niveau sont à leur tour utilisés comme parties des jetons de haut niveau définis plus tard. Par conséquent, même si l'espace blanc et les commentaires peuvent ne pas apparaître explicitement dans une définition particulière, ils peuvent être autorisés entre les jetons dans une construction de niveau supérieur.
3.2.1. Quoted characters (Caractères cités)
Certains caractères sont réservés pour une interprétation spéciale, comme délimiter les jetons lexicaux. Pour permettre l'utilisation de ces caractères comme données non interprétées, un mécanisme de citation est fourni.
quoted-pair = ("\" (VCHAR / WSP)) / obs-qp
Là où une quoted-pair apparaît, elle doit être interprétée comme le caractère unique obtenu en supprimant le backslash. C'est-à-dire que le caractère "" qui apparaît comme partie d'une quoted-pair est sémantiquement "invisible".
Note: Le caractère "" peut apparaître dans un message où il ne fait pas partie d'une quoted-pair. Un caractère "" qui n'apparaît pas dans une quoted-pair n'est pas sémantiquement invisible. Les seuls endroits dans cette spécification où quoted-pair apparaît actuellement sont dans ccontent, qcontent et dans obs-dtext de la section 4.
Exemples:
Backslash cité: "\\" → Interprété comme: \
Guillemet cité: "\"" → Interprété comme: "
Espace cité: "\ " → Interprété comme: (espace)
3.2.2. Folding White Space and Comments (Espace blanc plié et commentaires)
Les caractères d'espace blanc, y compris ceux utilisés dans le pliage (décrits dans la section 2.2.3), peuvent apparaître entre de nombreux éléments dans les corps de champs d'en-tête. De plus, les chaînes de caractères traitées comme des commentaires peuvent être incluses dans les corps de champs structurés comme des caractères entre parenthèses. Les définitions suivantes définissent l'espace blanc plié (FWS, Folding White Space) et les constructions de commentaires.
Les chaînes de caractères entre parenthèses sont considérées comme des commentaires tant qu'elles n'apparaissent pas dans une "quoted-string", telle que définie dans la section 3.2.4. Les commentaires peuvent être imbriqués.
Il existe plusieurs endroits dans cette spécification où les commentaires et le FWS peuvent être librement insérés. Pour accommoder cette syntaxe, un jeton "CFWS" supplémentaire est défini pour les endroits où les commentaires et/ou le FWS peuvent apparaître. Cependant, là où CFWS apparaît dans cette spécification, il NE DOIT PAS être inséré de telle manière qu'une ligne d'un champ d'en-tête plié soit entièrement composée de caractères WSP et rien d'autre.
FWS = ([*WSP CRLF] 1*WSP) / obs-FWS
; Espace blanc plié
ctext = %d33-39 / ; Caractères US-ASCII
%d42-91 / ; imprimables n'incluant pas
%d93-126 / ; "(", ")", ou "\"
obs-ctext
ccontent = ctext / quoted-pair / comment
comment = "(" *([FWS] ccontent) [FWS] ")"
CFWS = (1*([FWS] comment) [FWS]) / FWS
Tout au long de cette spécification, où FWS (le jeton d'espace blanc plié) apparaît, il indique un endroit où le pliage, tel que discuté dans la section 2.2.3, peut avoir lieu. Partout où le pliage apparaît dans un message (c'est-à-dire un corps de champ d'en-tête contenant un CRLF suivi de n'importe quel WSP), le dépliage (suppression du CRLF) est effectué avant toute analyse sémantique supplémentaire sur ce champ d'en-tête. C'est-à-dire que tout CRLF qui apparaît dans FWS est sémantiquement "invisible".
Exemple de commentaire:
From: Pete (A nice \) chap) <[email protected]>
↑ ↑
└── Début du commentaire └── Parenthèse échappée
Nom d'affichage analysé: Pete
Boîte aux lettres réelle: [email protected]
3.2.3. Atom (Atome)
Plusieurs productions dans les corps de champs d'en-tête structurés sont simplement des chaînes de certains caractères de base. Ces productions sont appelées atomes (Atoms).
Certains corps de champs d'en-tête structurés permettent également le caractère point (".", valeur ASCII 46) dans les séquences d'atext. Un jeton "dot-atom" supplémentaire est défini à ces fins.
atext = ALPHA / DIGIT / ; Caractères US-ASCII
"!" / "#" / ; imprimables n'incluant pas
"$" / "%" / ; les specials. Utilisé pour les atomes.
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
atom = [CFWS] 1*atext [CFWS]
dot-atom-text = 1*atext *("." 1*atext)
dot-atom = [CFWS] dot-atom-text [CFWS]
specials = "(" / ")" / ; Caractères spéciaux qui
"<" / ">" / ; n'apparaissent pas dans atext
"[" / "]" /
":" / ";" /
"@" / "\" /
"," / "." /
DQUOTE
Atom et dot-atom sont tous deux interprétés comme une seule unité, composée de la chaîne de caractères qui les constituent. Sémantiquement, les commentaires et le FWS optionnels entourant le reste des caractères ne font pas partie de l'atome; l'atome n'est que la séquence de caractères atext dans un atome, ou les caractères atext et "." dans un dot-atom.
Exemples:
Exemples d'atomes:
- john
- example
- user_name
- info+tag
Exemples de dot-atom:
- john.doe
- first.middle.last
- [email protected] (pour la partie locale de la boîte aux lettres)
3.2.4. Quoted Strings (Chaînes citées)
Les chaînes de caractères qui incluent des caractères autres que ceux autorisés dans les atomes peuvent être représentées dans un format de chaîne citée, où les caractères sont entourés de caractères de guillemet (DQUOTE, valeur ASCII 34).
qtext = %d33 / ; Caractères US-ASCII
%d35-91 / ; imprimables n'incluant pas
%d93-126 / ; "\" ou le caractère de guillemet
obs-qtext
qcontent = qtext / quoted-pair
quoted-string = [CFWS]
DQUOTE *([FWS] qcontent) [FWS] DQUOTE
[CFWS]
Une quoted-string est traitée comme une unité. C'est-à-dire que quoted-string est identique à atom, sémantiquement. Puisqu'une quoted-string peut contenir du FWS, le pliage est permis. Notez également que puisque quoted-pair est autorisé dans une quoted-string, les caractères de guillemet et de backslash peuvent apparaître dans une quoted-string tant qu'ils apparaissent comme une quoted-pair.
Exemples:
"Joe Q. Public" → Joe Q. Public
"First Last" → First Last
"Giant; \"Big\" Box" → Giant; "Big" Box
3.2.5. Miscellaneous Tokens (Jetons divers)
Trois jetons supplémentaires sont définis: word et phrase pour les combinaisons d'atomes et/ou de quoted-strings, et unstructured pour les champs d'en-tête non structurés et à certains endroits dans les champs d'en-tête structurés.
word = atom / quoted-string
phrase = 1*word / obs-phrase
unstructured = (*([FWS] VCHAR) *WSP) / obs-unstruct
3.3. Date and Time Specification (Spécification de la date et de l'heure)
Les valeurs de date et d'heure apparaissent dans plusieurs champs d'en-tête. Cette section spécifie la syntaxe d'une spécification complète de date et d'heure. Bien que l'espace blanc plié soit autorisé tout au long de la spécification date-time, il est RECOMMANDÉ qu'un seul espace soit utilisé à chaque endroit où FWS apparaît (qu'il soit requis ou optionnel); certaines implémentations plus anciennes n'interpréteront pas correctement les séquences plus longues d'espace blanc plié.
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
Exemples de date-heure:
Format complet:
Date: Fri, 21 Nov 1997 09:55:06 -0600
Date: Mon, 20 Dec 2025 10:00:00 +0800
Sans jour de la semaine:
Date: 21 Nov 1997 09:55:06 -0600
Heure UTC:
Date: 21 Nov 1997 15:55:06 +0000
3.4. Address Specification (Spécification d'adresse)
Les adresses apparaissent dans plusieurs champs d'en-tête de message pour indiquer les expéditeurs et les destinataires des messages. Une adresse peut être soit une boîte aux lettres individuelle, soit un groupe de boîtes aux lettres.
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
Exemples d'adresses:
Forme simple (adresse uniquement):
[email protected]
Forme complète (avec nom d'affichage):
Alice Smith <[email protected]>
"Joe Q. Public" <[email protected]>
Plusieurs destinataires:
To: [email protected], [email protected]
Adresse de groupe:
To: Development Team: [email protected], [email protected];
3.4.1. Addr-Spec Specification (Spécification de l'addr-spec)
Un addr-spec est un identifiant Internet spécifique qui contient une chaîne interprétée localement suivie du caractère arobase ("@", valeur ASCII 64) suivi d'un domaine 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 / ; Caractères US-ASCII
%d94-126 / ; imprimables n'incluant pas
obs-dtext ; "[", "]", ou "\"
Exemples d'adresses:
Format standard:
[email protected]
[email protected]
Avec partie locale citée:
"joe smith"@example.com
Littéral de domaine (adresse IP):
user@[192.0.2.1]
Résumé du chapitre 3
Éléments de syntaxe clés
Hiérarchie de la structure des messages:
Message
├── Jetons lexicaux (Lexical Tokens)
│ ├── atom, quoted-string
│ ├── word, phrase
│ └── comment, FWS
├── Date-heure (Date-Time)
│ └── Day, DD Mon YYYY HH:MM:SS +ZZZZ
└── Adresse (Address)
├── mailbox: name <user@domain>
└── group: name: addr1, addr2;
Liste de contrôle d'implémentation
- Gérer correctement l'espace blanc plié (FWS)
- Prendre en charge les commentaires (parenthèses imbriquées)
- Analyser les chaînes citées et les quoted-pairs
- Valider le format et la validité de la date-heure
- Analyser les adresses de boîtes aux lettres et de groupes
- Gérer la partie locale et le domaine
- Prendre en charge la syntaxe obsolète (analyser uniquement, ne pas générer)
Suivant: 4. Obsolete Syntax (Syntaxe obsolète)
Précédent: 2. Lexical Analysis of Messages (Analyse lexicale des messages)