Vous êtes sur la page 1sur 12

REPUBLIQUE DU CAMEROUN REPUBLIC OF CAMEROON

PAIX-TRAVAIL-PATRIE PEACE-WORK-FATHERLAND
**************** ****************
UNIVERSITE DE NGAOUNDERE NGAOUNDERE UNIVERSITY
**************** ****************
FACULTE DES SCIENCES FACULTY OF SCIENCE
**************** ***************
DEPARTEMENT MATHEMATIQUES DEPARTMENT OF MATHEMATICS
& INFORMATIQUE AND COMPUTER SCIENCE
**************** ****************

Travail Personnel de l’Etudiant (TPE) en COMPILATION (INF412)

THEME :

Analyse sémantique

Membres du groupe numéro 15

N0 Noms et prénoms Matricules


1 TAYONG MBANWI TEGWI 18A089FS
2 DINGUEMLEMOTO FRANCIS 19A65FS
3 MOUKILAN MAHAMAT 21B048FS
4

EXAMINATEUR :

Dr. GUIDANA FREDERIC


PLAN
INTRODUCTION
I. Définition de Analyse Sémantique
II. Limites de l’analyse syntaxique
III. Fonctionnement de l’analyse Sémantique
IV. Rôle de l’analyse sémantique
V. Définition (ou analyse) dirigée par la syntaxe
VI. Table des symboles
VII. Représentation par arbre
- Arbre syntaxique abstrait ;
- Arbre syntaxique décoré.

CONCLUSION
INTRODUCTION
A la sortie de l’analyse syntaxique, nous nous retrouvons avec un arbre syntaxique
ou arbre de dérivation abstraite qui contient toutes les informations pertinentes sur les
structures syntaxiques du programme. Nous avons donc vérifié que le programme est
syntaxiquement correct mais est-ce qu’il sémantiquement correct ? De même on a compris sa
structure syntaxique mais est-ce qu’on a compris sa signification ? Ce sont là les interrogations
dont nous tenterons d’apporter les réponses dans les lignes qui suivent.
I. Qu’est-ce que l’analyse sémantique ?
Définition
L’analyse sémantique est une technique qui permet d’analyser le sens d’un texte. La
notion de “sens” est centrale, lorsque l’on fait référence à la sémantique. Contrairement à
l’analyse syntaxique, l’enjeu n’est pas d’analyser la structure grammaticale d’une phrase…
Mais bel et bien les intentions, les ressentis et les émotions qui dictent le sens d’un message.

Voici les différences à connaître :

• L’analyse syntaxique s'intéresse à la “forme”, c’est-à-dire à la relation que peut


avoir un mot avec un autre mot au sein d’une phrase.
• L’analyse sémantique s’intéresse au “fond”, c’est-à-dire au sens des mots.

Ces deux techniques sont utilisées pour affiner la compréhension du langage naturel, par
exemple dans un contexte de relation client. Cette discipline est aussi appelée TAL ou
TALN, pour “Traitement Automatique des Langues Naturelles”.

Ainsi, lorsqu’un client sollicite un service client, l’enjeu de l’analyse sémantique est de
détecter tous les éléments subjectifs, présents lors d’un échange : prise de position,
sentiment positif, insatisfaction, impatience… Tous ces éléments nourrissent le processus
d’analyse sémantique, notamment pour affiner la connaissance client et améliorer la qualité
des réponses apportées.

II. LIMITES DE L’ANALYSE SYNTAXIQUE


L’analyse syntaxique s’assure que les phrases ou les instructions sont bien formées. Cependant,
d’autres propriétés fondamentales d’un langage de programmation ne peuvent pas être vérifiées
par l’analyseur syntaxique. Certaines propriétés non vérifiées sont les suivantes :

• Déclaration des variables : dans les langages à typage statique, nous ne pouvons pas
utiliser une variable sans qu’elle ne soit déclarée au préalable.
Exemple :

𝑖𝑛𝑡 𝑎

𝑎 = 𝑏+5

Syntaxiquement parlant, ces deux instructions sont bien formées. Cependant, 𝑏 n’est pas
déclaré avant son utilisation.

• Déclarations multiples dans un bloc : on ne peut pas déclarer une variable plusieurs
fois dans une même portée c’est-à-dire dans un même bloc.
Exemple :

𝑖𝑛𝑡 𝑎
𝑎=5
𝑖𝑛𝑡 𝑎
Syntaxiquement parlant, ces trois instructions sont bien formées. Cependant, 𝑎 est déclarée à
deux reprises dans le même bloc.

• Paramètres obligatoires des fonctions : lors de l’appel d’une fonction, le nombre et


