Section courante

A propos

Section administrative du site

Identificateurs et constantes

Les identificateurs désignent des constantes, des types, des variables, des procédures, des fonctions, des programmes et des champs et des champs d'étiquettes dans les enregistrements. Certaines fonctionnalités utilisent également des identifiants; en tant que types de super tableaux, modules, unités et étiquettes d'instructions. Les étiquettes d'instructions sont des entiers ou des identificateurs non signés et ont les mêmes règles de portée que les identificateurs; les zéros non significatifs ne sont pas significatifs. Un identificateur se compose d'une lettre suivie de lettres, de chiffres ou de _s; le _ (trait de soulignement) est significatif. Les identificateurs contenant _ sont autorisés, il s'agit d'une extension mineure de l'ISO Pascal. Deux _s d'affilée ou un identificateur se terminant par _ sont autorisés.

Restrictions de longueur

Les identificateurs peuvent être de n'importe quelle longueur, mais doivent tenir sur une seule ligne. Seuls les 31 premiers caractères d'un identificateur sont significatifs. Un identificateur de plus de 31 caractères provoque un avertissement. Les identifiants transmis à l'éditeur de liens peuvent également comporter 31 caractères. Ceux-ci incluent les identifiants utilisés pour un programme, un module ou une unité étant passés à l'éditeur de liens, ainsi que ceux avec l'attitude PUBLIC ou EXTERN. Dans le code d'objet désassemblé, les identificateurs de variable et de procédure peuvent être tronqués à six caractères si ces identificateurs ne sont pas utilisés par l'éditeur de liens. L'utilisation d'identificateurs de sept caractères ou moins économise de l'espace lors de la compilation. Tous les identificateurs externes utilisés par le système d'exécution sont composés de quatre caractères alphabétiques suivis de "QQ". Par conséquent, les utilisateurs doivent éviter ce format lorsqu'ils créent des noms externes.

Identificateur

La portée d'un identificateur est la même que dans ISO Pascal. L'association d'un identificateur doit être unique dans sa portée. Fondamentalement, la portée d'un identificateur est la procédure, la fonction, le programme, le module, l'implémentation ou l'interface dans laquelle il est défini, y compris toutes les procédures ou fonctions imbriquées. Une procédure ou une fonction imbriquée ne peut redéfinir un identificateur que si l'identificateur n'a pas déjà été utilisé (donc si M est une constante entière dans un programme, une procédure imbriquée ne peut pas faire CONST Q = M + 1; M = 4). Cependant, cette erreur n'est pas interceptée sauf lorsque T est déclaré comme identificateur de type et qu'une procédure ou une fonction imbriquée déclare un type de référence ^T et dans la même section TYPE déclare à nouveau T. La signification d'un type ^T serait ambiguë. Dans ce cas, un avertissement est donné et le T apparaissant plus loin dans la section TYPE est utilisé comme type référent de ^T.

Procédure ou fonction

La portée d'une procédure ou d'une fonction commence immédiatement après l'identificateur de procédure ou de fonction, elle inclut donc la liste de paramètres formels. Cela signifie que l'identificateur de procédure ou de fonction est lui-même un niveau au-dessus de ses paramètres, variables et identificateurs de procédure et de fonction imbriqués. Par exemple, déclarer une variable dans une fonction avec le même identificateur que la fonction est autorisé, même si cela masque l'identificateur de la fonction de sorte qu'une valeur ne peut pas lui être affectée. Un identificateur de programme, de module ou d'unité fait partie du niveau au-dessus des autres identificateurs d'utilisateur. Cependant, ce niveau contient les identificateurs prédéclarés, donc l'utilisation d'un identificateur de programme comme INTEGER ou READ produit une erreur d'identificateur en double.

Champ ou portée de champ

