Conventions lexicales
Un programme source UCSD Pascal est essentiellement un flux de caractères contenu dans un fichier texte. Pour que le programme soit compilé avec succès, il doit être conforme à la fois aux normes lexicales du langage et aux règles syntaxiques (grammaticales). Cette page décrit les normes lexicales. Elles couvrent l'ensemble de caractères légal, la formation des identificateurs, l'ensemble des symboles et des mots réservés, la formation des commentaires et quelques autres sujets.
Le terme «jeton» est un terme utilisé par les compilateurs et les rédacteurs pour désigner un symbole ou un nom unique dans le programme source : un symbole de caractère spécial, un mot réservé, une constante ou un identificateur. Comme il s'agit d'un mot utile à usage général, il apparaît ici et là dans cette page.
Pour une description des fichiers texte tels qu'ils sont maintenus dans le UCSD p-System, veuillez vous référer au UCSD p-System.
L'UCSD Pascal étant un dialecte particulier du langage de programmation, nous avons tenté d'indiquer en quoi il diffère du Pascal standard. Lorsque nous disons «Pascal standard», nous faisons référence aux caractéristiques du Pascal étant communes à la fois à la définition de Jenson & Wirth et au projet de norme actuel de l'American Neational Standard Institute (ANSI). Lorsque ces deux sources diffèrent l'une de l'autre, nous avons tenté de les énoncer explicitement. De plus, l'Organisation internationale de normalisation (ISO) dispose d'un projet de norme très similaire au projet de norme ANSI.
Lorsque nous décrivons une sous-intervalle, nous raccourcissons l'ellipse conventionnelle (...) en '..', comme dans le langage de programmation Pascal lui-même. En d'autres termes, 1..6 indiquerait dans la notation mathématique courante. La raison pour laquelle ce manuel utilise cette notation est que Pascal le fait.
Nous avons essayé de limiter au maximum l'utilisation des guillemets. L'usage général de ces guillemets dans ce manuel est illustré par l'usage du paragraphe précédent.
Dans les descriptions informelles de syntaxe (et non dans les programmes Pascal eux-mêmes), les mots entre crochets angulaires (< >) sont des noms d'objets; ils représentent généralement des caractères non imprimables tels que <return> et <esc>.
Sur certaines machines (comme l'ordinateur personnel IBM), la touche Return s'appelle Enter.
EBNF (Extended Backus-Naur Form)
Telle que nous l'utilisons dans ce manuel, une expression EBNF est une description d'une partie de la syntaxe Pascal. Voici un exemple :
assignment-statement = variable-name ":=" expression |
L'expression se compose du nom d'un objet syntaxique, suivi d'un signe égal, suivi d'une description de l'objet.
Dans la description, tout ce qui est entre guillemets doit apparaître littéralement dans le programme Pascal. Un nom n'étant pas entre guillemets est le nom d'un objet syntaxique décrit ailleurs. Des crochets ([]) entourent les parties de syntaxe facultatives, et des accolades ({}) entourent les parties de syntaxe pouvant apparaître zéro ou plusieurs fois. Une barre verticale (|) sépare les différentes options, par exemple :
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" |
Voici un exemple un peu plus compliqué :
repeat-statement = "repeat" [ statement {";" statement}] "until" Boolean-expression |
Cette expression EBNF nous indique qu'une instruction repeat se compose du mot réservé repeat, suivi d'une liste d'instructions facultatives, suivie du mot réservé until, suivi d'une expression booléenne. La liste d'instructions elle-même se compose d'une seule instruction suivie de zéro ou plusieurs occurrences d'un point-virgule précédant une autre instruction.
Notez que l'expression ne définit pas les termes «instruction» ou «expression booléenne» : ils sont définis ailleurs.
Dans ce manuel, nous utilisons EBNF pour clarifier les parties les plus confuses de la syntaxe Pascal, en particulier celles impliquant des structures récursives. Comme nous n'avons pas tenté de construire une description axiomatique complète de Pascal, nous ne fournissons pas de descriptions EBNF des objets apparaissant dans nos descriptions EBNF mais étant explicites.
L'ensemble de caractère
Les fichiers source UCSD Pascal peuvent contenir les lettres A..Z, a..z, les chiffres 0..9 et les caractères spéciaux suivants :
( ) [ ] { } + - * / < = > : ; . , ' ^ |
Le trait de soulignement (_) peut apparaître dans les identificateurs.
Les caractères suivants peuvent apparaître (avec tous les autres caractères imprimables) dans les commentaires ou les chaînes de caractères, mais n'ont pas de signification particulière :
! @ # $ % & ? | ` ~ \ " |
Les retours chariot (RETURN) et les retours suivants peuvent également être présents. Ils servent à délimiter les identificateurs et à formater le fichier de manière lisible.
Pratiquement toutes les implémentations actuelles de UCSD Pascal utilisent l'ASCII (American Standard Code for Information Interchange) pour représenter ces caractères.
Les symboles
Un programme source peut contenir des symboles faisant partie du langage de programmation Pascal (symboles spéciaux et «mots réservés»), des identificateurs ayant été déclarés dans le System («identificateurs prédéclarés»), des identificateurs que l'utilisateur a définis et du texte littéral (contenu dans des commentaires ou des chaînes de caractères).
Les symboles faisant déjà partie du langage de programmation Pascal peuvent être divisés en symboles spéciaux d'un ou deux caractères et en mots réservés.
Les symboles spéciaux
Il existe des symboles à un seul caractère :
. , ; : ' ( ) [ ] { } + - * / = < > ^ |
Il y a les symboles à deux caractères :
:= .. <= <> >= (* *) |
Le symbole *** peut apparaître dans la partie code d'un UNIT. Cela ne fait pas partie du Pascal standard.
Les mots réservés (les mots clefs)
Les mots réservés, comme les symboles spéciaux, sont utilisés en Pascal pour représenter des constructions syntaxiques telles que des types particuliers de déclarations, des formes particulières d'instructions et des regroupements d'instructions.
Voici les mots réservés en UCSD Pascal (un astérisque indique les mots réservés ne faisant pas partie du Pascal standard) :
- and
- array
- begin
- case
- const
- div
- do
- downto
- else
- end
- *external
- file
- for
- forward
- function
- goto
- if
- *implementation
- in
- *interface
- label
- mod
- not
- of
- or
- packed
- procedure
- *process
- program
- record
- repeat
- *segment
- *separate
- set
- then
- to
- type
- *unit
- until
- *uses
- var
- while
- with
Notez l'absence de nil. Dans UCSD Pascal, il est prédéclaré plutôt que réservé.
Identificateurs
Les identificateurs sont utilisés pour représenter des constantes, des types, des variables et des routines (procédures, fonctions et processus). Certains identificateurs sont prédéclarés, c'est-à-dire qu'ils représentent des constantes, des types ou des routines (mais jamais des variables) que le système a déjà définis.
Définition
Un identificateur se compose d'une lettre suivie d'un nombre indéfini de lettres ou de chiffres. Les identificateurs à une seule lettre sont légaux et peuvent être en majuscules ou en minuscules, ou en un mélange des deux.
Les identificateurs peuvent également contenir le caractère de soulignement (_), mais il n'est pas significatif (le but de l'autoriser est de rendre un identificateur plus lisible).
Un identificateur peut ne pas être identique à un mot réservé. Un identificateur peut être identique à un autre identificateur prédéclaré (ce qui entraîne des problèmes).
Voici les identificateurs légaux :
- i
- Parity
- try13
- c2unit78
- c2_unit_78
Ce ne sont pas des identificateurs légaux :
- 4tran { Débute avec un nombre }
- c2.unit.78 { Contient des caractères spéciaux }
- try 13 { Contient un espace }
- _Parity { Début avec un soulignement }
Unicité
Les majuscules et les minuscules ne sont pas distinctes.
Ces identificateurs sont équivalents :
- moss
- MOSS
- Moss
- MosS
Seuls les huit premiers caractères d'un identificateur déterminent son unicité.
Ces deux identificateurs sont équivalents :
- lostinspace
- lostinspecitionitem
Les traits de soulignement intégrés et de fin (_) sont ignorés.
Ces identificateurs sont équivalents :
- find_disk
- finddisk
- Find_Disk
- f_ind_d_isk
- finddisk_
La définition des identificateurs de Jenson & Wirth n'inclut pas le caractère de soulignement, mais spécifie une unicité de 8 caractères. Le trait de soulignement et la clause de 8 caractères sont en conflit avec le projet de norme ANSI, stipulant que tous les caractères d'un identificateur doivent être significatifs.
Identificateurs prédéclarés
Voici les identificateurs prédéclarés dans UCSD Pascal (un astérisque indique les identificateurs n'étant pas dans le Pascal standard) :
- abs
- arctan
- *atan
- *attach
- *blockread
- *blockwrite
- boolean
- char
- chr
- *close
- *concat
- *copy
- cos
- *delete
- dispose
- eof
- eoln
- *exit
- exp
- false
- *fillchar
- get
- *gotoxy
- *halt
- *idsearch
- input
- *insert
- integer
- *interactive
- *ioresult
- *keyboard
- *length
- ln
- *log
- *mark
- maxint
- *memavail
- *memlock
- *memswap
- *moveleft
- *moveright
- new
- nil
- odd
- ord
- output
- page
- *pmachine
- *pos
- pred
- *processid
- put
- *pwroften
- read
- readln
- real
- *release
- reset
- rewrite
- round
- *scan
- *seek
- *semaphore
- *seminit
- *signal
- sin
- *sizeof
- sqr
- sqrt
- *start
- *str
- *string
- succ
- text
- *time
- *treesearch
- true
- trunc
- *unitbusy
- *unitclear
- *unitread
- *unitstatus
- *unitwait
- *unitwrite
- *varavail
- *vardispose
- *varnew
- *wait
- write
- writeln
Notez l'absence de l'identificateur prédéclaré standard PACK et UNPACK.
Les routines idsearch, pmachine et treesearch sont destinées à l'usage de System. pmachine est décrit dans le p-System de l'UCSD.
Commentaires
Un commentaire est un passage de texte ignoré par le compilateur Pascal. Son but est de permettre au programmeur d'expliquer les actions du programme dans un langage autre que Pascal.
Les commentaires peuvent apparaître pratiquement n'importe où dans un programme source. Comme les espaces ou les retours chariot, ils délimitent les jetons et doivent donc apparaître entre eux : un commentaire ne peut pas apparaître au milieu d'un identificateur, d'une constante, d'un mot réservé ou d'un symbole à deux caractères.
Un commentaire est tout texte entouré des délimiteurs { et }, ou (* et *).
Voici des commentaires :
- { Un commentaire avec des délimiteurs fantaisistes ! }
- (* Un autre type de commentaire, avec moins d'exubérance. *)
Les commentaires avec le même type de délimiteur ne peuvent pas être imbriqués.
Ceci n'est pas un commentaire légal :
- (* deux types de délimiteurs ici }
- { le même problème, en sens inverse *)
Les commentaires avec le même type de délimiteur ne peuvent pas être imbriqués.
Ceci n'est pas un commentaire légal :
- { Il s'agit d'une tentative infructueuse { de création de commentaires imbriqués } }
.. le compilateur lirait cela comme un commentaire se terminant par « imbriqués} ».
Un commentaire peut contenir un commentaire utilisant l'autre type de délimiteurs.
Il existe des commentaires légaux :
- (* Ceci est un commentaire {qui en contient un autre} *)
- {et donc (* est-ce *)}
Cette construction n'est pas autorisée en Pascal standard.
Les commentaires peuvent être plus longs qu'une ligne de source. Si le compilateur trouve un commentaire contenant un point-virgule (;), il émettra un avertissement dans le fichier de liste du programme. En effet, il est courant de commencer un commentaire, puis d'oublier de le fermer avec un délimiteur correspondant. Le résultat est un commentaire pouvant « avaler » de nombreuses lignes de code Pascal (éventuellement le reste d'un programme). Étant donné que les instructions Pascal se terminent généralement par un point-virgule, le fait de signaler les points-virgules dans les commentaires est un bon moyen pour le compilateur d'avertir le programmeur de cette erreur potentielle.
Les commentaires contenant un signe dollar ($) immédiatement après le premier crochet sont traités comme des instructions au compilateur. Ceux-ci doivent être conformes à un format spécial. Un commentaire ne doit pas commencer par un signe dollar, sauf si le programmeur souhaite invoquer une option spécifique du compilateur.
Il existe des commentaires d'options du compilateur :
- (*$I-*) {$L list.5.text}
Ce ne sont pas des commentaires d'options du compilateur :
- { $I-} { Espace avant le $ }
- {$M+} { Il n'y a pas d'option M en se moment }
Limites des jetons
Les symboles de caractères spéciaux sont des jetons en eux-mêmes, mais les mots réservés, les constantes et les identificateurs doivent être clairement délimités. À l'exception des jetons de caractères spéciaux, un jeton doit être séparé du suivant par un caractère spécial, un espace, un commentaire ou un Return.
Aucun mot réservé, constante ou identificateur ne peut contenir de caractère spécial, d'espace, de commentaire ou de Return. Cela signifie, en particulier, que les jetons ne peuvent pas dépasser la fin d'une ligne de code source. (Un commentaire n'est pas un jeton et peut dépasser un return.)
Indentation et lisibilité
Hormis celles mentionnées dans la section précédente, il n'existe aucune restriction quant à la manière dont un programme peut être présenté dans le fichier source. Cependant, il existe certaines traditions concernant le formatage visuel d'un programme structuré, en particulier un programme Pascal.
En général, une ligne de code source contient une seule instruction ou, dans le cas d'instructions composées volumineuses, une seule phrase ou un mot réservé.
La hiérarchie des instructions implicites dans un programme structuré est indiquée dans la source par une indentation. Deux ou trois espaces par niveau sont généralement privilégiés. Les éléments begin end, then else, case end, record end et repeat until sont généralement indentés de manière à s'aligner verticalement.
La dernière ligne d'un programme, ou d'une routine relativement longue, est généralement un seul élément end - celui-ci est souvent complété par un commentaire contenant simplement le nom du programme ou de la routine se terminant.
Ceci ne serait pas considéré comme une routine lisible :
Il s'agit de la même routine et elle semblerait acceptable pour la plupart des programmeurs :
L'important est que le programmeur tienne compte des futurs lecteurs du programme. Même la personne écrivant un programme peut être confuse en le lisant quelques jours (ou heures) plus tard.