Sommaire                    Définition du langage d’expérimentation          Compilateur pour le langage Z minimal          Extensions du langage Z minimal

 

                                 Chapitre 1 : Le langage Z               Chapitre suivant


 

1.1 Description

1.1.1 Généralités

1.1.2 Structure d’un algorithme

1.1.3  Définition d’une action

1.1.4 Définition d’une fonction

1.1.5 Exemple d’un algorithme

1.1.6 Objets

1.1.7 Expressions

1.1.8 Instructions

1.1.9 Machines abstraites

1.1.10 Opérations de haut niveau

1.1.11 Fonctions standards

1.2 Grammaire du langage Z

1.2.1 Conventions

1.2.2 Déclarations

1.2.3 Instructions

1.2.4 Expressions

1.3 Expérimentation


 

Chapitre 1 : Le langage Z   

1.1 Description  

1.1.1 Généralités

Un algorithme exprimé en Z est un ensemble de modules parallèles dont le premier est principal et les autres sont soient des actions composées (ACTION) soient des fonctions de type quelconque (FONCTION).

Les objets globaux sont déclarés dans le module principal.

La communication entre les modules se fait via les paramètres et les variables globales.

Les paramètres peuvent être de n’importe quel type.

Le langage permet l’affectation globale de tout type.

Quatre types standards sont autorisés : ENTIER, BOOLEAN, CAR et CHAINE.

Le langage est l'ensemble des algorithmes abstraits, écrits à base de modèles ou  machines abstraites qui sont en fait des ensembles d’opérations.

On définit ainsi des machines de Turing : Machine-caractères et Machine-nombres permettant l’initiation à l’algorithmique.

On définit des machines abstraites sur les structures, vecteurs et les listes linéaires chaînées permettant l’initiation aux structures élémentaires de données.

On définit également une machine abstraite sur les fichiers permettant l’initiation aux structures simples de fichiers.

Le langage peut être étendu avec d'autres machines abstraites.

Le langage offre deux fonctions très utiles permettant de générer aléatoirement des chaînes de caractères (ALEACHAINE) et des entiers (ALEANOMBRE).

Le langage permet la lecture et l’écriture de scalaires, vecteurs de n’importe quelle dimension et des structures simples ou complexes.

Le format des instructions est libre.

Il n y a pas de distinction entre majuscule et minuscule.

 

1.1.2 Structure d’un algorithme

La structure d’un algorithme exprimé en Z est la suivante:

SOIENT

{ Objets locaux et globaux }

{ Annonce des modules }

DEBUT

{ Instructions }

FIN

Module 1

Module 2

....

Module n

 

 

Chaque module peut être soit une fonction soit une action.

 

1.1.3  Définition d’une action

Toute action ou procédure a la forme suivante :

ACTION Nom (P1, P2, ..., Pn)

SOIT

{ Objets locaux et paramètres }

DEBUT

{ Instructions }

FIN

Les paramètres P1, P2, ..., Pn sont appelés par ‘référence’. Ils ne sont pas protégés par l’action.

 

1.1.4 Définition d’une fonction

Une fonction est définie comme suit:

FONCTION Nom (P1, P2, ...,Pn) : Type

{ Objets locaux et paramètres }

DEBUT

{ Instructions }

FIN

 

Type peut être quelconque.

Une fonction est utilisée dans une expression.

 

1.1.5 Exemple d’un algorithme

L’algorithme qui suit fait la reconnaissance des mots dans une chaîne de caractères.

SOIENT

Mot : CHAINE; C : CAR;

M : MACHINE_CAR;

DEBUT

CREER_MCAR(M, [' Jhh Jsthd Lkql ifd ']);

LIRECAR(M, C);

TANTQUE C <> '.'

TQ (C=' ') ET (C <> '.')

LIRECAR(M, C)

FTQ ;

Mot := '';

TQ (C <> ' ') ET (C <> '.')  

Mot := Mot + C ;

LIRECAR(M, C)

FTQ;

SI Mot <> '' ECRIRE(Mot) FSI

FINTANTQUE

FIN

 

1.1.6 Objets

Le langage Z manipule des objets. Ces derniers peuvent être des entiers (ENTIER), des booléens (BOOLEEN), des caractères (CAR) ou des chaînes de caractères ( CHAINE).