La portée d'un champ (ou tagfield) d'un enregistrement est tout indicateur de champ ou instruction WITH utilisant une variable du type de l'enregistrement. Avec $LIST+, le niveau d'identificateur actuel peut être vu dans la colonne I de la liste comme l'un des 16 niveaux d'identificateur fournis. Un identificateur doit être défini avant d'être utilisé, sauf pour les paramètres de programme et les constituants d'interface, et les types référents. Lorsqu'un référent de type ^T (ou ADR OF T ou ADS OF T) est défini, le type T auquel il fait référence peut apparaître plus tard dans la même section TYPE, permettant une récursion indirecte.

Directive FORWARD

La directive FORWARD, décrite plus loin, permet une récursion indirecte pour les procédures et les fonctions. Les identificateurs étant des paramètres dans un entête de procédure ou de fonction avec la directive FORWARD ne prennent effet que lorsque la procédure ou le bloc de fonction actuel est rencontré. Les identificateurs utilisés lors de la déclaration des paramètres d'une procédure ou d'une fonction utilisée comme paramètre (par exemple, un paramètre de type procédural) sont ignorés. Avec la fonction d'interface d'unité, une clause USES définit un groupe d'identificateurs répertoriés dans l'interface ou répertoriés dans la clause USES elle-même. Ces identificateurs sont des «constituants» d'une «UNIT» étant définie dans une «INTERFACE» et effectivement provoquée par une «IMPLEMENTATION». Par exemple, USES (IVAR, COLOR, COLORPROC) définit les trois identificateurs de la liste, pouvant être des constantes, des variables, des types, des types de super tableaux, des procédures ou des fonctions. Si COLOR est le type énuméré (RED, BLUE, GREEN), ces identificateurs de constante de type énuméré ne sont pas automatiquement définis; ils doivent également être répertoriés dans l'interface. Cependant, les identificateurs de champ d'une variable ou d'un type d'enregistrement constitutif sont disponibles dans un identificateur de champ (".") ou une instruction WITH habituel.

Constantes numériques

La notation décimale habituelle est utilisée pour les nombres, étant des constantes de type REAL ou INTEGER ou WORD. Le type d'un nombre est REAL s'il comprend un point décimal ou un exposant, et INTEGER ou WORD si ce n'est pas le cas. Les constantes INTEGER peuvent aller de -MAXINT à MAXINT (MAXINT est une constante prédéclarée égale à 32767). Les constantes WORD peuvent être comprises entre 0 et MAXWORD (MAXWORD est une constante prédéclarée égale à 65535). Un nombre de -MAXINT à MAXINT devient de type INTEGER, ou bien un de MAXINT+1 à MAXWORD devient de type WORD, sinon une erreur se produit. Cependant, toute constante de type INTEGER (y compris les expressions constantes et les valeurs de -32767 à -1) change automatiquement en type WORD si nécessaire; si une valeur INTEGER est négative, 65536 y est ajouté (c'est-à-dire que la valeur sous-jacente 16 bits n'est pas modifiée). Par exemple, une sous-intervalle constante de type WORD peut être déclarée comme WRD(0) .. 127; la borne supérieure reçoit automatiquement le type WORD. L'inverse n'est pas vrai; les constantes de type WORD ne changent pas automatiquement en type INTEGER. Les fonctions ORD et WRD peuvent également être utilisées pour changer le type d'une constante ordinale en INTEGER ou WORD. Exemples :

Valeur Description
0 Type INTEGER, pourrait devenir WORD
32768 Type WORD
0..20000 Intervalle de type INTEGER
0..50000 Intervalle de type WORD
0..80000 Invalide
-1..50000 Invalide, devient 65535 .. 50000

