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

 

Chapitre précédent               Chapitre 8 : Sémantique des expressions arithmétiques               Chapitre suivant


 

8.1 Introduction

8.2 Quadruplets

8.3 Syntaxe des expressions

8.4 Fonctions sémantiques

8.5 Exemple

8.6 Implémentations


 

8.1 Introduction   

Nous considérons plutôt les expressions arithmétiques et relationnelles. 

- Arithmétiques du genre (A+B)/C,

- Relationnelles du genre (A+B) > C

L’objectif est de découper l’expression en opérations élémentaires. L’expression devient ainsi un programme.

Il s’agit de générer les quadruplets. Il s’agit plus précisément d’insérer les fonctions sémantiques quelque part dans les règles syntaxiques.

 

8.2 Quadruplets  

Nous générons les quadruplets en fonction des opérateurs utilisés.

- Pour les opérateurs binaires arithmétiques, le quadruplet (Oper, B, C , D ) est considéré dans lequel Oper = Op || Type , Op dans {+, -, *, /} et Type = ‘E’ pour Entier. Le symbole || désigne la concaténation.

Les autres paramètres sont définis comme suit:

B, C : pointeurs dans TABOB vers les opérandes.

D : pointeur dans TABOB sur l’objet qui va contenir le résultat.

 

- Pour les opérateurs unaires arithmétiques, le quadruplet (Oper, B, C , D ) est considéré dans lequel Oper = Op || Type , Op dans {+, -} et Type = ‘U’ .

Les paramètres B, C et D sont définis comme suit:

B : pointeur dans TABOB vers l’opérande.

C : non utilisé.

D : pointeur dans TABOB sur l’objet qui va contenir le résultat.

 

- Pour les opérateurs binaires relationnels, on utilisera le quadruplet (Oper, B, C , D ) avec Oper = Op , Op dans {<, <=, >, >=, =, <>, #}.

B, C et D sont définis comme suit:

B, C : pointeurs dans TABOB vers les opérandes.

D : pointeur dans TABOB sur l’objet qui va contenir le résultat qui est un booléen.

Nous introduisons ainsi dans la table des objets un nouveau type : le type booléen avec le code ‘B’.

 

8.3 Syntaxe des expressions  

La grammaire des expressions concernée par le langage Z minimal est la suivante:

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

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

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

<Facteur>  →     Idf  | Cste |  ( <Exp>)  

 

Définition sémantique

Une expression est une suite d’opérandes et d’opérateurs. Les opérandes sont des variables et/ou des constantes.

La priorité des opérateurs est définie par la grammaire.

Il n’ y a pas de conversion, toute incompatibilité de type entraîne une erreur.

Le compilateur crée des variables temporaires pour ranger les résultats intermédiaires.

Le compilateur ne fait pas les optimisations, comme par exemple la réduction du nombre de variables temporaires utilisées.

 

8.4 Fonctions sémantiques  

Les fonctions sémantiques (en surbrillance) sont insérées comme suit:

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

<Exps>         →     [Sign] F5 <Terme> F6 { Opa  F7 <Terme> F8 }*

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

<Facteur>     →     Idf  F1 | FCste F2 | ( <Exp>)

 

Leurs descriptions sont les suivantes:

F1

Vérifier que l’identificateur Idf est déclaré, sinon Erreur. Soit Pt1 son emplacement dans TABOB. Retourner (Pt1).

 

F2

Si la constante n’existe pas la mettre dans TABCONS et TABOB. Soit Pt1 son emplacement dans TABOB. Retourner (Pt1).

 

F3

Sauvegarder l’opérateur dans une variable Op et le résultat de <Facteur> dans une variable Temp1(emplacement dans TABOB) créée par le compilateur.

 

F4

Récupérer le résultat de <Facteur> dans Temp2 (emplacement dans TABOB).

Vérifier la compatibilité des types de Temp1 et Temp2.

Générer une variable temporaire Ptx (emplacement dans TABOB) qui recevra le résultat.

Générer le quadruplet (Op, Temp1, Temp2, Ptx). Retourner (Ptx).

 

F5

Sauvegarder l’opérateur unaire dans une variable Op.

 

F6

Sauvegarder le résultat de <Terme> dans Temp1 (emplacement dans TABOB).

Vérifier la compatibilité de Op et Temp1.

Générer une variable temporaire dans TABOB qui recevra le résultat. Soit Ptx son emplacement.

Générer le quadruplet (Op, Temp1, , Ptx). Retourner (Ptx).

 

F7

Sauvegarder l’opérateur dans une variable Op.

 

F8

Récupérer le résultat de <Terme> dans Temp2 (emplacement dans TABOB).

Vérifier la compatibilité des types de Ptx et Temp2.

Générer une variable temporaire dans TABOB. Soit Ptx2 son emplacement dans TABOB.

Générer le quadruplet (Op, Ptx, Temp2, Ptx2). Retourner (Ptx2).

 

F9

Sauvegarder l’opérateur dans une variable Op et le résultat de <Exps> dans Temp1 (emplacement dans TABOB).

 

F10

Récupérer le résultat de <Exps> dans Temp2 (emplacement dans TABOB).

Vérifier la compatibilité des types de Temp1 et Temp2.

Générer une variable temporaire dans TABOB. Soit Ptx son emplacement.

Générer le quadruplet (Op, Temp1, Temp2, Ptx). Retourner (Ptx).

 

8.5 Exemple

La figure 10 montre les quadruplets créés pour l’expression figurant dans le programme source.

 

 

Figure 10: Tables de compilation (Expressions arithmétiques)

 

8.6 Implémentations   

Afin d’implémenter les fonctions sémantiques relatives aux expressions arithmétiques, nous devons rajouter les modules suivants sur la table des objets:

- Génération de variables temporaires

New_temp (Type)

 Ce module rend l’indice dans la table des objets où l’objet est rangé , -1 si échec. L’objet créé est une variable temporaire. 

- Vérification de la compatibilité

Error_exp(Opérateur, Opérande1, Opérande2)

Ce module détecte les erreurs sémantiques dans les expressions. Il retrouve les types de Operande1 et Opérande2 pour vérifier la compatibilité entre les types et la compatibilité entre Opérateur et le type.

 

Nous devons aussi rajouter le module suivant sur la table des constantes:

Mise_en_tabcons (Constante)

Il rajoute la constante Constante dans TABCONS et rend l’indice dans la table où la constante est créée, -1 si échec.