La représentation des programmes Modula-2
La page Une notation pour décrire la syntaxe de Modula-2 a introduit un formalisme par lequel seront définies ultérieurement les structures des programmes bien formés. Il définit cependant simplement la manière dont les programmes sont composés en tant que séquences de symboles, contrairement aux symboles (et donc aux programmes) en termes de caractères étant considérés comme trop appropriés pour une définition de langage. La création d'un niveau intermédiaire de représentation par des séquences de symboles fournit un découplage utile entre les ensembles de langages. En conséquence, on doit postuler un ensemble de règles régissant la représentation des symboles en tant que séquences de caractères. Les symboles du vocabulaire Modula-2 sont divisés par les classes suivantes :
- Identificateurs (identifiers)
- Nombres (numbers)
- Chaînes de caractères (strings)
- Opérateurs et délimiteurs (operators and delimiters)
- et commentaires (comments).
Les règles régissant leur représentation en termes d'ensemble de caractères standard ISO sont les suivantes :
1. Les identificateurs (identifiers) sont des séquences de lettres (letter) et de chiffres (digit). Le premier caractère doit être une lettre, les majuscules et les minuscules sont considérées comme distinctes.
identifier = letter {letter|digit} |
Voici des exemples d'identificateurs bien formés :
Annie comme sauter BlueBird SM74 |
Voici des exemples de mots n'étant pas des identificateurs :
Identificateur invalide | Raison |
---|---|
sound proof | Les espaces vides ne sont pas autorisés |
sound-proof | Ni l'un ni l'autre n'est un trait d'union |
2N | Le premier caractère doit être une lettre |
Miller's | Aucune apostrophe autorisée |
Il arrive qu'un identificateur doive être qualifié par un autre identificateur ; on exprime cela en préfixant i par j et un point (j,i) : l'identificateur combiné est appelé identificateur qualifié (abréviation de qualident). Sa syntaxe est :
qualident = {identifier "."} identifier. |
2. Les nombres (Numbers) sont soit des entiers, soit des nombres réels. Les premiers sont représentés par des séquences de chiffres. Les nombres ne doivent pas contenir d'espaces. Les nombres réels contiennent un point décimal et une partie fractionnaire. De plus, un facteur d'échelle peut être ajouté. Il est spécifié par la lettre E et un entier étant éventuellement précédé d'un signe. Le E se prononce comme "fois 10 à la puissance de".
Exemples de nombres bien formés :
1974 1 3.25 5.1E3 4.0E-10 |
Voici des exemples de séquences de caractères n'étant pas reconnues comme des nombres :
Nombre invalide | Raison |
---|---|
1,5 | Aucune virgule ne peut apparaître |
1'000'000 | Les apostrophes ne peuvent pas non plus être spécifié. |
3.5En | Aucune lettre n'est autorisée (sauf le E). |
Les règles exactes de formation des nombres sont données par la syntaxe suivante :
number = integer | real. integer = digit (digit). real = digit {digit} "." {digit} {ScaleFactor}. ScaleFactor = "E" ["+"|"-"] digit {digit}. |
3. Les chaînes de caractères (string) sont des séquences de caractères quelconques entre guillemets. Pour que la guillemet de fermeture soit reconnue sans ambiguïté, la chaîne de caractères elle-même ne peut évidemment pas contenir de guillemets. Pour autoriser les chaînes de caractères entre guillemets, une chaîne de caractères peut être entourée d'apostrophes au lieu de guillemets. Dans ce cas, cependant, la chaîne de caractères ne doit pas contenir d'apostrophes.
string = '"' {character} '"' | '"' {character} '"'. |
Voici des exemples de chaînes de caractères :
"pas de commentaire" "Le coin du canard" 'Il a dit "ne vous inquiétez pas" et a tiré un coup de feu' |
4. Les opérateurs et les délimiteurs (Operators and delimiters) sont soit des caractères, soit des mots réservés. Ces lettres sont écrites en majuscules et ne doivent pas être utilisées comme identifiants. Il est donc avantageux de mémoriser cette courte liste de mots. Les opérateurs et délimiteurs composés de caractères spéciaux sont :
Opérateur | Description |
---|---|
+ | addition, union d'ensemble |
- | soustraction, différence d'ensemble |
* | multiplication, intersection d'ensembles |
/ | division, différence d'ensemble symétrique |
:= | affectation |
& | ET logique |
- | NON logique |
= | égale |
# < > | inégale |
< | moins que |
> | plus grand que |
<= | inférieur ou égal |
>= | supérieur ou égal |
( ) | parenthèses |
[ ] | parenthèses d'index |
( ) | mettre des accolades |
(* *) | crochets de commentaires |
↑ | opérateur de déréférencement |
, . ; : .. | | symboles de ponctuation |
Les mots réservés sont énumérés dans la liste suivante ; leur signification sera expliquée tout au long des pages suivantes :
- AND
- ARRAY
- BEGIN
- BY
- CASE
- CONST
- DEFINITION
- DIV
- DO
- ELSE
- ELSIF
- END
- EXIT
- EXPORT
- FOR
- FROM
- IF
- IMPLEMENTATION
- IMPORT
- IN
- LOOP
- MOD
- MODULE
- NOT
- OF
- OR
- POINTER
- PROCEDURE
- QUALIFIED
- RECORD
- REPEAT
- RETURN
- SET
- THEN
- TO
- TYPE
- UNTIL
- VAR
- WHILE
- WITH
Il est d'usage de séparer les symboles consécutifs par un espace, c'est-à-dire un ou plusieurs espaces. Cependant, cela n'est obligatoire que dans les cas où l'absence d'un tel espace fusionnerait les deux symboles en un seul. Par exemple, dans "IF x = y THEN", les espaces sont nécessaires devant x et après y, mais peuvent être omis autour du signe égal.
5. Des commentaires (comments) peuvent être insérés entre deux symboles quelconques. Il s'agit de séquences arbitraires de caractères placées entre crochets de commentaires (* et *). Les commentaires sont ignorés par les compilateurs et servent d'informations supplémentaires au lecteur humain. Ils peuvent également servir à signaler des instructions (options) au compilateur.