L'intervalle de constantes REAL fournit environ sept chiffres de précision, avec une valeur maximale d'environ 1.70141200E+38. Au moins un chiffre est attendu de chaque côté d'un point décimal, ou un avertissement est donné. Un nombre réel commençant ou se terminant par une virgule décimale peut être trompeur; par exemple, "(.1+2.)" est interprété comme "[1+2]" puisque "(." 'remplace "[" et ".)" pour "]". La notation scientifique en nombres réels (comme dans 1.23E-6 ou 4e7) est prise en charge. Lorsqu'un exposant est donné, le point décimal et le signe de l'exposant sont facultatifs. Un «E» majuscule ou un «e» minuscule en nombres réels est autorisé. Les nombres peuvent être précédés d'un «+» ou d'un «-», sauf dans une expression (donc "ALPHA: = + 1 0" est valide mais "ALPHA + -10" n'est pas valide). Les espaces intégrés (après le signe, dans la partie exposant,...) ne sont pas autorisés. Le compilateur tronque tout nombre de plus de 31 caractères (identique à la longueur de l'identificateur) avec un avertissement. La syntaxe des nombres s'applique aussi bien aux fichiers texte qu'aux programmes; tous les nombres sont convertis par le compilateur à l'aide de la fonction DECODE. Exemples de constantes numériques :

La fonction de nombre non décimal prend en charge les nombres en base hexadécimale, octale ou binaire, ainsi qu'en décimal, comme dans 16#FF02, 10#987,8#776, ou 2#111100. Les zéros non significatifs sont autorisés dans la base, comme dans 008#147. En notation hexadécimale, les majuscules ou minuscules A à F sont autorisées. Une constante non décimale sans la base (telle que #44) est supposée être hexadécimale. Que la notation décimale ou non décimale habituelle soit utilisée, le type d'un nombre est déterminé comme décrit ci-dessus; la notation non décimale n'implique pas le type WORD, par exemple. La notation non décimale ne peut pas être utilisée pour les constantes REAL ou les étiquettes d'instructions numériques. Toute constante numérique (littérale ou identificateur) peut recevoir un signe «+» ou «-». La fonction d'expression constante permet aux constantes ordinales d'être des expressions impliquant des nombres non réels, des identificateurs de constantes et certains opérateurs et fonctions prédéclarées. Avec cette fonctionnalité, une expression constante est autorisée partout où une constante littérale peut apparaître, sauf dans les méta-commandes. Les constantes peuvent apparaître dans la section CONST, les expressions, les clauses de type, les constantes d'ensemble et d'autres constantes structurées, ainsi que dans les constantes CASE des instructions CASE et des valeurs de balise d'enregistrement de variante.

Opérateurs et fonctions constants

Les opérateurs constantes avec l'opérande REAL ou INTEGER :

unaire +
unaire -

Opérateurs et fonctions constants avec les opérandes INTEGER ou WORD :

Opérateur Opérateur Opérateur Fonctions
+ DIV OR HIBYTE()
- MOD NOT LOBYTE()
* AND XOR BYWORD()

Opérateurs et fonctions constants avec des opérandes de type ordinal :

Opérateur Opérateur Fonction Fonction
< >= ORD() LOWER()
<= = CHR() UPPER()
> <> WRD()

Opérateurs constants avec des opérandes booléens :

AND
OR
NOT

Fonctions constantes avec un opérande de tableau :

LOWER()
UPPER()

Fonctions constantes avec tout type d'opérande :

SIZEOF()
RETYPE()

Par exemple :

(100 + ORD('X')) * 8#100 + ORD('Y')
(MAXSIZE > 80) OR (INTYPE = PAPERTAPE)

Chaîne de caractères

Les séquences de caractères entre guillemets simples sont appelées chaînes de caractères dans la plupart des manuels Pascal. Ils sont appelés des littéraux de chaîne de caractères, par opposition aux constantes de chaîne de caractères (pouvant être une expression) ou au type STRING. Une constante de chaîne de caractères peut contenir de 1 à 255 caractères. Une constante chaîne de caractères de plus d'un caractère est du type «PACKED ARRAY[I..n] OF CHAR», également connu sous le nom de type STRING(n). Une constante de chaîne de caractères contenant un seul caractère est de type CHAR. Cependant, le type passe de CHAR à «PACKED ARRAY [1 .. 1] OF CHAR» (par exemple, STRING(1)) si nécessaire pour l'assignation, le passage de paramètres,... Un guillemet simple littéral est représenté par deux guillemets adjacents. La chaîne de caractères nulle '' n'est pas autorisée (mais voir NULL ci-dessous). Un littéral de chaîne de caractères doit tenir sur une ligne. Les littéraux de chaîne de caractères utilisant '' au lieu de '' sont reconnus, mais un message d'avertissement est donné.

