Sommaire Définition du langage d’expérimentation Compilateur pour le langage Z minimal Extensions du langage Z minimal
Chapitre précédent Chapitre 7 : Sémantique des déclarations Chapitre suivant
7.2 Table des quadruplets (QUADRUPLES)
7.1 Introduction
L’analyseur sémantique est l’ensemble de fonctions sémantiques déduites à partir de la définition du langage. Le rôle des fonctions sémantiques est de générer une forme intermédiaire en tenant compte des concepts prédéfinis(organisation de la mémoire, attribution des adresses, tables de compilation, … ).
Une forme intermédiaire est une forme très proche du langage machine. Ça peut être des quadruplets, des triplés ou tout autre forme. Pour notre cas, nous avons opté pour les quadruplets qui seront décrits juste après.
Les fonctions sémantiques sont insérées quelque part dans les règles syntaxiques.
7.2 Table des quadruplets (QUADRUPLES)
Le programme source est transformé et découpé en opérations élémentaires très proches du langage machine. Une opération élémentaire est représenté par un quadruplet .
Un quadruplet est formé de 4 champs (A, B, C, D)
A : Code Opération
B, C, D : Paramètres de l’opération
Les paramètres de l’opération sont des indices vers les tables de compilation.
On dispose ainsi d’une table de quadruplets QUADRUPLES.
Un module est nécessaire pour gérer cette table.
New_quadruple (P1,P2,P3,P4)
Il ajoute un nouveau quadruplet à la table des quadruplets QUADRUPLES et rend l’indice du quadruplet créé, -1 si échec.
Comme pour les autres tables, nous devons aussi définir une limite (LimitQuad) pour la table des quadruplets. On prendra une valeur arbitraire.
Les figures ci-après explicitent la phase sémantique. La figure 7 montre le résultat de la phase sémantique qui est tout simplement une forme intermédiaire composée de l’ensemble des tables de compilation adressées par la table des quadruplets.
Figure 7: Forme intermédiaire
La figure 8 montre que l’analyse sémantique est en fin de compte l’analyseur syntaxique étoffé par les fonctions sémantiques.
Figure 8: Analyse sémantique
7.3 Quadruplets
Comme l’allocation des variables est dynamique, pour chaque déclaration de variable nous devons générer le quadruplet (A, B, C, D) tel que :
A est de la forme ‘D’+’Type’ (Type est le type de la variable)
B : pointeur dans TABOB vers l’objet
C et D non utilisés
Pour le langage Z minimal, un seul type de quadruplet : (‘DE’, B, , ).
Dans tout le document, pointeur désigne un indice ou un emplacement.
7.4 Le problème
Réaliser la sémantique des déclarations revient à résoudre le problème suivant: Où insérer les fonctions sémantiques dans l’analyseur syntaxique pour faire les vérifications qu’il faut et générer pour chaque déclaration de variable le quadruplet correspondant à une déclaration ?
Dans ce qui suit, nous rappelons, dans un premier temps, la partie de la grammaire concernée par les déclarations (en surbrillance) et la définition sémantique des déclarations exprimée en langage naturel. Dans un deuxième temps, nous montrons le placement des fonctions sémantiques (en surbrillance) dans les règles de grammaire ainsi que leurs descriptions.
7.5 Syntaxe des déclarations
<Algo Z> → [ ~Soit|Soient~ <Ps> ] Debut <Lis> Fin [;]
<Ps> → <S>;{ [~Soit|Soient~] <S>;}*
<S> → <Li> Sep <Typ>
<Li> → Idf {, Idf}*
<Typ> → Entier
Définition sémantique
La partie déclaration consiste à définir l’ensemble des variables utilisées dans le programme source. Pour le langage Z minimal, seules les variables entières sont autorisées. Un identificateur ne doit pas désigner deux variables différentes. Le type peut ne pas être donné. Par défaut c’est Entier.
Conventions
Dans tout le document nous adoptons les conventions suivantes pour exprimer les fonctions sémantiques:
Italique : Variables utilisées par le compilateur
Gras Italique : Inconnues à déterminer (dans les structures de contrôle)
Gras : Désigne des champs d’enregistrement dans les tables de compilation
‘---’ : Nom du quadruplet
= : Désigne l’affectation de variable
7.6 Fonctions sémantiques
Les fonctions sémantiques (en surbrillance) sont insérées comme suit:
<Algo Z> → [ ~Soit | Soient~ <Ps> ] Debut <Lis> Fin [;]
<Ps> → <S>;{ [~Soit|Soient~] <S>;}*
<S> → <Li> Sep <Typ> F3
<Li> → Idf F1 {, Idf F1 }*
<Typ> → Entier F2
Leurs descriptions sont les suivantes:
F1
- Vérifier que l’identificateur Idf n’est pas déclaré (ne figure pas dans la table des symboles TABSYM), sinon Erreur.
- Sauvegarder l’identificateur Idf dans une liste L.
F2
Récupérer le type dans Type. Ici, Type vaut ‘E’.
F3
Pour chaque Idf dans L :
- Le mettre dans la table des symboles TABSYM.
- Lui attribuer une adresse relative et le mettre dans la table des objets TABOB (soit Pt son emplacement).
- Générer le quadruplet (‘D’+Type, Pt, , )
7.7 Exemple
La figure 9 montre les tables créées par la phase sémantique pour un programme source donné. En fin de compilation, programme source est transforme en tables: QUADRUPLES + TABOB + TABCONS + LONGZDD.
Figure 9: Tables de compilation (Déclaration de variables)