Les objets peuvent aussi être des machines abstraites :  Machine-caractères, Machine-nombres, Vecteurs, Structures, Listes linéaires chaînées, et Fichiers.

La machine-caractères est un ruban composé d’un ensemble de cases défilant devant une tête de lecture. Chaque case renferme un caractère.

La machine-nombres est un ruban composé d’un ensemble de cases défilant devant une tête de lecture. Chaque case renferme un nombre.

Un tableau ou vecteur est un ensemble d’éléments ayant le même type. Il peut avoir plusieurs dimensions. Les éléments sont contigus en mémoire.

Une structure ou un enregistrement est composé de plusieurs champs de natures hétérogènes. Les champs sont contigus en mémoire.

Une liste linéaire chaînée est un ensemble de maillons. Chaque maillon est composé de deux champs: valeur et adresse. Les maillons sont éparpillés en mémoire.

Un fichier est un ensemble d’éléments de même type. Chaque élément peut être soit un bloc soit un article. Un bloc renferme des articles. Un article peut être un objet simple, un vecteur ou une structure. Un fichier peut posséder un entête contenant les caractéristiques du fichier (ENTETE). Il utilise aussi des buffers ou tampons pour les opérations de lecture et d’écriture. Les éléments d’un fichier sont rangés sur une mémoire externe.

Une structure peut être simple, c’est à dire composée uniquement de scalaires.

Une structure peut être complexe, c’est à dire composée de scalaires et|ou de vecteurs à une dimension de scalaires.

Les éléments d’un vecteur peuvent être des objets simples, des vecteurs ou des structures simples.

 

Exemples:

SOIENT 

A, B, C DES BOOLEENS ;

I, J : ENTIER ; Ch UNE CHAINE ;

C UN CAR ;

SOIENT 

L1, L2 DES LISTES ;

V1 UN VECTEUR(10, 60) ;

SOIENT

V1 UN VECTEUR(10, 60) DE (CAR, ENTIER); 

S UNE STRUCTURE (CHAINE, ENTIER); 

F UN FICHIER DE (CHAINE, VECTEUR(5) DE ENTIERS) 

BUFFER V1, V2;

 

 

1.1.7 Expressions

Les expressions dans le langage Z sont exprimées comme dans les langages de programmation.

Exemples :

(B+C) / F

NON Trouv