La fonction d'expression constante autorise les constantes de chaîne de caractères constituées de concaténations d'autres constantes de chaîne de caractères, y compris les identificateurs de constante de chaîne de caractères et la fonction CHR(). Ceux-ci peuvent s'étendre sur plusieurs lignes, mais sont toujours limités au maximum de 255 caractères. Le * est l'opérateur de concaténation. Les expressions constantes de chaîne de caractères sont autorisées partout où une chaîne de caractères littérale est autorisée, sauf dans les méta-commandes. Remarque : L'opérateur de concaténation ne fonctionne qu'avec des constantes, pas avec des variables chaîne de caractères. Exemple d'expression de chaîne de caractères :

HEADER = 'Maintenant c''est le temps'
POLITC = HEADER * CHR(13) * 'Pour tous les gens'

LSTRING

La fonctionnalité LSTRING ajoute le type de super tableau LSTRING ou length-string. Il est similaire à «PACKED ARRAY [0..n] OF CHAR». L'élément 0 contient la longueur de la chaîne de caractères, pouvant varier de 0 à un maximum de n (n <= 255). Notez qu'une constante de type STRING(n) ou CHAR change automatiquement en type LSTRING si nécessaire pour l'affectation,... Le NULL est une constante prédéclarée pour la chaîne de caractères nulle, avec l'élément 0 (le seul élément) égal à CHAR(0). Le NULL ne peut pas être concaténé, car ce n'est pas une STRING. C'est la seule constante de type LSTRING; l'utilisateur ne peut pas déclarer une constante de type LSTRING, même en tant que constante structurée.

Définition constante

Une définition de constante introduit un identificateur comme synonyme d'une constante. Ces définitions se trouvent dans la section CONST d'un programme, d'une procédure, d'une fonction, d'un module, d'une interface ou d'une implémentation. La forme générale est :

constant-identifier = constant

L'identificateur de constante n'est défini qu'après le traitement de la définition, donc une définition de constante telle que N = (N + 1) n'est pas valide. La constante peut être une expression constante, telle que définie ci-dessus. La métacommande $INCONST définit également un identificateur de constante.

Constantes structurées

