Éléments lexicaux
Le texte d'un programme est constitué des textes d'une ou plusieurs compilations. Le texte d'une compilation est une suite d'éléments lexicaux, chacun composé de caractères; les règles de composition sont données dans cette page. Les pragmas, fournissant certaines informations au compilateur, sont également décrits dans cette page.
Ensemble de caractères
Les seuls caractères autorisés dans le texte d'un programme sont les caractères graphiques et les effecteurs de format. Chaque caractère graphique correspond à un code unique d'un ensemble de caractères codés ISO à sept bits (norme ISO 646) et est représenté (visuellement) par un symbole graphique. Certains caractères graphiques sont représentés par des symboles graphiques différents dans des représentations nationales alternatives de l'ensemble de caractères ISO. La description de la définition du langage de programmation dans cette section de référence standard utilise les symboles graphiques ASCII, la représentation graphique ANSI de l'ensemble de caractères ISO.
caractere_graphique ::= caractere_graphique_de_base | lettre_minuscule | autre_caractere_special caractere_graphique_de_base lettre_majuscule | chiffre | caractere_special | espace_caractère caractere_de_base ::= caractere_graphique_de_base | format_effecteur |
L'ensemble de caractères de base est suffisant pour écrire n'importe quel programme. Les caractères inclus dans chacune des catégories de caractères graphiques de base sont définis comme suit :
Catégorie | Contient |
---|---|
Lettres majuscules | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
Chiffres | 0123456789 |
Caractères spéciaux | " # & ' ( ) * + , - . / : ; < = > _ | |
Caractère d'espace |
Les effecteurs de format sont les caractères ISO (et ASCII) appelés tabulation horizontale, tabulation verticale, retour chariot, saut de ligne et saut de page.
Les caractères inclus dans chacune des catégories restantes de caractères graphiques sont définis comme suit :
Catégorie | Contient |
---|---|
Lettres minuscules | abcdefghijklmnopqrstuvwxyz |
Autres caractères spéciaux | ! $ % ? @ [ \ ] ^ ` { } ~ |
Les remplacements autorisés pour les caractères spéciaux barre verticale (|), dièse (#) et citation (") sont définis dans quelques section plus loin.
Remarques : Le caractère ISO correspondant au symbole graphique dièse dans la représentation ASCII apparaît comme un symbole de la livre sterling dans les représentations nationales standard françaises, allemandes et britanniques. Dans tous les cas, la conception de la police de caractères des symboles graphiques (par exemple, qu'ils soient en italique ou en gras) ne fait pas partie de la norme ISO.
La signification des acronymes utilisés dans cette section est la suivante : ANSI signifie American National Standards Institute, ASCII signifie American Standard Code for Information Interchange et ISO signifie International Organization for Standardization.
Les noms suivants sont utilisés pour désigner des caractères spéciaux et d'autres caractères spéciaux&nbps;:
Symbole | Nom |
---|---|
" | citation |
# | dièse |
& | esperluette |
' | apostrophe |
( | parenthèse gauche |
) | parenthèse droite |
* | étoile, multiplier |
+ | plus |
, | virgule |
- | trait d'union, moins |
. | point, période |
/ | barre oblique, diviser |
: | deux-points |
; | point-virgule |
< | inférieur à |
= | égale |
> | supérieur à |
_ | souligner |
| | barre verticale |
! | point d'exclamation |
$ | dollar |
% | pourcentage |
? | point d'interrogation |
@ | a commercial, arobas |
[ | crochet gauche |
\ | barre oblique inverse |
] | crochet droit |
^ | accent circonflexe |
` | accent grave |
{ | accolade gauche |
} | accolade droite |
~ | tilde |
Éléments lexicaux, séparateurs et délimiteurs
Le texte d'un programme est constitué des textes d'une ou plusieurs compilations. Le texte de chaque compilation est une séquence d'éléments lexicaux distincts. Chaque élément lexical est soit un délimiteur, un identificateur (pouvant être un mot réservé), un littéral numérique, un littéral de caractère, un littéral de chaîne de caractères ou un commentaire. L'effet d'un programme dépend uniquement des séquences particulières d'éléments lexicaux formant ses compilations, à l'exclusion des commentaires, le cas échéant.
Dans certains cas, un séparateur explicite est nécessaire pour séparer les éléments lexicaux adjacents (c'est-à-dire, lorsque sans séparation, l'interprétation comme un élément lexical unique est possible). Un séparateur est un caractère d'espace, un effecteur de format ou une fin de ligne. Un caractère d'espace est un séparateur sauf dans un commentaire, une chaîne de caractères littérale ou un caractère d'espace littéral. Les effecteurs de format autres que la tabulation horizontale sont toujours des séparateurs. La tabulation horizontale est un séparateur sauf dans un commentaire. La fin d'une ligne est toujours un séparateur. Le langage ne définit pas ce qui provoque la fin d'une ligne. Cependant, si, pour une implémentation donnée, la fin d'une ligne est signifiée par un ou plusieurs caractères, alors ces caractères doivent être des effecteurs de format autres que la tabulation horizontale. Dans tous les cas, une séquence d'un ou plusieurs effecteurs de format autres que la tabulation horizontale doit provoquer au moins une fin de ligne.
Un ou plusieurs séparateurs sont autorisés entre deux éléments lexicaux adjacents, avant le premier de chaque compilation ou après le dernier. Au moins un séparateur est requis entre un identificateur ou un littéral numérique et un identificateur ou un littéral numérique adjacent.
Un délimiteur est l'un des caractères spéciaux suivants (dans l'ensemble de caractères de base) :
& ' ( ) * + , - . / : ; < = > | |
ou l'un des délimiteurs composés suivants, chacun composé de deux caractères spéciaux adjacents :
=> .. ** := /= >= <= << >> <> |
Chacun des caractères spéciaux répertoriés pour les délimiteurs de caractères simples est un délimiteur simple, sauf si ce caractère est utilisé comme caractère d'un délimiteur composé, ou comme caractère d'un commentaire, d'une chaîne littérale, d'un caractère littéral ou d'un numérique littéral.
Les autres formes d'éléments lexicaux sont décrites dans d'autres sections de cette page.
Remarques : chaque élément lexical doit tenir sur une ligne, car la fin d'une ligne est un séparateur. Les guillemets, les dièses et les caractères soulignés, ainsi que deux tirets adjacents, ne sont pas des délimiteurs, mais peuvent faire partie d'autres éléments lexicaux.
Les noms suivants sont utilisés pour désigner les délimiteurs composés :
Délimiteur | Nom |
---|---|
=> | Flèche |
.. | Double point |
** | Double étoile, exponentielle |
:= | affectation (prononcé : «devient») |
/= | inégalité (prononcé : «pas égal») |
>= | supérieur ou égal |
<= | inférieur ou égal |
<< | crochet d'étiquette gauche |
>> | crochet d'étiquette droit |
<> | boîte |
Identifiants
Les identifiants sont utilisés comme noms et également comme mots réservés :
identificateur ::= lettre ([souligner] lettre_ou_chiffre| lettre_ou_chiffre ::= lettre | chiffre lettre ::= lettre_majuscule | lettre_minuscule |
Tous les caractères d'un identifiant sont significatifs, y compris tout caractère de soulignement inséré entre une lettre ou un chiffre et une lettre ou un chiffre adjacent. Les identifiants qui ne diffèrent que par l'utilisation de lettres majuscules et minuscules correspondantes sont considérés comme identiques.
Exemples
- COUNT X get_symbol Ethelyn Marion
- SNOBOI_4 X1 PageCount STORE_NEXT_ITEM
Remarque : aucun espace n'est autorisé dans un identifiant, car un espace est un séparateur.
Littéraux numériques
Il existe deux classes de littéraux numériques : les littéraux réels et les littéraux entiers. Un littéral réel est un littéral numérique incluant un point; un littéral entier est un littéral numérique sans point. Les littéraux réels sont les littéraux de type universel_real. Les littéraux entiers sont les littéraux de type universal_integer.
litteral_numerique ::= litteral_decimal | litteral_base |
Littéraux décimaux
Un littéral décimal est un littéral numérique exprimé dans la notation décimale conventionnelle (c'est-à-dire que la base est implicitement dix) :
decimaLliteral ::= entier [.entier] [exposant] entier ::= chiffre [[soulignement] chiffre] exposant ::= E [ + ] entier | E - entier |
Un caractère de soulignement inséré entre des chiffres adjacents d'un littéral décimal n'affecte pas la valeur de ce littéral numérique. La lettre E de l'exposant, le cas échéant, peut être écrite soit en minuscule, soit en majuscule, avec la même signification.
Un exposant indique la puissance de dix par laquelle la valeur du littéral décimal sans l'exposant doit être multipliée pour obtenir la valeur du littéral décimal avec l'exposant. Un exposant pour un littéral entier ne doit pas avoir de signe moins.
Exemples :
- 12 0 1E6 123_456 -- littéraux entiers
- 12.0 0.0 0.456 3.14159_26 -- littéraux réels
- 1.34E-12 1.0E+6 -- littéraux réels avec exposant
Remarques : les zéros non significatifs sont autorisés. Aucun espace n'est autorisé dans un littéral numérique, pas même entre les constituants de l'exposant, car un espace est un séparateur. Un exposant nul est autorisé pour un littéral entier.
Littéraux de base
Un littéral de base est un littéral numérique exprimé sous une forme spécifiant explicitement la base. La base 1 doit être au moins égale à deux et au plus à seize :
base_litteral ::= base ≠ base_entier [.base_entier] # [exposant] base ::= entier base_entier ::= chiffre_etendu {[souligner] chiffre_etendu} chiffre_etendu ::= chiffre | lettre |
Un caractère de soulignement inséré entre des chiffres adjacents d'un littéral de base n'affecte pas la valeur de ce littéral numérique. La base et l'exposant, le cas échéant, sont en notation décimale. Les seules lettres autorisées comme chiffres étendus sont les lettres A à F pour les chiffres dix à quinze. Une lettre dans un littéral de base (soit un chiffre étendu, soit la lettre E d'un exposant) peut être écrite en minuscule ou en majuscule, avec la même signification.
La signification conventionnelle de la notation basée est supposée ; en particulier, la valeur de chaque chiffre étendu d'un littéral de base doit être inférieure à la base. Un exposant indique la puissance de la base par laquelle la valeur du littéral de base sans l'exposant doit être multipliée pour obtenir la valeur du littéral de base avec l'exposant.
Exemples
- 2#1111_1111# 16#FF# 016#0FF# -- littéraux entiers de valeur 255
- 16#E#E1 2#1110_0000# -- littéraux entiers de valeur 224
- 16#F.FF#E+2 2#1.1111_1111_111#E11 -- littéraux réels de valeur 4095,0
Littéraux de caractère
Un littéral de caractère est formé en enfermant l'un des 95 caractères graphiques (espace compris) entre deux caractères d'apostrophe. Un littéral de caractère a une valeur appartenant à un type de caractère.
caractere-literale 'caractere_graphique' |
Exemple
- 'A' '*' ... ' '
Littéraux de chaîne de caractères
Un littéral de chaîne de caractères est formé d'une séquence de caractères graphiques (éventuellement aucun) enfermés entre deux guillemets utilisés comme crochets de chaîne de caractères.
chaine-litterale "{caractere_graphique}" |
Un littéral de chaîne de caractères a une valeur étant une séquence de valeurs de caractères correspondant aux caractères graphiques du littéral de chaîne de caractères, à l'exception du caractère de citation lui-même. Si une valeur de caractère de citation doit être représentée dans la séquence de valeurs de caractères, une paire de caractères de citation adjacents doit être écrite à l'emplacement correspondant dans le littéral de chaîne. (Cela signifie qu'un littéral de chaîne qui comprend deux caractères de citation adjacents n'est jamais interprété comme deux littéraux de chaîne adjacents.)
a longueur d'un littéral de chaîne de caractères est le nombre de valeurs de caractères dans la séquence représentée. (Chaque caractère de citation doublé est compté comme un caractère unique.)
Exemples :
- "Message du jour :"
- "" -- une chaîne de caractères littérale vide
- " " "A" """ -- trois chaînes de caractères littérales de longueur 1
- "Les caractères tels que $, %, et } sont autorisés dans les littéraux de chaîne de caractères"
Remarque : Une chaîne de caractères littérale doit tenir sur une seule ligne car il s'agit d'un élément lexical. Des séquences plus longues de 6 valeurs de caractères graphiques peuvent être obtenues par la chaîne de littéraux de chaîne de caractères. De même, la chaîne de caractères de constantes déclarées dans le paquet ASCII peut être utilisée pour obtenir des séquences de valeurs de caractères incluant des valeurs de caractères non graphiques (les soi-disant caractères de contrôle). Des exemples de telles utilisations de la chaîne de caractères sont donnés ci-dessous :
- "PREMIÈRE PARTIE D'UNE SÉQUENCE DE CARACTÈRES " &
- "CONTINUANT SUR LA LIGNE SUIVANTE"
- "séquence incluant le " & ASCII.ACK & " caractère de contrôle"
Les commentaires
Un commentaire commence par deux tirets adjacents et s'étend jusqu'à la fin de la ligne. Un commentaire peut apparaître sur n'importe quelle ligne d'un programme. La présence ou l'absence de commentaires n'a aucune influence sur la légalité ou l'illégalité d'un programme. De plus, les commentaires n'influencent pas l'effet d'un programme ; leur seul but est d'éclairer le lecteur humain.
Exemples
- --la dernière phrase ci-dessus fait écho au rapport Algol 68
- end; -- le traitement de LINE est terminé
- -- un long commentaire peut être divisé en
- -- deux ou plusieurs lignes consécutives
- -------- les deux premiers tirets commencent le commentaire
Remarque : la tabulation horizontale peut être utilisée dans les commentaires, après le double trait d'union, et équivaut à 3 espaces ou plus.
Les pragmas
Un pragma est utilisé pour transmettre des informations au compilateur. Un pragma commence par le mot réservé pragma suivi d'un identifiant étant le nom du pragma :
pragma ::= pragma identificateur [(association_parametre |, association_parametre|)]; association_parametre := [identificateur_parametre =>] nom | [identificateur_parametre =>] expression |
Les pragmes ne sont autorisés qu'aux endroits suivants dans un programme :
- Après un délimiteur point-virgule, mais pas dans une partie formelle ou discriminante.
- À tout endroit où les règles de syntaxe autorisent une construction définie par une catégorie syntaxique dont le nom se termine par «déclaration», «instruction», «clause» ou «alternative», ou l'une des catégories syntaxiques variante et gestionnaire d'exceptions ; mais pas à la place d'une telle construction. Également à tout endroit où une unité de compilation serait autorisée.
Des restrictions supplémentaires existent pour le placement de pragmas spécifiques.
Certains pragmas ont des paramètres. Les associations d'arguments peuvent être soit positionnelles, soit nommées comme pour les associations de paramètres d'appels de sous-programmes. Les associations nommées ne sont cependant possibles que si les identifiants d'arguments sont définis. Un nom donné dans un paramètre doit être soit un nom visible à la place du pragma, soit un identifiant spécifique au pragma.
Les pragmas doivent être pris en charge par chaque implémentation. De plus, une implémentation peut fournir des pragmas définis par l'implémentation. Une implémentation n'est pas autorisée à définir des pragmas dont la présence ou l'absence influence la légalité du texte en dehors de ces pragmas. Par conséquent, la légalité d'un programme ne dépend pas de la présence ou de l'absence de pragmas définis par l'implémentation.
Un pragma qui n'est pas défini par le langage n'a aucun effet si son identifiant n'est pas reconnu par l'implémentation (actuelle). De plus, un pragma (qu'il soit défini par le langage ou par l'implémentation) n'a aucun effet si son placement ou ses paramètres ne correspondent pas à ce qui est autorisé pour le pragma. La région de texte sur laquelle un pragma a un effet dépend du pragma.
Exemples
- pragma LIST(OFF);
- pragma OPTIMIZE(TIME);
- pragma INLINE(SETMASK);
- pragma SUPPRESS(RANGE_CHECK, ON => INDEX);
Remarque : il est recommandé (mais pas obligatoire) que les implémentations émettent des avertissements pour les pragmas n'étant pas reconnus et donc ignorés.
Les mots réservés
Les identifiants répertoriés ci-dessous sont appelés mots réservés et sont réservés pour une signification particulière dans le langage de programmation Ada. Pour une meilleure lisibilité de cette page, les mots réservés apparaissent en minuscules et en gras :
- abort
- abs
- accept
- access
- all
- and
- array
- at
- begin
- body
- case
- constant
- declare
- delay
- delta
- digits
- do
- else
- elsif
- exception
- end
- entry
- exit
- for
- function
- generic
- goto
- if
- in
- is
- limited
- loop
- mod
- new
- not
- null
- of
- or
- others
- out
- package
- pragma
- private
- procedure
- raise
- range
- record
- rem
- renames
- return
- reverse
- select
- separate
- subtype
- task
- terminate
- then
- type
- use
- when
- while
- with
- xor
Un mot réservé ne doit pas être utilisé comme identifiant déclaré.
Remarques : les mots réservés qui ne diffèrent que par l'utilisation de lettres majuscules et minuscules correspondantes sont considérés comme identiques. Dans certains attributs, l'identifiant apparaissant après l'apostrophe est identique à un mot réservé.
Remplacements autorisés des caractères
Les remplacements suivants sont autorisés pour les caractères de base de la barre verticale, du dièse et des guillemets :
- Un caractère de barre verticale (|) peut être remplacé par un point d'exclamation (!) lorsqu'il est utilisé comme délimiteur.
- Les caractères dièse {#) d'un littéral de base peuvent être remplacés par des deux points (:) à condition que le remplacement soit effectué pour les deux occurrences.
- Les guillemets (") utilisés comme crochets de chaîne aux deux extrémités d'un littéral de chaîne de caractères peuvent être remplacés par des caractères de pourcentage (%) à condition que la séquence de caractères incluse ne contienne aucun caractère de guillemet et à condition que les deux crochets de chaîne soient remplacés. Tout caractère de pourcentage dans la séquence de caractères doit alors être doublé et chaque caractère de pourcentage doublé est interprété comme une valeur de caractère de pourcentage unique.
Ces remplacements ne changent pas la signification du programme.
Remarques : il est recommandé de limiter l'utilisation des remplacements pour les caractères de barre verticale, de dièse et de guillemets aux cas où les symboles graphiques correspondants ne sont pas disponibles. Notez que la barre verticale apparaît sous la forme d'une barre brisée sur certains équipements; le remplacement n'est pas recommandé dans ce cas.
Les règles données pour les identifiants et les littéraux numériques sont telles que les lettres minuscules et majuscules peuvent être utilisées indifféremment; ces éléments lexicaux peuvent ainsi être écrits en utilisant uniquement des caractères de l'ensemble de caractères de base. Si un littéral de chaîne de type prédéfini STRING contient des caractères n'étant pas dans l'ensemble de caractères de base, la même séquence de valeurs de caractères peut être obtenue en enchaînant les littéraux de chaîne de caractères ne contenant que des caractères de l'ensemble de caractères de base avec des constantes de caractères appropriées déclarées dans le paquet prédéfini ASCII. Ainsi, le littéral de chaîne "AB $CD'' pourrait être remplacé par "AB" & ASCII.DOLLAR & "CD De même, le littéral de chaîne de caractères "ABcd " avec des lettres minuscules pourrait être remplacé par "AB " & ASCII .LC_C & ASCII.IC_D.