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
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.