La fonction de constante structurée permet des tableaux et des enregistrements constants d'un type particulier, et des ensembles de constantes d'un type particulier ou d'un type implicite sans nom (les constantes d'ensemble de types sans nom sont les mêmes que les valeurs définies ISO Pascal avec tous les éléments constants). Les constantes structurées peuvent être utilisées partout où une valeur structurée est autorisée, ainsi que dans les sections CONST et VALUE. Un tableau ou une constante d'enregistrement se compose d'un identificateur de type suivi d'une liste de valeurs constantes entre parenthèses séparées par des virgules. Une constante d'ensemble se compose d'un identificateur de type d'ensemble facultatif suivi d'éléments de constante d'ensemble entre crochets séparés par des virgules; un élément constant défini est soit une constante ordinale, soit deux constantes ordinales séparées par deux points pour indiquer une intervalle de valeurs constantes. Voici quelques exemples simples :

  1. TYPE TVECT = ARRAY [-2 .. 2] OF INTEGER;
  2. CONST VECT = TVECT (5, 4, 3, 2, 1);
  3. TYPE TRECR RECORD
  4.  A, B: BYTE;
  5.  C, D: CHAR;
  6. END;
  7. CONST RECR = TRECR (#20, 0, 'A', CHR(20));
  8. TYPE TSETC = SET OF (RED, BLUE, WHITE, GREY, GOLD);
  9. CONST SETC = TSETC [RED, WHITE .. GOLD];

Une constante dans un tableau ou une constante structurée d'enregistrement doit avoir un type attribuable au type de composante correspondant. La valeur d'un élément constant correspondant à un champ de balise sélectionne une variante, même si le champ de balise est vide. Le nombre d'éléments constants doit être égal au nombre de composants de la structure, sauf pour les constantes structurées de type super tableau. Les constantes structurées imbriquées sont autorisées. Un tableau ou une constante d'enregistrement imbriquée dans une autre constante structurée doit toujours avoir l'identificateur de type précédent. Pour cette raison et d'autres, une constante de super tableau ne peut avoir qu'une seule dimension. La taille de la représentation d'une constante structurée doit être comprise entre 1 et 255 octets. Exemple de constante structurée :

  1. TYPE R3 = ARRAY [1..3] OF REAL;
  2.  
  3. TYPE SAMPLE = RECORD
  4.  I: INTEGER;
  5.  A: R3;
  6.  CASE BOOLEAN OF
  7.   TRUE: (S: SET OF 'A' .. 'Z'; P: ^SAMPLE);
  8.   FALSE: (X: INTEGER);
  9.  END;
  10. CONST S1 = SAMPLE (27, R3 (1.4, 1.4, 1.4); TRUE, ['A','E','I'] ,NIL);

Les éléments constants peuvent être répétés avec la phrase "DO n OF constant", de sorte que l'exemple ci-dessus aurait pu inclure "DO 3 OF 1.4" au lieu de "1.4, 1.4, 1.4". Les expressions de constantes définies (comme ['_'] + LETTERS) ne sont pas prises en charge, pas plus que les expressions de constante de fichier. La constante STRING(3) 'ABC' est équivalente à la constante structurée STRING ('A', 'B', 'C'). Les constantes structurées LSTRING ne sont pas autorisées (elles ne sont pas non plus très utiles). Les constantes structurées (et d'autres valeurs structurées, comme les variables et les valeurs renvoyées par les fonctions) peuvent être passées par référence à l'aide des paramètres CONST. Il existe deux types de constantes d'ensemble, l'une avec un type explicite (c'est-à-dire ayant un identificateur de type avant le «[») comme dans CONST SETC = TSETC [RED, WHITE .. GOLD]; et un avec un type inconnu (c'est-à-dire n'ayant pas d'identificateur de type avant le «[») comme dans CONST RANGE = [20 .. 40]. Soit peut être utilisé dans une expression, soit pour définir la valeur d'un identificateur de constante. Le kind avec un type explicite peut également être passé en tant que paramètre de référence (CONST). Passer des ensembles par référence est généralement plus efficace que de les passer en tant que paramètres de valeur.

Remarques sur les constantes

Les identificateurs définis dans un type énuméré sont des constantes de ce type et ne peuvent pas être utilisés directement avec des expressions de constante numérique (ou chaîne de caractères). Ils peuvent cependant être utilisés avec les fonctions ORD, WRD ou CHR, comme dans 12 + ORD(BLUE). Le TRUE et FALSE sont des constantes prédéfinies de type BOOLEAN; ils peuvent être redéfinis. Comme mentionné, MAXINT, MAXWORD et NULL sont également prédéfinis. Le NIL est une constante de tout type de pointeur; puisqu'il s'agit d'un mot réservé dans ISO Pascal, il ne peut pas être redéfini par le programmeur. Les étiquettes d'instructions numériques n'ont rien à voir avec les constantes numériques; on ne peut pas utiliser un identificateur ou une expression constante comme étiquette. Toutes les constantes (y compris les expressions de chaîne de caractères et les constantes structurées) sont limitées à une représentation interne de 1 à 255 octets.



Dernière mise à jour : Dimanche, le 19 avril 2020