4.1 Un peu d’anatomie et de physiologie 4
num´eriques comme “21” et de pouvoir reconnaˆıtre qu’il y a deux occurrences de
la mˆeme variable alpha. C’est le rˆole de l’analyseur lexical connu ´egalement sous
le nom de scanneur. Le scanneur doit reconnaˆıtre les commentaires et les espaces
sans signification, g´en´erer (ou pr´eparer la g´en´eration) les nombres, les symboles
identificateurs, et les mots-cl´es (il peut les distinguer, ou laisser cette tˆache au
module syntaxique), etc., et en g´en´eral, transformer le texte en une suite de lex`emes.
Ces lex`emes passent au module suivant, syntaxique, avec leurs cat´egories lexicales.
L’analyseur souvent n’est pas int´eress´e par les noms concrets des variables ou par les
valeurs num´eriques d´efinies, mais uniquement par la cat´egorie des objets. Il suffit de
savoir qu’un lex`eme repr´esente un nombre flottant, pour pouvoir compiler le code qui
traite ce nombre. (Le module de synth`ese qui engendre les r´ef´erences aux donn´ees
doit, bien ´evidemment, donner au programme compil´e l’acc`es `a la valeur num´erique
d’un objet, mais ceci est une autre histoire).
Les cat´egories classiques sont : identificateurs, constantes enti`eres, r´eelles,
Bool´eennes, etc., op´erateurs binaires comme <> en Pascal ou != en “C”, mots-cl´e,
´eventuellement aussi les s´eparateurs ou les terminateurs comme le point-virgule. Il
faut y ajouter les parenth`eses, crochets, accolades, etc. On appelle ces cat´egories de
lex`emes des jetons (ou tokens).
Il faut parfois prendre des d´ecisions d´elicates. Qu’est-ce que c’est : 17alpha ? En
Pascal c’est une calamit´e, une erreur. En Lisp cela peut ˆetre un lex`eme normal, un
identificateur. Dans la plupart d’autres langages un caract`ere alphab´etique arrˆete le
scanning d’un nombre, donc nous aurons deux lex`emes : 17 et alpha. Mais ensuite :
est-ce l´egal, cette suite de lex`emes ? Cette d´ecision n’appartient plus `a l’analyse
lexicale, bien qu’un analyseur lexical peut diagnostiquer une faute lexicale si le
lex`eme est termin´e par un caract`ere consid´er´e ill´egal (par exemple : un nombre
suivi directement par une lettre). De tr`es rares langages (comme par exemple le
syst`eme Metapost l’acceptent et traitent comme 17 multipli´e par alpha, mais cette
interpr´etation n’appartient non plus au scanneur.
Une autre d´ecision d´elicate est la gestion de format du document d’entr´ee. Fortran
pr´evoyait une instruction par ligne, alors tout retour-chariot ´etait un caract`ere
sp´ecifique – le terminateur. La plupart de langages plus modernes consid`erent la
fin de ligne comme tout autre espace blanc qui s´epare les entit´es lexicales. Ceci
implique l’usage intense de caract`eres de s´eparation syntaxique : les points-virgules.
Cependant – pourquoi la philosophie de Fortran dans ce contexte est pire ? On note
donc actuellement plusieurs r´eponses `a la question concernant la signification du
layout.
– En Matlab les points-virgules sont optionnels. On peut terminer une instruction
par “ ;”, mais si le terminateur est absent, si l’instruction se termine par fin
de ligne, le r´esultat est automatiquement affich´e, la pr´esence du point-virgule
bloque l’affichage. Ce caract`ere joue alors un rˆole s´emantique !
– Le langage de calcul formel Maple pr´evoit deux terminateurs : point-virgule,
et deux points. Le second bloque l’affichage du r´esultat, le premier force
l’affichage. (Le paquetage Matlab poss`ede un module d’interfa¸cage avec Maple.
Le travail simultan´e sur les deux syst`emes est nuisible `a la sant´e psychique. . . )
–Python consid`ere la fin de ligne comme terminateur, mais conditionnel ; si la
ligne suivante est indent´ee, elle est consid´er´ee comme continuation. Haskell suit