Ministre de l’enseignement supérieur et de la recherche scientifique
Université Abderrahmane Mira Bejaia
Faculté des sciences exactes
Département d’informatique
Cours de Compilation
M1 RS – S2
Nadia TASSOULT
[email protected]
1
Plan du cours
I. Introduction à la compilation
• Les différents étapes de la compilation
• Compilation, interprétation, traduction
II. Analyse lexicale
• Principe et rôle d'un analyseur lexical
• Terminologies
• Rappel sur les Expressions Régulières, Langages, Grammaires et Automates
• Méthodes d’analyse lexicale : à la main et par automates
III. Analyse syntaxique
• Récursivité à gauche et factorisation d’une grammaire.
• Méthodes d’analyse descendante et ascendante.
2
Classification des analyseurs syntaxiques
Rappelons la Classification des analyseurs syntaxiques.
Méthodes
d’Analyse Syntaxique
Déterministes Non Déterministes
Ascendantes Descendante Prédictive avec
Descendantes
LR(1), SLR(1), Parallèle Retour Arrière
LL(1), LL(k)
LALR(1), LR(k)
3
Analyse descendante non déterministe
1. Descendante parallèle
C’est une technique dont le processus fonctionne en parallèle de tel
sort à examiner plusieurs arbres de dérivation en parallèle. Pour
l’appliquer, il faut que la grammaire soit non récursive à gauche.
➔Technique non efficace.
➔Couteux en temps et en espace mémoire
4
Processus : Descendante parallèle
1. Initialement, la pile contient un # suivi de l’axiome;
2. Si le sommet de la pile est un non-terminal alors
Remplacer le non-terminal par toutes les alternatives (autant de piles que
d’alternatives) ;
3. Si le sommet de la pile est un terminal alors
Si terme courant du programme = le sommet de la pile alors
Avancer dans la chaine et dépiler le sommet de la pile;
Sinon
Abandonner dans le cas contraire ;
4. Si le sommet de la pile = # et la chaine à analyser = # alors
La chaine est correcte et abandonner les autres cibles; Sinon Echec; 5
La descendante parallèle
Exemple :
Soit la grammaire 𝐺 suivante :
𝐺= { <𝑝𝑟𝑜𝑔> → 𝑏𝑒𝑔𝑖𝑛 <LD> ; <L𝐼> 𝑒𝑛𝑑
<L𝐷>→ 𝑑 ; <L𝐷> / 𝑑
<L𝐼> → 𝑖 ; <L𝐼> / 𝑖 }
Analyser la chaine suivante : Begin d ; d ; i end #
6
Pile Chaine Action
<𝑝𝑟𝑜𝑔> # begin d ; d ; i end # Remplacer <prog> par MDP
𝑏𝑒𝑔𝑖𝑛<𝐿𝐷>;<𝐿𝐼>𝑒𝑛𝑑# begin d ; d ; i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 𝑑𝑎𝑛𝑠 𝑙𝑎 𝑐ℎ𝑎𝑖𝑛𝑒
<𝑝𝑟𝑜𝑔> → 𝑏𝑒𝑔𝑖𝑛 <LD> ; <L𝐼> 𝑒𝑛𝑑
<𝐿𝐷>;<𝐿𝐼>𝑒𝑛𝑑# d ; d ; i end # Remplacer <LD> par les MDP
𝑑;<𝐿𝐷>;<𝐿𝐼>𝑒𝑛𝑑# d ; d ; i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 <L𝐷>→ 𝑑 ; <L𝐷> / 𝑑
𝑑 ;<𝐿𝐼>𝑒𝑛𝑑# d ; d ; i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟
;<𝐿𝐷>;<𝐿𝐼>𝑒𝑛𝑑# ; d ; i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 𝑑𝑎𝑛𝑠 𝑙𝑎 𝑐ℎ𝑎𝑖𝑛𝑒 <L𝐼> → 𝑖 ; <L𝐼> / 𝑖
;<𝐿𝐼>𝑒𝑛𝑑# ; d ; i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 𝑑𝑎𝑛𝑠 𝑙𝑎 𝑐ℎ𝑎𝑖𝑛𝑒
<𝐿𝐷>;<𝐿𝐼>𝑒𝑛𝑑# d ; i end # Remplacer <LD> par les MDP
<𝐿𝐼>𝑒𝑛𝑑# d ; i end # Remplacer <LI> par les MDP
𝑑;<𝐿𝐷> ;<𝐿𝐼>𝑒𝑛𝑑# d ; i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 𝑑𝑎𝑛𝑠 𝑙𝑎 𝑐ℎ𝑎𝑖𝑛𝑒
𝑑;<𝐿𝐼>𝑒𝑛𝑑# d ; i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 𝑑𝑎𝑛𝑠 𝑙𝑎 𝑐ℎ𝑎𝑖𝑛𝑒
𝑖;<𝐿𝐼> ;<𝐿𝐼>𝑒𝑛𝑑# (abandonner cette alternative) d; i end # 𝐸𝑐ℎ𝑒𝑐
𝑖 ;<𝐿𝐼>𝑒𝑛𝑑# (abandonner cette alternative) d; i end # 𝐸𝑐ℎ𝑒𝑐
;<𝐿𝐷>;<𝐿𝐼>𝑒𝑛𝑑# ; i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 𝑑𝑎𝑛𝑠 𝑙𝑎 𝑐ℎ𝑎𝑖𝑛𝑒
;<𝐿𝐼>𝑒𝑛𝑑# ; i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 𝑑𝑎𝑛𝑠 𝑙𝑎 𝑐ℎ𝑎𝑖𝑛𝑒
<𝐿𝐷>;<𝐿𝐼>𝑒𝑛𝑑# i end # Remplacer <LD> par les MDP
<𝐿𝐼>𝑒𝑛𝑑# i end # Remplacer <LI> par les MDP
𝑑;<𝐿𝐷> ;<𝐿𝐼>𝑒𝑛𝑑# (abandonner cette alternative) i end # 𝐸𝑐ℎ𝑒𝑐
𝑑 ;<𝐿𝐼>𝑒𝑛𝑑# (abandonner cette alternative) i end # 𝐸𝑐ℎ𝑒𝑐
𝑖 ;<𝐿𝐼>𝑒𝑛𝑑# i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 𝑑𝑎𝑛𝑠 𝑙𝑎 𝑐ℎ𝑎𝑖𝑛𝑒
𝑖 𝑒𝑛𝑑# i end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 𝑑𝑎𝑛𝑠 𝑙𝑎 𝑐ℎ𝑎𝑖𝑛𝑒
;<𝐿𝐼> 𝑒𝑛𝑑# (abandonner cette alternative) end # 𝐸𝑐ℎ𝑒𝑐
𝑒𝑛𝑑# end # 𝐷é𝑝𝑖𝑙𝑒𝑟 𝑒𝑡 𝑎𝑣𝑎𝑛𝑐𝑒𝑟 𝑑𝑎𝑛𝑠 𝑙𝑎 𝑐ℎ𝑎𝑖𝑛𝑒
# # 𝐶ℎ𝑎𝑖𝑛𝑒 𝑎𝑐𝑐𝑒𝑝𝑡é𝑒
7
Analyse descendante non déterministe
2. Prédictive avec retour arrière
C’est une technique dont le processus fonctionne séquentiellement.
➔ Utilisation d’une pile afin de sauvegarder les informations nécessaires
pour permettre le retour arrière.
➔ Utilisation d’une structure associée à chaque règle de la grammaire :
(Numéro de la règle, numéro de l’alternative, nombre d’alternatives,
Position dans la chaine)
➔ Réduire l’espace mémoire.
8
Processus: Prédictive avec retour arrière
1. Initialement la pile contient un # suivi de l’axiome ;
2. Si le sommet de la pile est un non-terminal alors
Empiler la structure définie précédemment,
Remplacer le non-terminal par l’alternative ;
3. Si le sommet de la pile est un terminal alors
Si le sommet de la pile = terme courant alors
Avancer dans la chaine et dépiler le sommet de la pile ;
Sinon Faire un retour arrière et essayer une autre alternative,
4. Répéter, jusqu’à ce que le programme soit correcte syntaxiquement ou échec.
9
Analyse Prédictive avec retour arrière
Exemple :
Soit la grammaire 𝐺 suivante :
𝐺= { <𝑝𝑟𝑜𝑔> → 𝑏𝑒𝑔𝑖𝑛 <LD> ; <L𝐼> 𝑒𝑛𝑑
<L𝐷>→ 𝑑 ; <L𝐷> / 𝑑
<L𝐼> → 𝑖 ; <L𝐼> / 𝑖 }
Analyser la chaine suivante : Begin d ; i end #
10
N° Pile Chaine Action
1 <prog> # 𝑏𝑒𝑔𝑖𝑛 𝑑;𝑖 𝑒𝑛𝑑# Appliquer la règle 1 <𝑝𝑟𝑜𝑔> → 𝑏𝑒𝑔𝑖𝑛 <LD> ; <L𝐼> 𝑒𝑛𝑑
2 begin<LD> ;<LI>end (1, 1, 1, 1)# 𝑏𝑒𝑔𝑖𝑛 𝑑;𝑖 𝑒𝑛𝑑# 𝐴𝑣𝑎𝑛𝑐𝑒𝑟 et dépiler
<L𝐷>→ 𝑑 ; <L𝐷> / 𝑑
3 <LD> ;<LI>end (1, 1, 1, 1)# 𝑑;𝑖 𝑒𝑛𝑑# Rè𝑔𝑙𝑒 2 - Alternative 1
4 d ; <LD>(2,1,2,2) ;<LI>end(1, 1, 1, 1)# 𝑑;𝑖 𝑒𝑛𝑑# 𝐴𝑣𝑎𝑛𝑐𝑒𝑟 et dépiler (X) <L𝐼> → 𝑖 ; <L𝐼> / 𝑖
5 ; <LD>(2,1,2,2) ;<LI>end (1, 1, 1, 1)# ;𝑖 𝑒𝑛𝑑# 𝐴𝑣𝑎𝑛𝑐𝑒𝑟 et dépiler (X)
6 <LD>(2,1,2,2) ;<LI>end(1, 1, 1, 1)# 𝑖 𝑒𝑛𝑑# Rè𝑔𝑙𝑒 2 - Alternative 1
7 d ; <LD>(2,1,2,4) (2,1,2,2) ;<LI>end(1, 1, 1, 1)# 𝑖 𝑒𝑛𝑑# Échec (retour arrière N° 6)
Alternative 1
(X) Règle 2 - Alternative 2
7’ d (2,2,2,4) (2,1,2,2) ;<LI>end (1, 1, 1, 1)# 𝑖 𝑒𝑛𝑑# Échec (retour arrière N° 3)
(X) Règle 2 Alternative 2
4’ d (2,2,2,2) ;<LI>end(1, 1, 1, 1)# 𝑑;𝑖 𝑒𝑛𝑑# 𝐴𝑣𝑎𝑛𝑐𝑒𝑟 et dépiler
5’ ;<LI> end(1, 1, 1, 1)# ;𝑖 𝑒𝑛𝑑# 𝐴𝑣𝑎𝑛𝑐𝑒𝑟 et dépiler Alternative 2
6’ <LI> end(1, 1, 1, 1)# 𝑖 𝑒𝑛𝑑# Rè𝑔𝑙𝑒 3 -Alternative 1
7’ i ;<LI> (3,1,2,4) end(1, 1, 1, 1)# 𝑖 𝑒𝑛𝑑# Avancer et dépiler
8’ ;<LI> (3,1,2,4)end(1, 1, 1, 1)# 𝑒𝑛𝑑# Échec (retour arrière N° 6’)
Règle 3 - Alternative 2
7’’ i (3, 2, 2, 4)end(1, 1, 1, 1)# 𝑖 𝑒𝑛𝑑# Avancer et dépiler
8’’ end(1, 1, 1, 1)# 𝑒𝑛𝑑# Avancer et dépiler
9’’ # # Chaine acceptée
11
L’analyse Prédictive avec retour arrière
Echec
Echec
<𝑝𝑟𝑜𝑔> → 𝑏𝑒𝑔𝑖𝑛 <LD> ; <L𝐼> 𝑒𝑛𝑑
Echec <L𝐷>→ 𝑑 ; <L𝐷> / 𝑑
<L𝐼> → 𝑖 ; <L𝐼> / 𝑖
Chaine d’entrée : 𝑏𝑒𝑔𝑖𝑛 𝑑;𝑖 𝑒𝑛𝑑#
12
Analyse Déterministe
Nous allons voir dans ce qui suit les méthodes
d’analyse déterministe descendante ( Analyse
Prédictive sans Retour Arrière )
▪ La descendante récursive.
▪ L’analyse prédictive itérative.
13
Analyse prédictive sans retour en arrière
C’est une méthode d’analyse descendante dans
laquelle nous pouvons toujours choisir une production
unique en se basant sur le prochain symbole de
l’entrée et sans effectuer aucun retour en arrière.
14
Analyse prédictive sans retour en arrière
Il y a deux façons pour effectuer une analyse prédictive :
1. Récursive : utilisations des procédures récursives.
2. Itérative : dirigée par une table d’analyse.
L’analyse prédictive nécessite le calcul de certaines fonctions:
Premier et Suivant.
15
Analyse par la descendante récursive
• Dans cette méthode, nous associons à chaque non-
terminal de la grammaire une procédure.
• L’analyse se fait par appel aux différentes procédures.
• L’analyse est déterministe, soit la chaine à analyser est
correcte ou erronée (pas de retour arrière).
➔l’analyse est efficace et puissante.
16
Analyse par la descendante récursive
Exemple :
Soit la grammaire suivante :
𝐺= { 𝑆 → 𝑎𝐴𝑏/𝜀
𝐴 → c𝐴/𝑎𝑏 }
Réaliser un analyseur syntaxique avec la méthode décente récursive.
• Pour réaliser l’analyse syntaxique, on ajoute une nouvelle règle:
𝑍 → 𝑆# , tel que 𝑍 est le nouvel axiome et # est le symbole spécial
représentant la fin de la chaine à analyser.
17
Analyse par la descendante récursive
𝑷𝒓𝒐𝒄𝒆𝒅𝒖𝒓𝒆 𝑍( )
𝑷𝒓𝒐𝒄𝒆𝒅𝒖𝒓𝒆 𝑆( )
𝑫𝒆𝒃𝒖𝒕 𝑫𝒆𝒃𝒖𝒕
𝑆( ) 𝒔𝒊 (𝑡𝑐= ′𝑎′) a𝑙𝑜𝑟𝑠
𝑡𝑐 ←𝑡𝑠;
𝒔𝒊 (𝑡𝑐= ′#′) a𝑙𝑜𝑟𝑠 𝐴(); 𝑍 → 𝑆#
𝑐ℎ𝑎𝑖𝑛𝑒 𝑎𝑐𝑐𝑒𝑝𝑡é𝑒 𝒔𝒊 (𝑡𝑐= ′b′) a𝑙𝑜𝑟𝑠 𝑆 → 𝑎𝐴𝑏/𝜀
𝒔𝒊𝒏𝒐𝒏 𝑡𝑐 ←𝑡𝑠
𝐴 → c𝐴/𝑎𝑏
𝒔𝒊𝒏𝒐𝒏
𝐸𝑟𝑟𝑒𝑢𝑟 𝐸𝑟𝑟𝑒𝑢𝑟
𝒇𝒊𝒏𝑺𝒊; 𝒇𝒊𝒏𝑺𝒊;
𝒇𝒊𝒏𝑺𝒊;
𝒇𝒊𝒏. 𝒇𝒊𝒏.
18
Analyse par la descendante récursive
𝑷𝒓𝒐𝒄𝒆𝒅𝒖𝒓𝒆 𝐴( )
d𝒆𝒃𝒖𝒕
s𝒊 (𝑡𝑐= ′𝑐′) a𝑙𝑜𝑟𝑠
𝑡𝑐 ←𝑡𝑠 ; 𝐴( );
sinon 𝒔𝒊 (𝑡𝑐= ′𝑎′) a𝑙𝑜𝑟𝑠
𝑍 → 𝑆#
𝑡𝑐 ←𝑡𝑠 𝑆 → 𝑎𝐴𝑏/𝜀
𝒔𝒊 (𝑡𝑐= ′𝑏′) 𝐴𝑙𝑜𝑟𝑠 𝐴 → c𝐴/𝑎𝑏
𝑡𝑐 ←𝑡𝑠
𝒔𝒊𝒏𝒐𝒏 𝐸𝑟𝑟𝑒𝑢𝑟 𝒇𝒊𝒏𝑺𝒊;
𝒔𝒊𝒏𝒐𝒏 E𝑟𝑟𝑒𝑢𝑟 𝒇𝒊𝒏𝑺𝒊;
𝒇𝒊𝒏𝑺𝒊;
𝒇𝒊𝒏.
19
Analyse par la descendante récursive
Exemple : Analyser la chaine acab#
Table d’analyse
Pile Chaine Action
#𝑍( ) acab# 𝐴𝑝𝑝𝑒𝑙𝑒𝑟 𝑆( )
#𝑍( )𝑆() acab# 𝐴𝑣𝑎𝑛𝑐𝑒𝑟
#𝑍( )𝑆() cab# 𝐴𝑝𝑝𝑒𝑙𝑒𝑟 𝐴( )
#𝑍( )𝑆()𝐴( ) cab# 𝐴𝑣𝑎𝑛𝑐𝑒𝑟
#𝑍( )𝑆()𝐴() ab# 𝐴𝑝𝑝𝑒𝑙𝑒𝑟 𝐴( )
#𝑍( )𝑆()𝐴()𝐴() ab# 𝐴𝑣𝑎𝑛𝑐𝑒𝑟
#𝑍( )𝑆()𝐴()𝐴() b# 𝐴𝑣𝑎𝑛𝑐𝑒𝑟 et sortir de A()
#𝑍( )𝑆()𝐴() # Sortir de A()
#𝑍( )𝑆() # sortir de S() ( s→ 𝜀 )
#𝑍( ) # Chaine acceptée
20
Analyse Déterministe
Analyse descendante déterministe
Sans retour en arrière
Prédictive itérative
21