les types de paramètres obligatoires doivent être respectés.
Exemple :

𝑖𝑛𝑡 𝑠𝑜𝑚𝑚𝑒(𝑖𝑛𝑡 𝑎, 𝑖𝑛𝑡 𝑏 {… };

𝑠𝑜𝑚𝑚𝑒(6, 4.78);

𝑠𝑜𝑚𝑚𝑒(15);

Syntaxiquement parlant, ces trois instructions sont bien formées. Cependant, les deux appels
ne respectent pas la définition de la fonction
Opérations sur des types non-autorisés : certaines opérations ne peuvent pas être effectuées
sur certains types.
Exemple :

𝑖𝑛𝑡 𝑎 = 5;

𝑠𝑡𝑟𝑖𝑛𝑔𝑏 = "𝑆𝐴𝐿𝑈𝑇";

𝑠𝑡𝑟𝑖𝑛𝑔 𝑐 = 𝑎 ∗ 𝑏;
Syntaxiquement parlant, ces trois instructions sont bien formées. Cependant, multiplier un
entier par une chaine de caractère n’as pas de sens dans un langage de programmation tel que
C# ou JAVA.

III. Comment fonctionne l’analyse sémantique ?


Prenons deux exemples de phrases :

• Le client, dit Monsieur Dupont, est satisfait.


• Le client dit : Monsieur Dupont est satisfait.

Un simple changement de ponctuation suffit à modifier le sens de cette phrase. C’est là toute
la subtilité de l’analyse sémantique : comprendre le sens logique qui lit les éléments d’une
phrase, et qui impacte donc sa signification.

Pour l’humain, rien de plus simple : reconnaître le sens d’une phrase grâce à sa ponctuation
ou l’intonation utilisée pour la prononcer est un jeu d’enfant. Mais pour les machines, le
challenge est de taille. Et c’est là que les outils d’analyse sémantique sont particulièrement
utiles.

L'analyse sémantique est cruciale car elle permet de détecter les erreurs qui ne peuvent pas
être détectées lors de l'analyse lexicale ou syntaxique. Par exemple, si une variable est utilisée
sans avoir été déclarée, cela ne sera pas détecté lors de l'analyse lexicale ou syntaxique, mais
cela sera détecté lors de l'analyse sémantique.
Un exemple concret d'analyse sémantique est la vérification des types. Pendant l'analyse
sémantique, le compilateur vérifie que les types des expressions sont cohérents. Par exemple,
si une variable de type entier est utilisée dans une expression qui attend un type flottant, cela
est détecté lors de l'analyse sémantique.
Prenons l'exemple suivant de code source :
int main() {
int x = 5;
float y = 3.14;
x = y;
return 0;
}
Lors de l'analyse sémantique, le compilateur détectera l'erreur sur la ligne `x = y;`, car il
essaie d'assigner une valeur de type flottant à une variable de type entier.
En outre, l'analyse sémantique peut également inclure des vérifications supplémentaires,
telles que la vérification de la portée des variables et la détection des boucles et des
conditions mal formées.

Les avantages de l’analyse sémantique

Vous l’avez compris : l’analyse sémantique offre une aide précieuse au service client, mais
aussi à l’ensemble des équipes d’une entreprise. Cet outil impacte également l’expérience
client à plusieurs niveaux. Voici un récapitulatif des principaux avantages de cette
technologie :

1. Améliorer la connaissance client

Grâce à l’analyse du sens des requêtes, l’analyse sémantique permet d’optimiser la


connaissance client dans sa globalité. Au-delà des motifs de satisfaction et d’insatisfaction, ce
sont aussi la tonalité et les émotions qui sont passées en revue. Cette compréhension des
sentiments vient compléter les analyses plus traditionnelles, effectuées sur les retours
d’expériences clients (enquêtes de satisfaction, e-mails, posts sur les réseaux sociaux, avis en
ligne, etc.).

2. Accélérer la démarche Customer Centric

L’analyse sémantique place réellement le client au centre des attentions. Une telle
technologie contribue au déploiement d’une démarche Customer Centric, où chaque décision
est centrée client. Cette culture d’entreprise permet d’identifier plus facilement les clients
satisfaits, pour les transformer en Ambassadeurs et accélérer la fidélisation.

3. Offrir des réponses pertinentes pour améliorer l’expérience client

Grâce au machine learning et au traitement du langage naturel (NLP), l’analyse


sémantique permet un travail de lecture, de tri et d’interprétation pertinents. L’intelligence
artificielle contribue à l’amélioration des réponses apportées aux clients. Ces réponses sont
alors plus précises et plus rapides pour les clients. Des outils tels que ChatGPT montrent la
puissance de l'intelligence artificielle appliquée au conversationnel.

IV. ROLE D’UN ANALYSEUR SEMANTIQUE


Le rôle d’un analyseur sémantique est de vérifier les propriétés comme celles qui viennent
d’être présentées ci-dessus.
Les contraintes à vérifier dépendent de la nature du langage considéré. Le plus souvent,
l’analyse sémantique se fait en même temps que l’analyse syntaxique en utilisant les actions
sémantiques intégrées dans les règles de production. C’est ce que l’on appelle définition dirigée
par la syntaxe en abrégeant DDS
Cependant, il n’existe pas de méthode universelle pour effectuer l’analyse sémantique.
Cela dépend, entre autres, des contraintes à résoudre et du contexte (la particularité du langage
de programmation).
Il existe différents types d'analyse sémantique en compilation, chacun visant à vérifier un
aspect différent de la cohérence sémantique du code source.
Voici les principaux types d'analyse sémantique en compilation :
1. Vérification de types : cette analyse consiste à vérifier que les types des expressions sont
cohérents. Par exemple, si une variable de type entier est utilisée dans une expression qui
attend un type flottant, cela sera détecté lors de l'analyse sémantique.
Exemple :
int a = 5;
float b = 3.14;
a = b; // erreur de typage

2. Vérification de portée : cette analyse consiste à vérifier que les variables sont utilisées dans
leur portée appropriée. Par exemple, si une variable locale est utilisée en dehors de la
fonction où elle est déclarée, cela sera détecté lors de l'analyse sémantique.
Exemple :
int main() {
int x = 5;
{
int y = 10;
}
x = y; // erreur de portée
return 0;
}
3. Analyse des tableaux : cette analyse consiste à vérifier les opérations sur les tableaux. Par
exemple, si une opération sur un tableau tente d'accéder à une position en dehors de la plage
définie du tableau, cela sera détecté lors de l'analyse sémantique.
Exemple :
int main() {
int a[5];
a[6] = 10; // erreur d'indice de tableau
return 0;
}
4. Analyse des pointeurs : cette analyse consiste à vérifier les opérations sur les pointeurs. Par
exemple, si une opération sur un pointeur tente d'accéder à une zone mémoire non allouée,
cela sera détecté lors de l'analyse sémantique.

Exemple :

int main() {
int *p = NULL;
*p = 10; // erreur de pointeur
return 0;
}
5. Vérification des fonctions et des procédures : cette analyse consiste à vérifier les appels de
fonctions et de procédures, y compris les paramètres et les valeurs de retour. Par exemple, si
une fonction est appelée avec le nombre incorrect de paramètres ou si le type de retour de la
fonction ne correspond pas à la valeur renvoyée par la fonction, cela sera détecté lors de
l'analyse sémantique.
Exemple :
int somme(int a, int b) {
return a + b;
}
int main() {
float x = 3.14;
somme(x, 5); // erreur de typage des paramètres
return 0;
}
En résumé, chacun de ces types d'analyse sémantique en compilation vise à détecter des
erreurs spécifiques dans le code source pour garantir qu'il est cohérent sémantiquement et
peut être compilé avec succès.

V. DEFINITION DIRIGEE PAR LA SYNTAXE (DDS)


C’est un formalisme qui permet d’associer des actions (règles sémantiques) aux règles d’une
grammaire où :
- Chaque symbole terminal ou non terminal de la grammaire possède des attributs
(valeurs, type, …) ;
- Chaque règle de production possède un ensemble de règles sémantiques qui permettent
de calculer les valeurs des attributs associés aux symboles de la règle de production.
Une règle sémantique peut être définie comme une suite d’instructions écrites dans un langage
déterminé (C#, JAVA, C,…). Elle peut contenir des affectations, des instructions d’affichages ;
des instructions conditionnelles (if…else).
Exemple de règle sémantique
Supposons que chaque non-terminal possède un attribut “ valeur’’ qui retourne la valeur
calculée ou héritée de l’expression associée et chaque terminal possède un attribut “valeur
lexicale’’ qui retourne la valeur du symbole telle que lue dans le fichier du code source du
programme à analyser (valeur lexème).

Règle de production Règle sémantique (action)


𝒁 → 𝑬$ 𝒁. 𝒗𝒂𝒍𝒆𝒖𝒓 ← 𝑬. 𝑣𝑎𝑙𝑒𝑢𝑟
𝑬→ 𝑬+𝑻 𝑬. 𝑣𝑎𝑙𝑒𝑢𝑟 ← 𝑬. 𝑣𝑎𝑙𝑒𝑢𝑟 + 𝑻. 𝑣𝑎𝑙𝑒𝑢𝑟
𝑬→𝑻 𝑬. 𝑣𝑎𝑙𝑒𝑢𝑟 ← 𝑻. 𝑣𝑎𝑙𝑒𝑢𝑟
𝑻→𝑻∗𝑭 𝑻. 𝑣𝑎𝑙𝑒𝑢𝑟 ← 𝑻. 𝑣𝑎𝑙𝑒𝑢𝑟 ∗ 𝑭. 𝑣𝑎𝑙𝑒𝑢𝑟
𝑻→𝑭 𝑻. 𝑣𝑎𝑙𝑒𝑢𝑟 ← 𝑭. 𝑣𝑎𝑙𝑒𝑢𝑟
𝑭 → (𝑬) 𝐹. 𝑣𝑎𝑙𝑒𝑢𝑟 ← 𝐸. 𝑣𝑎𝑙𝑒𝑢𝑟
𝑭 → 𝒏𝒃 𝑭. 𝑣𝑎𝑙𝑒𝑢𝑟 ← 𝒏𝒃. 𝑣𝑎𝑙𝑒𝑢𝑟_𝑙𝑒𝑥𝑖𝑐𝑎𝑙𝑒

VI. TABLE DES SYMBOLES


La table des symboles est une structure de données où sont stockés les symboles et leurs
attributs.

Exemple : 𝑖𝑛𝑡 𝑋 = 10 𝑓𝑙𝑜𝑎𝑡 𝑌 = 6.28

Nom de Type Taille Adresse Valeur Portée


l’objet
X Int 4Octets (0)H 10 Local
Y Float 4 Octets (4)H 6.28 Local
VII. REPRESENTATION PAR ARBRE
L’analyse syntaxique génère un arbre de dérivation syntaxique pour représenter les phrases
bien formées. Cet arbre est appelé arbre syntaxique concret.
Exemple :

𝐸→𝐸− 𝐸

𝐸 →𝐸∗𝐸

𝐸 → 𝑛𝑜𝑚𝑏𝑟𝑒
E

-
E
E

E * E
Nombre

Nombre Nombre

Figure 1:arbre syntaxique concret


L’arbre syntaxique concret comporte des non terminaux appartenant aux règles de la
grammaire du langage qui ne sont pas utiles pour l’analyse sémantique. En les éliminant, nous
obtenons des nouvelles représentations d’un programme.

- Arbre syntaxique abstrait


L’arbre syntaxique abstrait est construit à partir de l’arbre syntaxique de dérivation. Il ne
contient aucun non-terminal. Il est construit à partir des actions sémantiques des règles de
production de l’analyse syntaxique.
-
E

E
E
-
+ Nombre

E + E
Nombre Nombre Nombre

Nombre
Nombre

Figure 2: transformation de l'arbre syntaxique concret en arbre syntaxique abstrait

- Arbre syntaxique décoré


Un arbre syntaxique décoré est un arbre syntaxique de dérivation où les valeurs des attributs
des non-terminaux sont calculées.
Exemple :
Expression : 8*9-14
𝐸 →𝐸−𝐸

𝐸 →𝐸∗𝐸

𝐸 → 𝑛𝑜𝑚𝑏𝑟𝑒 58
E

72
E
2
-
E 14

E * E 9
8
Nombre
14

Nombre Nombre
8 9

Figure3: arbre syntaxique décoré


CONCLUSION
En résumé, l'analyse sémantique est une étape cruciale dans le processus de compilation
car elle permet de détecter les erreurs qui ne peuvent pas être détectées lors de l'analyse lexicale
ou syntaxique. Un exemple concret d'analyse sémantique est la vérification des types, qui
permet de s'assurer que les expressions utilisent des types cohérents.
L’analyse sémantique est la phase intervenant après l'analyse syntaxique et avant la
génération de code. Elle effectue les vérifications nécessaires à la sémantique du langage de
programmation considéré, ajoute des informations à l'arbre syntaxique abstrait et construit la
table des symboles. Les vérifications réalisées par cette analyse sont :
- La résolution des noms. Le compilateur construit la table des symboles en associant les
étiquettes (ou labels) trouvées avec les identificateurs des variables, fonctions, types, et
signale une erreur dans les cas où ce n'est pas possible ;
- La vérification des types. Le compilateur vérifie la compatibilité des types dans les
instructions et expressions ;
- L'affectation définitive, nécessitant que les variables locales soient initialisées avant
d'être utilisées.

Vous aimerez peut-être aussi