(X # 5) ET NON Trouv

F(x) <> 5

A OU B

(A <= B) ET(A >5)

 

1.1.8 Instructions

Afin de décrire les instructions du langage Z, nous utilisons les conventions suivantes:

V désigne une variable, E une expression.

[ ] désigne une partie facultative, { } un ensemble.

Nous disposons des instructions suivantes:

Affectation : V := E

Lecture : LIRE(V1, V2, .....)

Écriture : ECRIRE(E1, E2, .....)

Conditionnelle : SI E [ : ]

                           { Instructions }

                       [ SINON

                           { Instructions } ]

                       FSI

Appel: APPEL Idf [ ( E1, E2, ...) ]

Répétitive (Forme 1 ) : TQ E [ : ]

                                       { Instructions }

                                   FTQ

Répétitive (Forme 2 ) : POUR V := E1, E2, E3

                                        { Instructions }

                                   FPOUR

E3 désigne le pas.

 

1.1.9 Machines abstraites

Afin de faciliter et simplifier l’écriture des algorithmes, nous utilisons des machines abstraites sur les objets offrant des opérations élémentaires. Énonçons ci-après les machines abstraites considérées:

Machine-caractères : LIRECAR, NBRCAR

Machine-nombres : LIRENOMBRE, NBRNOMBRE

Listes linéaires chaînées : ALLOUER , LIBERER , VALEUR, SUIVANT, AFF_ADR, AFF_VAL

Vecteurs : ELEMENT, AFF_ELEMENT

Structures : STRUCT, AFF_STRUCT

Fichiers : OUVRIR, FERMER, LIRESEQ, ECRIRESEQ, LIREDIR, ECRIREDIR, RAJOUTER, FINFICH, ENTETE, AFF_ENTETE, ALLOC_BLOC

Toutes ces opérations sont définies juste après.

 

Machine-caractères

C'est l'ensemble des opérations suivantes :

- LIRECAR ( M, C)

Récupère dans la variable caractère C le prochain caractère de la machine M.

- NBRCAR (M)

Fournit le nombre total de caractères dans la machine M.

 

Machine-nombres

C'est l'ensemble des opérations suivantes :

- LIRENOMBRE ( M, Nombre)

Récupère dans la variable entière Nombre le prochain entier de la machine M.

- NBRNOMBRE (M)

Fournit le nombre total de nombres contenus dans la machine M.

 

Structures

C'est l'ensemble des opérations suivantes :

- STRUCT ( S, I)

Accès au I-ème champ de la structure S.

- AFF_STRUCT ( S, I, Exp )

Affecter à la structure S dans son I-ème champ l'expression Exp.

Exemple:

SOIT

    S UNE STRUCTURE ( CHAINE , BOOLEEN ) ;

DEBUT

         AFF_STRUCT ( S , 1 , 'Abc' ) ;

         AFF_STRUCT ( S , 2 , VRAI ) ;

         ECRIRE ( STRUCT ( S , 1 ) , STRUCT ( S , 2 ) )

   FIN

 

Vecteurs (ou tableaux)

C'est l'ensemble des opérations suivantes :

- ELEMENT ( T [I, J, ...] )

Accès à l'élément T[I, J, ...] du vecteur T.

- AFF_ELEMENT ( T [I, J, ...], Val )

Affecter à l'élément T[I, J, ...] la valeur Val.

Exemple :

SOIT

         A UN TABLEAU ( 5 , 3 ) DE ENTIERS ;

   DEBUT

         AFF_ELEMENT ( A [ 1 , 1 ] , 599 ) ;

         ECRIRE ( ELEMENT ( A [ 1 , 1 ] ) )

   FIN

 

Listes linéaires chaînées

C'est l'ensemble des opérations suivantes :

- ALLOUER ( P ) 

Crée un maillon et retourne son adresse dans P.

- LIBERER ( P ) 

Libère le nœud d'adresse P.

- SUIVANT ( P ) 

Accès au champ ‘Adresse’ du nœud référencé par P.

- VALEUR ( P )

Accès au champ 'Valeur' du nœud référencé par P.

- AFF_ADR ( P, Q ) 

Affecter au champ 'Adresse' du nœud référencé par P, l'adresse Q.

- AFF_VAL( P, Val ) 

Affecter au champ 'Valeur' du nœud référencé par P, la valeur Val.

 

Fichiers

C'est l'ensemble des opérations suivantes :

- OUVRIR (Fl, Fp, Mode)

Ouvrir le fichier logique Fl et l'associer au fichier physique Fp en précisant le mode d’ouverture ( fichier nouveau('N') ou ancien( 'A') ).

- FERMER (Fl)

Fermer le fichier Fl.

- LIRESEQ (Fl, V)

Lire dans la variable tampon V le bloc (ou l'article) se trouvant à la position courante.

- ECRIRESEQ (Fl, V) 

Écrire le contenu de la variable tampon V à la position courante du fichier Fl.

- RAJOUTER(Fl, V)

Écrire le contenu de la variable tampon à la fin du fichier Fl.

- LIREDIR (Fl, V, N)

Lire le N-ème bloc (ou article) du fichier Fl dans la variable tampon V.

- ECRIREDIR (Fl, V, N)

Écrire le contenu de la variable tampon V à la N-ème position du fichier

Fl.

- FINFICH (Fl)

Prédicat égal à Vrai si la fin du fichier Fl est rencontrée, Faux sinon.

- ALLOC_BLOC(Fl) 

Fournit un bloc (ou article) du fichier Fl dans lequel on pourra écrire.

- ENTETE (Fl, I)

Récupérer la I-ème caractéristique du fichier Fl.

- AFF_ENTETE (Fl, I, Exp)

Affecter Exp comme la I-ème caractéristique du fichier Fl.

 

1.1.10 Opérations de haut niveau

Les opérations de haut niveau permettent de faire des créations ou des initialisations de machines abstraites. A chaque machine abstraite est associée une opération comme mentionné ci-après:

Machine-caractères : CREER_MCAR

Machine-caractères : CREER_MNOMBRE

Structures : INIT_STRUCT

Vecteurs : INIT_VECTEUR (ou INIT_TABLEAU) 

Listes : CREER_LISTE

Toutes ces opérations sont définies juste après

 

Machine-caractères

CREER_MCAR (M, [' cccccc '])

Initialise la machine-caractères M avec la chaîne de caractères se trouvant entre crochets.

Exemple

CREER_MCAR (M, [‘Réalisation d’’un compilateur pédagogique’])

 

Machine-nombres

CREER_MNOMBRE (M, [ Exp1, Exp2, ....])

Initialise la machine-nombres M avec les valeurs des expressions Exp1, Exp2, ...

Exemple

CREER_MNOMBRE (M, [22, 34, 78, 23, 55, 22, 0, 24])

 

Listes linéaires chaînées

CREER_LISTE( L, [Exp1, Exp2, ....] )

Crée la liste linéaire chaînée L avec les valeurs entre crochets dans l'ordre indiqué.

Exemple

CREER_LISTE ( L, [12, 34, I, I+J, 45] )

Structures

INIT_STRUCT ( S, [Exp1, Exp2, ....] )

Initialise la structure S avec les valeurs des expressions entre crochets dans l'ordre indiqué.

Exemple

INIT_STRUCT ( S, [120, VRAI, ‘Compilateur’] )

 

Vecteurs

INIT_VECTEUR( V, [Exp1, Exp2, ....] ) (ou INIT_TABLEAU)

Initialise le vecteur V avec les valeurs des expressions entre crochets dans l'ordre indiqué.

Exemple

INIT_VECTEUR ( V, [112, 340, 45, 44, 21, 34] )

 

1.1.11 Fonctions standards

On définit

- sur les nombres la fonction  ALEANOMBRE(Exp) qui fournit un nombre aléatoire compris entre 0 et Exp-1.

- sur les chaînes de caractères les fonctions suivantes:

ALEACHAINE(Exp) : fournit une chaîne de caractères aléatoire de longueur Exp.  

LONGCHAINE(Chaine): donne la longueur de la chaîne Chaine.

CARACT(Chaine, Exp) : rend le caractère de rang Exp contenu dans la chaîne Chaine.

Exemples

SOIT

         S UNE CHAINE ;

         I , J DES ENTIERS ;

         C UN CAR ;        

   DEBUT

         S := ALEACHAINE ( 5 ) ;   {donne par exemple 'bxrfd'}

         I := ALEANOMBRE ( 1000 ) ; { donne par exemple 675}

         J := LONGCHAINE ( 'bcdgfd' ) ;  {donne 6}

         C := CARACT ( 'gfrd' , 3 )   {donne 'r'}

   FIN

 

1.2 Grammaire du langage Z 

1.2.1 Conventions

Nous exprimons la grammaire avec la notation EBNF (Extended Backus Normal Form). Dans tout le document, dans la description de la grammaire, nous utilisons les conventions suivantes:

- Symboles:

~ --- | --- ~ désigne un choix

[ ---- ] désigne une partie facultative

[[ Crochet ouvrant

]] Crochet fermant

{ --- }* Répétition (  0 )

{ --- }+  Répétition ( > 0 )

- Unités lexicales:

Types dans {Entier, Booleen, Car, Chaine}

Sep dans {:, Un, Une, Des}

Cste désigne une constante numérique entière

Idf désigne un identificateur

Opr dans { <, <=, >, >=, =, <>,# }

Opa dans { +, -, Ou }

Opm dans { *, /, Et }

Sign dans {+, -}

Cstelog dans {Vrai, Faux}

Chaine   désigne une chaîne de caractères

Tableau  est synonyme de Vecteur

Init_tableau  est synonyme de Init_vecteur

 

1.2.2 Déclarations

<Algo Z>          →          [ ~ Soit|Soient ~ <Ps> ] Debut <Lis> Fin [;]   { ~ <Act> | <Fonct> ~ [;] }*

<Act>               →         Action Idf [ ( <Li> ) ] [;]  [ ~ Soit|Soient ~ <Ps> ] Debut <Lis> Fin

<Fonct>            →          Fonction Idf ( <Li> ) : <Typ> [ ~Soit|Soient ~ <Ps> ] Debut <Lis> Fin

<Ps>                 →         <S>;{ [ ~Soit|Soient ~ ] <S>;}*

<S>                  →         <Li> Sep ~ <Typ>| ~Action|Fonction(<Typ>)~ ~

<Li>                 →         Idf {, Idf}*

<Typ>              →         Types | <Structsimple> | <Structcomplexe> | Machine_car | Machine_nombre | [Pointeur vers [Sep] ] Liste [ De ~Types | <Structsimple>~ ] |

  Tableau (<Lc>) [De~<Structsimple> | Types~ ] |

  Fichier De ~ Types | Vecteur(Cste) [De Types] | <Structsimple> | <Structcomplexe> ~ [Entete (Types {, Types }*)] Buffer <Li>

<Structsimple>          [Structure ](Types {, Types }*)

<Structcomplexe>

         [Structure ]( ~ Types | Vecteur(Cste)[De Types] ~ {, ~ Types | Vecteur(Cste) [ De Types] ~ }*)

<Lc>               →         Cste {, Cste}*

 

 1.2.3 Instructions

< Lis >         →         < Inst > { ; < Inst > }*

<Inst>          →         Idf := <Exp> |

                                Tantque <Exp> [ : ] <Lis> Fintantque

                                Si <Exp> [:] <Lis> [Sinon <Lis>] Fsi |

                                Pour Idf:= <Exp>,<Exp> [, <Exp>][:] <Lis> Finpour |

                                Appel Idf [(Exp {,<Exp>}*)] |

                                Lire ( Idf {, Idf }* ) |

                                Ecrire (<Exp> {,<Exp>}* ) |

                                ~Liberer | Allouer | Fermer~ ( <Exp> ) |

                                Ouvrir ((Idf, Chaine, Chaine) |

                                ~Lirecar|Lirenombre|Lireseq|Ecrireseq|Rajouter~ (Idf, Idf) |

                                ~ Aff_adr|Aff_val~ ( <Exp> , <Exp> ) |

                                ~ Creer_liste |Init_vecteur | Creer_mnombre | Init_struct ~ ( Idf , [[ ~<Exp>|[[<Exp> {, <Exp>}*]] ~ {, ~<Exp>|[[<Exp> {, <Exp>}*]]~}* ]] ) |

                                Creer_mcar(Idf, [[ Chaine ]]) |

                                Aff_element ( <Exp> [[ <Exp> {, <Exp> }* ]] ,<Exp> ) |

                                ~Aff_struct | Aff_entete~(Idf, Cste, <Exp>) |

                                ~ Liredir | Ecriredir ~ (Idf, <Exp>, Idf)

 

1.2.4 Expressions

<Exp>             →     <Exps>[ Opr <Exps>]

<Exps>           →     [Sign] <Terme> { Opa <Terme> }* |

<Terme>         →     <Facteur>{Opm <Facteur>}*

<Facteur>       →     Idf [ ( <Exp> {, <Exp>} * ) ] | Cste | <Fonct> | NIL | ( <Exp>) | Chaine | Non <Facteur> | Cstelogic

<Fonct>         →     ~Valeur | Suivant~ ( <Fonct> ) |

                                Element ( <Fonct> [[ <Exp> {, <Exp> }* ]] ) |

                                ~Struct | Entete~ ( Idf, Cste) |

                                Caract ( Idf, <Exp>) |

                                ~ Aleachaine | Aleanombre | Longchaine~ ( <Exp> ) |

                                ~Nbrcar | NbrNombre|Finfich|Alloc_bloc~ (Idf)

 

1.2.4 Compléments

Une chaîne de caractères est délimitée par le symbole ‘. Si ce dernier figure dans la chaîne, il est doublé.

Les commentaires sont entre les symboles /* et */ ou bien entre les symboles { et }. Ils sont insérés là où un espace peut figurer.

 

1.3 Expérimentation  

Avant d’aller plus loin, il est conseillé de bien comprendre la grammaire en expérimentant le langage Z. Pour cela, vous pouvez utiliser le logiciel Khawarizm qui est libre d’utilisation.