Title: Analyse
1Analyse Syntactique
- (Compilers, Principles, Techniques and Tools,
Aho, Sethi et Ullman, 1986)
2Compilateurs
- Un compilateur est un programme qui lit un
programme écrit dans une langue (la langue
source) et produit un programme écrit dans une
autre langue (la langue cible). - Un compilateur utilise plusieurs étapes. Chaque
étape transforme le programme source en une autre
représentation. - Programme source ?Analyseur lexical ? Analyseur
Syntactique ?Analyseur Sémantique ? Générateur de
Code Intermédiaire ? Optimiseur de Code ?
Générateur de Code ? Programme objectif - Pour cette partie de cours, nous allons nous
concentrer sur lAnalyseur Syntactique
3Analyse Syntactique
- Lanalyse syntactique est le processus qui
détermine si une chaine de jetons peut être
produite par une grammaire. - Il y a deux types principaux de méthodes d
analyse syntactique ascendant (de bas en haut)
et descendent (de haut en bas). - Pour lanalyse syntactique descendante, on
commence à la racine et procède vers les noeuds
terminaux. - Pour analyse syntactique ascendante, on commence
aux noeuds terminaux et procède vers la racine. - Il est facile de construire des analyseurs
descendant efficaces à la main. - LAnalyse syntactique ascendante est plus
flexible et on peut lutiliser avec plus de
classes de grammaires. Mais il est plus
difficile de la développer. Par contre, il y a
des outils disponible pour générer des parseurs
directement, a partir de la grammaire.
4Partie I Analyse Syntactique Descendante
- Idées fondamentales de lAnalyse Syntactique
Descendante - LAnalyse Syntactique Descendante prédictive
- Grammaires recursives a gauche
- Factorisation sur la gauche
- Construire un Analyseur Syntactique
- Grammaires LL(1)
5Idées fondamentales de lAnalyse Syntactique
Descendante
- Pour lAnalyse Syntactique Descendante, on essaye
de trouver un dérivation a gauche pour la chaîne
d'entrée. - Exemple
- S ? cAd Trouvez un dérivation
- A ? ab a pour w ? cad
-
- S S Backtrack
S - / \ ? / \ ?
/ \ - c A d c A d
c A d - / \
- a b
a
6Analyseur Syntactique Prédictif Généralités
- Dans la majorité des cas, si on écrit la
grammaire très soigneusement, on peut éliminer la
recursion de gauche et faire une factorisation
a gauche de la grammaire qui en résulte. Ceci
nous permet dobtenir une grammaire que l'on peut
analyser syntactiquement avec un analyseur
syntactique récursif descendent qui n'a pas
besoin de backtracking. - Cette classe de compilateur sappelle un
analyseur syntactique prédictif.
7Grammaires Récursives a Gauche I
- Une grammaire est récursive a gauche si il y a un
noeud non terminal A et il y a une dérivation A ?
Aa pour nimporte quelle chaîne a. - Les Analyseurs Syntactiques descendants peuvent
entrer dans une boucle infinie en presence de
règles récursives a gauche. Donc, on doit les
éliminer. - On peut éliminer une règle récursive a gauche
comme A ? A a ß si on peut la remplacer par - A ? ß R ou R est un nouveau
noeud non terminal - R ? a R ? et ? est la
chaîne vide. - La nouvelle grammaire est récursive a droite.
8Grammaires Récursives a Gauche II
- Si vous avez une récursion a gauche
directecest-à-dire, si la récursion se produit
a linterieure dune seule règleOn peut l
éliminer de la manière suivante - Groupez les règles
- A ? Aa1 Aam ß1 ß2 ßn
- Assurez-vous quaucun des ßs commence par A
- Remplacez les A-règles originales par
- A ? ß1A ß2 A ßn A
- A ? a1 A a2 A am A
- Ce procédé n'éliminera pas la récursion a gauche
indirecte de la sorte - A ? BaA
- B ? Ab Il y a un autre procédé
mais nous ne le discutons pas ici - La récursion a gauche directe ou indirecte est
problématique pour tous les analyseurs
descendents. Cependant, ce n'est pas un problème
pour des algorithmes d'analyse ascendants.
9Grammaires Récursives a Gauche III
- Voici un exemple d'une grammaire avec récursion a
gauche directe - E ? E T T
- T ? T F F
- F ? ( E ) id
- Cette grammaire peut être réécrite comme la
grammaire non récursive a gauche suivante -
- E ? T E E ? TE ?
- T ? F T T ? F T ?
- F ? (E) id
10Factorisation a Gauche d'une Grammaire I
- La récursion a gauche n'est pas le seul trait qui
empêche l'analyse descendante. - Un autre est la question de savoir si l'analyseur
peut toujours choisir le côté droit correct par
seule analyse du jeton d'entrée suivant cest a
dire, en utilisant seulement le premier jeton
produit par le non terminal dextrême gauche dans
la dérivation courante. - Pour s'assurer que c'est possible, nous avons
besoin de factoriser a gauche la grammaire
produite a l'étape précédente (qui nest plus
récursive a gauche).
11Gauche-Factorisation d'une Grammaire II
- Voici le procédé utilisé pour factoriser une
grammaire a gauche - Pour chacun des non terminaux A, trouvez le plus
long préfixe a commun à deux ou à plus de ses
alternatives. - Remplacez toutes les A-productions
- A ? aß1 aß2 aßn ?
- (ou ? représente toutes les alternatives qui ne
commencent pas avec a) - par
- A ? a A ?
- A ? ß1 ß2 ßn
12Gauche-Factorisation d'une Grammaire III
- Voici un exemple d'une grammaire qui a besoin
detre factorisee a gauche - S ? iEtS iEtSeS a
- E ? b
- ( i if t then et e else)
- Apres la factorisation a gauche cette grammaire
devient -
- S ? iEtSS a
- S ? eS ?
- E ? b
13Analyseur Syntactique Prédictif Détails
- Le problème principal pendant l'analyse
prédictive est celui de déterminer la production
à appliquer pour un non terminal. - Ceci est fait en employant une table d'analyse.
- Une table d'analyse est un tableau bidimensionnel
MA,a où A est un non terminal, et a est un
terminal ou le symbole qui signifie fin de
chaîne dentrée. - Les autres entrées dun Analyseur Syntactique
Prédictif sont - La mémoire tampon dentrée, qui contient la
chaîne à analyser suivie de . - La pile qui contient une sequence de symboles de
grammaire avec, au depart, simplement S (la fin
de la chaîne dentrée et le symbole de départ).
14Analyseur Syntactique Prédictif Procédé Informel
- LAnalyseur Syntactique Prédictif utilise X, le
symbole sur le dessus de la pile, et a, le
symbole dentrée suivant. Il utilise egalement M,
la table d'analyse. - Si Xa ? arrêter et retourner succès
- Si Xa? ? Enlever X de la pile et avancer le
pointeur dentrée vers le prochain symbole - Si X est un non terminal ? consulter MX,a
- Si lélément est un regle de production,
remplacer X sur la pile avec le côté droit de la
production - Si lélément est vide, arrêter et retourner
echec
15Analyseur Syntactique Prédictif Un Exemple
Pile Entrèe Sortie
E ididid
ET ididid E ? TE
ETF ididid T ? FT
ETid ididid F ? id
ET idid
E idid T ? ?
ET idid E ? TE
ET idid
ETF idid T ? FT
ETid idid F ? id
ET id
ETF id T ? FT
ETF id
ETid id F ? id
ET
E T ? ?
E ? ?
id ( )
E E?TE E?TE
E E?TE E?? E??
T T? FT T?FT
T T?? T?FT T?? T??
F F?id F?(E)
Table d'analyse Trace de
lAlgorithme ?
16Construire la Table D'analyse I
First et Follow
- First(a) est l'ensemble des terminaux qui sont a
la tete de la chaîne a. Follow(A) est l'ensemble
des terminaux a qui peuvent être tout de suite à
la droite de A. First et Follow sont employés
dans la construction de la table d'analyse. - Construire First
- Si X est un terminal, alors First(X) est X
- Si X ? ? est une production, alors ajoutez ? à
First(X) - Si X est un non terminal et X ? Y1 Y2 Yk est
une production, alors placez a dans First(X) si,
pour quelque i, a est dans First(Yi) et ? est
dans tous les First(Y1) First(Yi-1)
17Construire le Table D'analyse II First et
Follow
- Construire Follow
- Mettre dans Follow(S), où S est le symbole de
départ et est le symbole de fin de chaîne. - Si il y a une production A ? aBß, alors tout le
contenu de First(ß) sauf ? est mis dans
Follow(B). - Si il y a un production A ? aB ou une production
A ? aBß et First(ß) contient ?, alors tout le
contenu de Follow(A) est dans Follow(B) - Exemple E ? TE E
? TE ? - T ? FT
T ? FT ? - F
? (E) id - First(E) First(T) First(F) (, id
- First(E) , ? First(T) , ?
- Follow(E) Follow(E) ),
- Follow(F),,), Follow(T) Follow(T)
,),
18Construire la Table D'analyse III
- Algorithme pour construire une table d'analyse
prédictive - Pour chaque A ? a de la grammaire, fait étapes 2
et 3 - Pout chaque terminal a dans First(a), ajouter A ?
a à MA, a - Si ? est dans First(a), ajouter A ? a à MA, b
pour chaque terminal b dans Follow(A). Si ? est
dans First(a), ajouter A ? a à MA,b pour chaque
terminal b dans Follow(A). Si ? est dans First(a)
et est dans Follow(A), ajouter A ? a à MA, . - Chaque élément indéfini de M est une erreur.
19LL(1) Grammaires
- Une grammaire avec un table d'analyse qui n'a
aucune entrée contenant plus dune définition
s'appelle LL(1) - Aucune grammaire ambiguë ou récursive a gauche ne
peut être LL(1). - Une grammaire G est LL(1) si et seulement si dans
tous les cas ou A ? a ß sont deux productions
distinctes de G, les conditions suivantes sont
verifiees - Il ny a aucun terminal a pour lequel a ainsi que
ß dérivent des chaînes commençant par a - a ou ß peut dériver la chaîne vide, mais les deux
ne peuvent pas le faire simultanement. - Si ß peut (directement ou indirectement) dériver
?, alors a ne peut pas dériver de chaîne qui
commence avec un terminal appartenant a Follow(A).
20Partie II Analyseur Syntactique Ascendant
- Il y a différentes approches à l'analyse
ascendante . Une approche sappelle Shift-Reduce
parsing. Cette approche peut, en outre, prendre
des formes diverses. - LUne de ces méthode sappelle Operator-precedence
parsing. Cependent, elle nest pas tres
generale. Une autre methode LR-Parsing lest
beaucoup plus. - Dans ce cours, nous nous concentrerons sur le
LR-Parsing. LR-Parsing prend, lui-meme, trois
formes Simple LR-Parsing (SLR) une version
simple mais limitée le LR canonique, la version
la plus puissante, mais la plus chère et LALR
qui est intermédiaire en coût et puissance. Nous
allons nous concentrer, ici, sur le SLR.
21LR-Parsing Avantages
- Le LR Parsing peut identifier n'importe quelle
langue pour laquelle une grammaire libre de
contexte peut être écrite. - Le LR parsing est la methode la plus générale de
parsing. Cependant, elle est aussi efficace que
toute autre approche Shift-Reduce. - La classe de grammaires qui peuvent être
analysées parle LR Parsing contient la classe de
grammaires qui peut être analysé par un analyseur
prédictif et est plus vaste. - Le LR-Parsing peut détecter une erreur
syntactique dès qu'il sera possible de le faire
pendant un scan de gauche à droite de l'entrée.
22LR-Parsing Inconvénient/Solutions
- L'inconvénient principal du LR-Parsing est que,
pour une grammaire typique de langage de
programmation, sa construction à la main demande
trop de travail. - Heureusement, des outils spécialisés pour
construire des parseur LR automatiquement ont été
conçus. - Avec de tels outils, un utilisateur peut écrire
une grammaire libre de contexte et la passer dans
un générateur de compilateur automatique afin de
produire un parseur pour cette grammaire. - Un exemple d'un tel outil est Yacc Yet Another
Compiler-Compiler"
23Algorithmes de LR-Parsing Détails I
- Un Parseur LR se compose d'une entrée, dune
sortie, d'une pile, d'un programme pilote et
d'une table d'analyse a deux parties action et
goto. - Le programme pilote est le même pour tous les
parseurs LR. Seule la table d'analyse change d'un
parseur a lautre. - Le programme emploie la pile pour stocker une
chaîne de la forme s0X1s1X2Xmsm, ou sm est le
dessus de la pile. Les Sks sont des symboles
détat et les Xis sont des symboles de grammaire
. Ensemble, les symboles d'état et de grammaire
déterminent les décisions des parseurs LR.
24Algorithmes de LR-Parsing Détails II
- La table d'analyse se compose de deux parties
une fonction d'action du Parseur et une fonction
goto. - Le programme de Parsing LR détermine sm, l'état
sur le dessus de la pile et ai, l'entrée
courante. Il consulte alors l'actionsm, ai ce
qui peut prendre une des quatre valeurs
suivantes - Shift
- Reduce
- Accept
- Error
25Algorithmes de LR-Parsing Détails III
- Si lactionsm, ai Shift s, Décalez s, où s
est un état et poussez ai et s sur le haut de la
pile. - Si lactionsm, ai Reduce A ? ß, alors ai et
sm sont remplaces par A, et, si s était l'état
au-dessous de ai dans la pile , alors gotos, A
est consulté et l'état qu'il stocke est poussé
sur la pile. - Si lactionsm, ai Accept, alors lanalyse est
accomplie. - Si actionsm, ai Error, alors l'analyseur a
découvert une erreur.
26Algorithmes de LR-Parsing Exemple La Grammaire
- E ? E T
- E ? T
- T ? T F
- T ? F
- F ? (E)
- F ? id
27Algorithmes de LR-Parsing Exemple La Table
dAnalyse
State Action Action Action Action Action Action Goto Goto Goto
State id ( ) E T F
0 s5 s4 1 2 3
1 s6 Acc
2 r2 s7 r2 r2
3 r4 r4 r4 r4
4 s5 s4 8 2 3
5 r6 r6 r6 r6
6 s5 s4 9 3
7 s5 s4 10
8 s6 s11
9 r1 s7 R1 r1
10 r3 r3 r3 r3
11 r5 r5 r5 r5
28Algorithmes de LR-Parsing Exemple
Trace du programme
Pile Entrée Action
0 id id id Shift
(2) 0 id 5 id id Reduce by F ? id
(3) 0 F 3 id id Reduce by T ? F
(4) 0 T 2 id id Shift
(5) 0 T 2 7 id id Shift
(6) 0 T 2 7 id 5 id Reduce by F ? id
(7) 0 T 2 7 F 10 id Reduce by T ? T F
(8) 0 T 2 id Reduce by E ?T
(9) 0 E 1 id Shift
(10) 0 E 1 6 id Shift
(11) 0 E 1 6 id 5 Reduce by F ? id
(12) 0 E 1 6 F 3 Reduce by T ? F
(13) 0 E 1 6 T 9 E ? E T
(14) 0 E 1 Accept
29Analyse SLR I
- Definition Un article LR(0) d'une grammaire G
est une production de G avec un point à une
position particuliere du côté droit. - Exemple A ? XYZ produit les quatre articles
suivants - A ? .XYZ
- A ? X.YZ
- A ? XY.Z
- A ? XYZ.
- La production A ? ? produit un seul article , A ?
. - Intuitivement, un article indique quel montant de
la production nous avons vu à un point precis
dans le processus d'analyse.
30Analyse SLR II
- Pour créer une table d'analyse de SLR, nous
définissons trois nouveaux éléments - Une grammaire augmentée pour G, la grammaire
initiale. Si S est le symbole de départ de G,
nous ajoutons la production S ? .S . Le
but de cette nouvelle production est d'indiquer à
l'analyseur quand il doit cesser lanalyze et
accepter l'entrée. - L'opération de fermeture (The closure operation)
- la fonction goto
31Analyse SLR II L'opération de fermeture
- Si I est un ensemble d'articles pour une
grammaire G, alors closure(I) est l'ensemble
d'articles construits a partir de I par les deux
règles suivantes - Au commencement, chaque article de I est ajouté a
closure(I) - Si A ? a . B ß est dans closure(I) et B ? ? est
une production, alors ajouter larticle B ? . ? à
I, s'il n'est pas déjà present. Nous appliquerons
cette règle jusqu'à ce quil ny ait plus de
nouveaux articles a ajouter a closure(I).
32Analyse SLR L'opération de fermeture Example
- Grammaire Originale Grammaire augmentée
-
0. E ? E - E ? E T 1. E ? E T
- E ? T 2. E ? T
- T ? T F 3. E ? T F
- T ? F 4. T ? F
- F ? (E) 5. F ? (E)
- F ? id 6. F ? id
Si I E ? E alors Closure(I)
E ? .E, E ? .E T,
E ? .T, E ?
.TF,
T ? .F, F ? .(E)
F ? .id
33Analyse SLR L'opération Goto
- Goto(I,X), où I est un ensemble d'articles et X
est un symbole de grammaire, est défini comme la
fermeture de l'ensemble de tous les articles A ?
aX.ß tels queA ? a.Xß est dans I. - Exemple Si I est l'ensemble de deux articles E
? E., E ? E.T, alors goto(I, ) se compose
de - E ? E .T
- T ? .T F
- T ? .F
- F ? .(E)
- F ? .id
34Analyse SLR Construction densembles d'articles
- procedure articles(G)
- C Closure(S ? .S)
- Répétez
- Pour chaque ensemble de points I en C et
chaque symbole X de grammaire tels que
goto(I,X) nest pas vide et pas en C, faites - ajoutez goto(I,X) à C
- Jusqu'à quaucun nouvel ensemble d'articles
ne peut être ajouté à C
35Exemple La collection canonique LR(0) pour la
grammaire G
- I0 E ? .E I4 F ? (.E)
I7 T ? T .F - E ? .E T E ? .E T
F ? .(E) - E ? .T E ? .T
F ? .id - T ? .T F T ? .T F
I8 F ? (E.) - T ? .F T ? .F
E ? E.T - F ? .(E) F ? .(E)
I9 E ? E T. - F ? .id F ? .id
T ? T. F - I1 E ? E. I5 F ? id.
I10 T ? TF. - E ? E.T I6 E ? E.T
I11 F ? (E). - I2 E ? T. T ? .TF
- T ? T. F T ? .F
- I3 T ? F. F ? .(E)
- F ? .id
-
36Construction d'une Table d'analyse de SLR
- Construire CI0, I1, In la collection
d'ensembles de d articles LR(0) pour G - L'état i est construit a partir de Ii. Les
actions d'analyse pour l'état i sont déterminées
comme suit - Si A ? a.aß est dans Ii et goto(Ii,a) Ij,
alors actioni,a devient shift j. Ici a doit
être un terminal. - Si A ? a. est dans Ii, alors actioni, a
devient réduce A ? a pour tout les a dans
Follow(A) Ici A ne peut pas être S. - Si S ? S. est dans Ii, alors actioni,
devient accept - Si des actions contradictoires sont produites par
les règles ci-dessus, nous disons que la
grammaire n'est pas SLR(1). L'algorithme alors ne
produit pas danalyseur.
37Construction d'une Table d'analyse de SLR (contd)
- 3. Les transitions goto pour l'état i sont
construites pour tous les nonterminaux A en
utilisant la règle Si goto(Ii, A) Ij, alors
gotoi, A j. - 4. Toutes les entrées non définies par les règles
(2) et (3) deviennent des erreurs. - 5. L'état initial de l'analyseur est celui qui a
ete construit a partir de l'ensemble d'articles
contenant S ? S. - Voir l'exemple en classe