Documente Academic
Documente Profesional
Documente Cultură
Doeraene
Remerciements
Ce travail n'aurait jamais pu voir le jour sans l'aide de certaines personnes. Elles m'ont soit
aid et soutenu, soit relu, soit t une source d'informations importante.
Tout d'abord, je remercie monsieur Paul Goethals, qui a accept d'tre mon promoteur
pour ce travail. Ses conseils m'ont t trs utiles pour cerner le sujet tudier, ainsi que pour le
rendre accessible des non-dingues-de-programmation...
Ensuite, je voudrais remercier messieurs Dick Grune, Henri E. Bal, Ceriel J.H. Jacobs et
Koen G. Langendoen, pour leur livre Compilateurs [GBJL02]. Cet ouvrage a t ma rfrence
en matire de compilation tout au long de la prparation et de la rdaction de ce document.
Troisimement, je remercie monsieur Laurent Dardenne, membre de l'quipe de rdaction
de www.developpez.com, pour ses relectures attentives et ses conseils toujours aussi constructifs.
Enn, encore un grand merci messieurs Nguib Serhani et Pierre Caboche, galement
rdacteurs sur www.developpez.com, qui ont relu mon travail et en ont corrig les fautes d'orthographe et de formulation.
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
I Introduction la compilation
I.1
I.2
I.3
I.3.1
Partie avant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
I.3.2
Partie arrire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
I.3.3
I.4.1
I.4.2
10
10
I.5.1
Symboles grammaticaux . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
I.5.2
Productions et choix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
I.5.3
Proprits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
I.5.4
13
I.4
I.5
14
15
15
17
17
18
19
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
21
30
IV Analyse ascendante
31
31
32
V Projet exemple
33
VI Conclusion
36
37
39
Glossaire
40
Bibliographie
41
42
Index
43
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Chapitre I
Introduction la compilation
Qu'est-ce que la compilation ? Voil une question que la plupart des personnes poseront en
entendant parler de cette notion. Non, ce n'est pas le fait de compiler plusieurs chansons sur un
CD ; du moins, ce n'est pas cette compilation-l que nous tudierons ici.
Qui sont ces personnes ? Ce sont celles qui n'ont jamais programm. En eet, la compilation
est un des fondements de la programmation.
De mme les dveloppeurs, pour la plupart d'entre eux, ne se sont jamais rellement pos la
question de savoir ce qu'taient les compilateurs, au sens technique du terme.
Nous allons donc voir, au travers de ce document, ce que sont rellement les compilateurs,
et comment ils fonctionnent. Nous nous attarderons plus particulirement sur une tape de leur
fonctionnement qui fait peur beaucoup de dbutants en la matire.
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Les conseils : Ils donnent une information au programmeur pour probablement amliorer l'ef-
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Fig.
code, conformment aux spcications du langage source. Dans un second temps, elle rcrit le
comportement du programme dans un Langage Intermdiaire (abrg en LI), plus simple que le
langage source, et donc plus facile convertir ensuite en du code objet. Il en ressort du Code
Intermdiare, abrg en CI.
La partie arrire reoit le code intermdiaire gnr par la partie avant, et le dcline dans le
langage cible.
Chacune de ces deux parties est elle-mme compose de plusieurs modules. Nous allons voir
leurs rles respectifs dans les grandes lignes.
La gure 1.1 reprsente les connexions entre les dirents modules.
I.3.1
Partie avant
Comme nous l'avons vu plus haut, la partie avant reoit en entre la suite linaire des caractres du code source, et a pour responsabilit d'en extraire la structure, an de la rcrire dans
un langage plus simple, le langage intermdiaire.
Pour faire ceci, le code source passe au travers de cinq modules dirents.
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
0 et 'Le nombre est positif', avec les variables comme Entier. Dans le cas des constantes,
c'est l'analyseur lexical de dterminer le type et la valeur, l'aide d'une classe de lexmes
dirente selon le type. Dans le cas des variables, c'est l'analyseur smantique de dcouvrir le
type, puisqu'elles sont toutes regroupes sous la classe de lexmes Identificateur.
Vous pourrez trouver une introduction l'analyse lexicale dans l'article sur les Lexers (autre
nom des analyseurs lexicaux) d'Olivier Lance [LAN04].
Bien que nous n'tudierons pas l'analyse lexicale, nous aurons besoin d'un analyseur, dans
la mesure o nous travaillerons sur des lexmes dans l'analyse syntaxique. Vous trouverez une
brve explication de l'analyseur lexical utilis dans l'annexe A.
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
I.3.2
Partie arrire
La question peut se poser : quels sont les modules susceptibles de signaler des erreurs ?
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Techniquement, n'importe quel module peut provoquer des erreurs comme n'importe quel
programme mais seuls les trois modules que l'on peut qualier d'analyse indiquent des erreurs
relatives la compilation :
l'analyseur lexical signale des erreurs lexicales, c'est--dire des caractres non autoriss,
comme la prsence (hors-chane) d'un $ dans un code source Pascal ;
l'analyseur syntaxique signale des erreurs syntaxiques, c'est--dire une malformation dans
la structure du code source, par exemple une instruction MaVariable := ; dans un code
source Pascal ;
l'analyseur smantique signale des erreurs smantiques, comme des incompatibilits de
types de variables (aectation d'un integer un string en dans un code source Pascal,
par exemple).
Si un autre module gnre une erreur, il s'agit probablement d'un bogue du compilateur, ou
d'un quelconque problme systme comme des erreurs d'entre/sortie (accs aux chiers) ou un
dpassement de la mmoire disponible.
Une des deux grandes questions est quelles sont les donnes quelle est la granularit des
donnes pour tre exact qui transitent entre les dirents modules.
Il y a deux choix raisonnables possibles : soit la plus petite quantit signicative de donnes
d'un module au suivant (par exemple, un lexme de l'analyse lexicale l'analyse syntaxique) ;
soit le programme dans son intgralit. En l'absence de terminologie pour ces deux types de
largeur, nous parlerons respectivement de compilateurs troits et larges.
Jusqu'en 1980, l'utilisation de compilateurs larges tait impensable, cause des besoins en
mmoire d'un tel type de compilateur. Seuls des compilateurs troits taient alors construits.
Ainsi, de nombreux outils ont t dvelopps pour faciliter ce type d'architecture. C'est pourquoi
les compilateurs troits sont encore fortement utiliss.
En revanche, les compilateurs larges sont plus intressants d'un point de vue pdagogique,
puisqu'ils sont en vrit construits de telle sorte que le texte du programme passe successivement
dans dirents modules, chacun lui appliquant certaines transformations. En outre, ils sont aussi
plus simples concevoir, puisqu'ils vitent de se poser des questions telles que le choix du module
qui commande, comme nous le verrons dans la section suivante.
Bien que ces deux architectures paraissent diamtralement opposes, il n'est pas impossible
de mlanger les deux types. Par exemple, un compilateur pourrait rassembler des modules conscutifs en un seul, qui aurait une entre et une sortie large, mais qui serait troit l'intrieur.
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
La seconde grande question d'architecture pose le problme du choix du module qui doit
commander les autres.
Comme nous l'avons dit plus haut, cette question ne se pose pas dans le cas des compilateurs
larges. En eet, ceux-ci traitent l'information module par module.
En revanche, dans un compilateur troit, il est essentiel de savoir quel est le module qui tourne
en permanence et qui appelle les autres.
Cette question tant complexe, et ne faisant pas partie du sujet de cet article, je vous renvoie
au livre Compilateurs [GBJL02, section 1.4.2] pour plus d'informations ce propos.
Pour notre part, c'est le module d'analyse syntaxique qui commandera. C'est en eet celui
que nous tudions et il sera plus simple de l'tudier s'il possde en permanence le contrle.
Symboles grammaticaux
10
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
D'un point de vue de la thorie des arbres, un terminal est une feuille, et un non-terminal est
un nud intrieur, y compris la racine de l'arbre d'analyse.
D'un point de vue de la structure d'un langage, un terminal est un lexme, et un non-terminal
est un groupe cohrent smantiquement de symboles grammaticaux.
Des exemples de terminaux que nous pouvons trouver dans le langage Pascal sont des identicateurs, des mots-clefs, des oprateurs, etc. Des non-terminaux seraient les instructions, les
blocs begin...end, les dclarations de classes.
Un non-terminal peut tre compos de lui-mme galement ! Et c'est en eet trs souvent le
cas.
Un terminal est habituellement not au moyen de la lettre t, avec ventuellement un indice
indiquant sa position dans l'entre, ainsi qu'au moyen des lettres x, y et z . Tandis qu'un nonterminal est not au moyen d'une lettre majuscule, essentiellement N , A, B , et C . Le terminal
symbolisant la n du chier source est reprsent par le symbole a.
Chaque grammaire dnit un symbole de dpart , qui est un non-terminal. Il correspond au
non-terminal qui se trouve au-dessus de tous les autres, et partir duquel on peut produire tout
le texte du programme, en entier. Ce symbole de dpart tant un non-terminal, il est not au
moyen d'une lettre majuscule ; en gnral, on utilise la lettre S , pour Start.
En Pascal, le symbole de dpart pourrait tre le non-terminal Unite suivant :
Unite
I.5.2
Productions et choix
Une production est la recette de fabrication d'un non-terminal. Elle indique les dirents
symboles grammaticaux qui peuvent former un non-terminal. On note une production de cette
faon :
N
11
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Cela indique que le non-terminal N peut tre form de la suite de symboles grammaticaux
Dans les productions, on note les terminaux xes (comme les mots-clefs ou les oprateurs)
tels quels, entours de guillemets simples. Et on note les terminaux variables (comme les identicateurs et les nombres) par leur nom de classe.
Par exemple, une production possible en Pascal pour l'instruction d'aection serait :
Affectation
Un non-terminal a souvent plusieurs faons d'tre implment. Chacune des faons d'implmenter un non-terminal N est appele un choix de N . Chaque choix est une suite de symboles
grammaticaux et est donc not au moyen d'une lettre grecque minuscule.
Pour crire l'ensemble des productions de N en une seule fois, on utilise la notation suivante :
N
|||...
Certains non-terminaux peuvent aussi avoir un choix vide. Dans ce cas, on n'oubliera pas
d'ajouter E comme dernier choix de N .
N
|...|E
Ainsi, en Pascal par exemple, tant donn qu'une instruction peut tre vide, on crira :
Instruction
I.5.3
Proprits
Les grammaires sont dotes de proprits. Ces proprits sont trs importantes pour leur
tude. Vous verrez que ce tutoriel fait souvent appel aux proprits des grammaires.
Un non-terminal N est rcursif gauche si, partir du syntagme N (c'est--dire un sousarbre de drivation qui correspond au non-terminal N ), on peut produire un autre syntagme qui
commence par N . Voici une forme de rcursivit gauche (directe) :
N
N |
12
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Toute grammaire qui contient au moins un non-terminal rcursif gauche est elle-mme dite
rcursive gauche. La rcursivit droite existe aussi mais a moins d'importance.
Un non-terminal N est nulliable si, partir du syntagme N , on peut produire un syntagme
vide (E ).
Le contenu de la partie interface d'une unit Pascal en est un bon exemple :
PartieInterface
ClauseUses
ClauseTypes
ClauseConsts
DefProcs
tant donn que chaque composante de PartieInterface peut tre une chane de symboles grammaticaux vides (E ), la PartieInterface peut elle-mme tre une chane de symboles
grammaticaux vides, et est donc nulliable.
Un non-terminal N est inutile s'il ne peut driver aucune chane de terminaux. Cela peut
arriver si, de quelque faon qu'on drive le syntagme N , on retombe invitablement sur un
syntagme contenant N (de faon directe ou indirecte). En voici un exemple :
Une grammaire est dite ambigu lorsque deux arbres de drivation dirents produisent la
mme suite de lexmes. Ce type de grammaires doit tre absolument cart, car il empche toute
russite de cration d'un analyseur syntaxique.
I.5.4
Conway
Habituellement, dans la documentation des langages, ce n'est pas la notation BNF qui est
utilise. Elle n'est pas assez lisible pour les humains que nous sommes.
On utilise dans ce type de documents les diagrammes de Conway, qui sont une reprsentation
graphique des grammaires, plutt que textuelle.
Une excellente source d'informations propos des diagrammes de Conway est un document
sur le lexique et la syntaxe de Michel Beaudoin-Lafon [BELA98, section 3].
13
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Chapitre II
Introduction l'analyse syntaxique
Nous en arrivons au sujet principal de ce tutoriel, savoir l'analyse syntaxique proprement
dite. Ainsi que nous l'avons vu, il s'agit d'un des modules de la partie avant du compilateur.
Son rle est de dterminer la structure en arbre, que cache la suite linaire de lexmes fournie
par l'analyseur lexical, et ceci en correspondance avec la grammaire du langage compiler.
J'ai choisi d'tudier ce module car j'estime que c'est celui qui me semble le plus dlicat
implmenter pour un nophyte de la compilation. Sans un minimum de connaissances thoriques,
le risque est d'tre rapidement bloqu par la manire d'arranger les lexmes en arbre.
Mais pourquoi un arbre ? Tout simplement parce que c'est de cette faon qu'est dcrite
un langage. Les terminaux des grammaires forment les feuilles de l'arbre, tandis que les nonterminaux en forment les nuds intrieurs, le nud racine tant le symbole de dpart de la
grammaire.
Il y a deux types de mthodes pour l'analyse syntaxique : l'analyse dterministe, de gauche
droite, et descendante et l'analyse dterministe, de gauche droite, et ascendante.
Le terme de gauche droite signie que l'analyseur avance squentiellement, dans l'ordre de
gauche droite du texte du programme, ou plus exactement des lexmes.
Le dterminisme signie qu'aucune recherche n'est ncessaire. Le traitement de chaque lexme
amne l'analyseur un pas plus loin vers la construction de l'arbre syntaxique.
Les termes descendant et ascendant seront expliqus plus loin.
L'arbre syntaxique qui rsulte du module d'analyse syntaxique reprsente la structure du
code source compiler, et satisfait les points suivant :
Les nuds feuilles sont tiquets par des terminaux, et les nuds internes par des nonterminaux ;
Le nud racine est tiquet par le symbole de dpart de la grammaire ;
Les ls d'un nud interne tiquet N correspondent aux membres d'un des choix de N ,
dans le mme ordre que dans le choix ;
Les terminaux tiquetant les nuds feuilles correspondent la suite de lexmes, dans le
mme ordre que dans l'entre.
Vous trouverez une reprsentation d'un arbre abstrait sur la gure 2.1.
14
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Fig.
15
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
petites portions de l'arbre, puis remonte pour construire le reste partir des portions dj
construites.
Nous verrons le principe gnral de ces deux types d'analyseurs. En revanche, nous n'tudierons en dtail que l'analyse descendante dans le cadre de ce travail de n d'tudes, et laisserons
donc de ct les techniques de l'analyse ascendante. Ce choix a t fait essentiellement cause
des limitations imposes sur la longueur des travaux.
Ainsi, pour la mthode descendante, nous tudierons ensuite en dtail le fonctionnement de
son algorithme, au moyen d'un exemple de grammaire.
16
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Chapitre III
Analyse descendante
Nous commenons par l'analyse descendante, et ce pour la bonne et simple raison que c'est
la premire avoir t invente... En eet, c'est la seule des deux mthodes qu'il est possible
d'appliquer la main, en programmant son analyseur de la premire la dernire ligne de code.
Rappelons au passage que c'est la seule mthode que nous tudierons en dtail dans ce travail.
17
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Fig.
Dans cette gure, les carrs symbolisent les nuds de l'arbre. Les noirs sont dj construits,
tandis que les blancs ne le sont pas encore, bien que leur existence soit connue. D'autre part, les
cercles symbolisent les lexmes, les noirs tant ceux sur lesquels l'analyseur a dj avanc, et les
blancs tant ceux qui restent dans l'entre.
18
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Entree
Expression
Terme
ExpressionParenthesee
ResteExpression
Fig.
Expression a
Terme ResteExpression
Nombre | ExpressionParenthesee
'(' Expression ')'
'+' Expression | E
Nous venons de dire que la descente rcursive tait nave. Alors... Soyons nafs pour dcouvrir
comment elle fonctionne.
La manire la plus simpliste de trouver quel est le bon choix du nud N slectionner, est
tout simplement de les tester l'un aprs l'autre, et de prendre le premier qui fonctionne.
Pour cela, l'analyseur est compos d'une fonction pour chaque non-terminal de la grammaire.
Pour rendre tout cela moins abstrait et ainsi amliorer la comprhension, nous allons utiliser une
grammaire exemple relativement simple, que vous pouvez voir sur la gure 3.21 .
Ainsi, notre analyseur possdera cinq fonctions essentielles, une pour chacun des cinq nonterminaux de cette grammaire. Une fonction supplmentaire est ajoute pour analyser un terminal (dont la classe est passe en paramtre). Chaque fonction renvoie une valeur boolenne
indiquant si on a pu driver le syntagme N jusqu' obtenir le lexme t en entre.
Pour arriver faire cela, elle teste si le premier choix du non-terminal N peut commencer
par t. Si le premier symbole grammatical de est un terminal, alors c'est trivial : le choix est
bon si ce terminal est t. Si c'est un non-terminal, alors est le bon choix si, en descendant 2 la
fonction correspondante ce non-terminal, on reoit une valeur de retour positive.
Si le choix n'tait pas le bon, alors on teste le deuxime choix , et ainsi de suite jusqu'
ce que tous les choix aient t puiss. Dans ce cas, la fonction renvoie False, pour indiquer la
fonction appelante que le choix du non-terminal N n'tait pas bon.
Si on a trouv un choix correct, alors on admet qu'il est compltement correct, et ce pour
assurer le dterminisme tant recherch. Cela signie qu'on exige que la suite de ce choix soit
prsente. Si ce n'est pas le cas, il y a erreur syntaxique.
Le chier source DescenteRecursive.pas (voir annexe B) montre le code d'un analyseur
pour la grammaire de la gure 3.2. Pour analyser une chane d'entre, il faut la passer en pa1 Cet exemple
2 D'o le nom
19
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
t
t
t
t
t
t
t
t
t
t
t
t
t
=
=
=
=
=
=
=
=
=
=
=
=
=
AnalyseSyntaxique('(i + i) + i + (i)')
, Entree
, Expression
, Terme
, Lexeme(lexNombre) renvoie False
, Terme
, ExpressionParenthesee
, Lexeme('(') renvoie True
, ExpressionParenthesee
, Expression
, Terme
, Lexeme(lexNombre) renvoie
, Terme renvoie True
(
(
(
(
(
(
(
1
1
1
1
+
+
True
etc.
Fig.
un graphe de contrle du ux entre les direntes fonctions. Vous trouverez la partie explicite
de ce graphe la gure 3.3.
Un appel est donc fait de l'extrieur la fonction AnalyseSyntaxique, comme ceci :
ArbreSyntaxique := AnalyseSyntaxique ( ' (1 + 2) + 3 + (4) ' );
if...then.
3 Pour
rappel, des informations sur l'analyseur lexical utilis pourront tre trouves en annexe A.
20
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Analyse LL(1)
21
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Le problme, c'est que pour obtenir ces rsultats, il faut eectuer des quantits astronomiques
de calculs. Bien entendu ce n'est pas le cas pour notre petite grammaire exemple, mais la quantit
de calculs eectuer est fonction exponentielle de la complexit de la grammaire !
Y a-t-il alors une solution ? Oui. Il s'agit de faire calculer ces rsultats par un autre programme,
que l'on appelle communment gnrateur de compilateur.
Voyons maintenant quelles sont exactement les informations dont nous avons besoin, avant
de nous demander comment les obtenir.
prem
22
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
calculer ceux des choix, nous avons encore besoin de ceux des non-terminaux. Voyons donc
comment les calculer.
Pour un non-terminal N de la forme :
||
prem(N ) est naturellement l'union des ensembles des terminaux par lesquels peuvent commencer les choix , et de N . Nous avons donc besoin des prem des non-terminaux pour
calculer ceux des choix, mais aussi ceux des choix pour calculer les prem des non-terminaux.
Cela peut sembler tre un cercle vicieux. En fait, beaucoup d'algorithmes dans le domaine de la
compilation paraissent tre insolvables cause de cela. Pourtant, ils sont bel et bien ralisables.
On appelle ce type d'algorithme des algorithmes de fermeture transitive, ou plus simplement
algorithmes de fermeture .
Ce type d'algorithme possde trois parties : la dnition des donnes, l'initialisation, et les
rgles de dduction. La dnition des donnes peut tre assimile la dclaration var d'une
routine Pascal. Durant l'initialisation, on dnit les donnes de dpart. Et les rgles de dduction
sont les directives qui indiquent comment faire progresser l'ensemble des donnes vers la solution
nale.
Les algorithmes de fermetures ont besoin de donnes initiales, partir desquelles calculer
des informations supplmentaires. Mais que sont donc nos donnes initiales, dans ce cas ? Il
s'agit des ensembles des premiers des terminaux. Nous savons en eet que pour tout terminal t,
prem(t) = {t}.
Vous trouverez en gure 3.4 l'algorithme de fermeture qui calcule les ensembles prem d'une
grammaire. Appliqu sur la grammaire de la gure 3.2 (page 19), les ensembles prem calculs
seront tels que montrs sur la gure 3.5.
Vous aurez remarqu qu'une quatrime variante de l'ensemble des prem a t ajoute. Il
s'agit des prem des ns de choix. Nous aurons en eet besoin de ces informations pour le calcul
de l'ensemble des suivants.
23
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Initialisation
1.
2.
3.
4.
t GT : prem(t) = {t} ;
N GN : prem(N ) = ;
choix ou n de choix non vide de G : prem() = ;
choix ou n de choix vide de G : prem() = {E}.
Rgles de dduction
1. Pour chaque production N dans G, prem(N ) doit contenir tous les lexmes de
prem() ;
2. Pour chaque choix ou n de choix de la forme N , prem() doit contenir tous les
lexmes de prem(N ), except E ;
3. Pour chaque choix ou n de choix de la forme N telle que prem(N ) contient E ,
prem() doit contenir tous les lexmes de prem( ).
Fig.
lement de grammaire
lexNombre
'+'
'('
')'
a
Entree
Expression
Terme
ExpressionParenthesee
ResteExpression
Fig.
prem
{
{
{
{
{
{
{
{
{
{
prem
lexNombre
'+' }
'(' }
')' }
a }
lexNombre
lexNombre
lexNombre
'(' }
'+' E }
d'une grammaire G
'(' }
'(' }
'(' }
24
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Initialisation
Rgles de dduction
Non-terminal
Entree
Expression
Terme
ExpressionParenthesee
ResteExpression
Fig.
suiv
d'une grammaire G
suiv
{}
{ ')'
{ '+'
{ '+'
{ ')'
a }
')' a }
')' a }
a }
25
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
26
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Entree
Expression
Terme
ExpressionParenth
ResteExpr
Fig.
lexNombre
Expression
Terme ResteExpr
Identificateur
'+'
'+' Expression
'('
Expression
Terme ResteExpr
ExpressionParenth
'(' Expression ')'
')'
possder directement des informations de contexte qui pourront tre utiles une analyse smantique combine l'analyse syntaxique. Un avantage indniable pour les compilateurs troits.
Finalement, on peut maintenant utiliser la valeur de retour des fonctions pour une information
bien plus intressante qu'un code de russite, savoir le nud construit. Cela permet de simplier
galement l'criture des blocs de choix.
Vous voyez donc que l'analyse prdictive par descente rcursive ne possde que des atouts par
rapport l'analyse non-prdictive. Aussi, je vous dconseille de jamais construire un analyseur
non-prdictif professionnel.
noms longs des non-terminaux ont t tronqus pour faire tenir le tableau dans la largeur de la page.
27
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Tout cela doit vous sembler bien abstrait et peu comprhensible... Ne vous en faites pas, je suis
de votre avis. Aussi je vous propose de dcouvrir sans plus tarder le code de cet automate, que
nous allons expliquer ensuite. Vous pourrez trouver ce code dans le chier AutomateAPile.pas
(voir annexe B).
La routine matresse de ce source est bien entendu la routine AnalyseSyntaxique. Nous la
reproduisons sur la gure 3.9. Voyons son comportement pas pas.
Tout d'abord, l'instar de nos deux premiers analyseurs syntaxiques, celui-ci dmarre l'analyse lexicale (ligne 122).
Ensuite, on cre la pile prdictive (ligne 126). On transmet en paramtre du constructeur le
symbole de dpart de la grammaire : il sera empil originellement.
De la ligne 128 la ligne 156, on trouve la boucle principale de l'algorithme. Cette boucle
remplace en ralit les appels rcursifs des analyseurs prcdents. Elle ne s'arrte que sur erreur
syntaxique ou lorsque la pile prdictive est vide. Cette dernire situation signie que l'entre est
compltement analyse.
L'algorithme rptitif eectue la tche suivante : il dpile le sommet de la pile prdictive et,
selon son type, eectue une des trois actions suivantes.
Si le sommet de la pile est un code de retour au parent (ligne 133), alors on rednit le nud
courant comme tant le parent de l'ancien. Il s'agit du mouvement-E dont nous avions parl plus
haut. D'autres implmentations de ce mouvement peuvent tre faites. Par exemple, si l'on code
de manire ce qu'un nud de non-terminal puisse indiquer lorsque son choix est complet, on
peut se baser sur cette information pour remonter au parent.
Si le sommet de la pile est un terminal (ligne 137), il faut simplement reconnatre ce terminal
et l'ajouter aux ls du nud courant.
Si le sommet de la pile est un non-terminal (ligne 145), on eectue un mouvement de prdiction. Voici les direntes instructions qui sont eectues.
1. On commence par consulter la table de transition pour dterminer le choix slectionner,
en fonction du non-terminal rcupr en pile et du lexme en entre (ligne 146).
2. On cre ensuite le non-terminal indiqu en pile et on signale son choix (ligne 147). Remarquez au passage que nous utilisons dsormais un type gnrique pour les non-terminaux.
Il serait en eet impensable d'utiliser ici un case of pour dterminer son type. Si l'on
construit un analyseur troit, ce peut tre gnant. On recourra alors des tables de correspondance entre un non-terminal et sa classe et on utilisera un constructeur polymorphique.
3. La ligne 149 constitue une action un peu barbare : on assigne Result le premier nonterminal rencontr. Cela marche eectivement, mais c'est peu joli. Une programmation
propre requerrait ici un code plus lourd et donc plus lent. On prfre ainsi conserver cette
impuret informatique...
4. L'instruction suivante relie le nouveau nud au nud courant, qui est son parent (ligne
151).
5. Aprs cela, on dnit le nouveau nud comme le nud courant (ligne 153).
6. Finalement, on empile les dirents symboles du choix slectionn sur la pile (ligne 154).
Notez que les procdures EmpileChoixi empilent d'abord un code de retour au parent,
qui est la n du choix, puis tous les symboles dans l'ordre inverse sur la pile. Et ce pour
les dpiler plus tard dans le bon ordre.
28
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
120
125
130
135
140
145
150
155
160
165
29
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Notez enn la clause except (ligne 160) qui doit librer les nuds construits en cas d'erreur.
La seule libration du nud Result sut librer tous les nuds construits. En eet, dans cet
algorithme, le nud Result est le premier construit et ds qu'un nouveau nud est cr, il est
directement reli son parent et son parent lui. Ainsi, comme chaque parent dtruit les enfants
qui lui sont relis sa libration, une seule libration entrane toutes les autres. Rien de plus
simple...
30
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Chapitre IV
Analyse ascendante
Ainsi que nous l'avons indiqu plusieurs fois, nous n'tudierons pas en dtail l'analyse ascendante. Nous nous contenterons d'en donner le principe gnral. Ceci pour rester dans les limites
acceptables d'un travail de rhtorique.
31
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Fig.
On remarque que, contrairement la gure 3.1 (page 18), on ne trouve pas ici de carr blanc,
reprsentant les nuds non construits mais dont on connat l'existence. En eet, dans l'analyse
ascendante, on ne connat l'existence d'un nud qu'au tout dernier moment, et on le construit
alors immdiatement.
http://sjrd.developpez.com/algorithmique/compilation/analyseurs-syntaxiques/
32
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Chapitre V
Projet exemple
Nous avons donc tudi les analyseurs syntaxiques sous beaucoup d'angles. Cependant, nous
n'avons encore tudi que des petites parties isoles de leur fonctionnement.
C'est pourquoi j'ai dvelopp un projet exemple. C'est un ensemble de packages et de programmes Delphi qui permet d'analyser un code source Extra Simple Pascal et d'en donner la
structure au format XML.
Le langage que j'ai appel Extra Simple Pascal est une simplication l'extrme du langage
Pascal. Les deux seuls types de variables autoriss sont integer et string. Les seules oprations
utilisables sont + - * / et le parenthsage. Enn, il n'existe que l'aectation, l'appel de routine
et l'impression l'cran comme instructions. Le chier Exemple de source.txt de l'archive
indique ci-aprs prsente un exemple de code source valide de ce langage.
Vous pourrez trouver sur la gure 5.1 la grammaire de ce mini-langage. Bien entendu, celle-ci
a t crite de faon tre LL(1).
Vous pourrez tlcharger les sources compltes via ce lien :
ftp://ftp-developpez.com/sjrd/tutoriels/compilation/analyseurs-syntaxiques/projet.zip
Si votre conguration informatique vous empche d'utiliser le FTP, utilisez le miroir HTTP
suivant :
http://sjrd.ftp-developpez.com/tutoriels/compilation/analyseurs-syntaxiques/projet.zip
Ces sources ont t dveloppes avec Delphi 2005 dition Architecte, en Delphi Win32. Normalement, elle devraient tre compilables directement avec n'importe quelle dition de Delphi
2005 et Delphi 2006, et devraient galement se compiler sans problmes avec les versions antrieures.
Les cinq projets inclus dans le groupe de projet de ce .zip sont les suivants :
33
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Source
Routines
Routine
Procedure
Fonction
Parametres
SuiteParametres
DefVariable
TypeVariable
CorpsRoutine
DefVariables
SuiteDefVariables
Bloc
SuiteInstructions
Instruction
Print
IdentInstr
SuiteIdentInstr
Affectation
Augmentation
Diminution
Params
SuiteParams
Expression
SuiteExpression
Terme
SuiteTerme
Facteur
Fig.
34
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
tion, et surtout les calculs des premet suiv, des tables de transition, etc. ;
Generateur.exe : fournit une interface avec l'utilisateur pour utiliser les classes du package
prcdent.
Trois grammaires sont fournies avec les sources (chiers .gra). L'une reprsente la grammaire
exemple de la gure 3.2 (page 19). L'autre reprsente la grammaire du langage Extra Simple
Pascal. La troisime est une grammaire qui provoque les trois types de conits LL(1) tudis en
section III.2.2.4.
Vous pouvez ouvrir ces chiers dans le bloc-notes de Windows pour lire leur contenu, mais
surtout les charger avec le programme Generateur.exe pour rcuprer plus d'informations sur
elles que vous ne pouvez l'imaginer...
Ceci dit, ce qui est le plus intressant par rapport ce que nous avons tudi tout au long
de ce document, ce sont bien les trois units responsables de l'analyse syntaxique selon les trois
mthodes vues, ainsi que l'unit qui dnit les classes d'analyse.
Je ne vous en dis pas plus ici et vous laisse le soin de dcouvrir ces sources, muni du bagage
de connaissances que vous avez rassembles lors de la lecture de ce travail.
35
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Chapitre VI
Conclusion
Nous voici donc arrivs au terme de ce travail sur les analyseurs syntaxiques.
Nous avons commenc par introduire la compilation au sens gnral, et le fonctionnement
global d'un compilateur. Nous avons galement vu la notation BNF pour les grammaires.
Ensuite, nous avons commenc nous concentrer sur un module des compilateurs : l'analyse
syntaxique. Ce module qui a la responsabilit d'organiser les lexmes du texte source en un arbre
abstrait.
Nous avons aprs cela tudi en dtails les direntes techniques d'analyse syntaxique descendante. Rappelons que nous n'avons pas couvert le sujet 100 % : nous nous sommes concentrs
sur l'essentiel et n'avons pas approch les techniques avances que sont celles de la rcupration
d'erreurs par exemple.
Nous avons galement vu le principe gnral de l'analyse ascendante, mais ne nous sommes
pas intresss son comportement exact. Encore une fois, ce choix a t impos par les limites de
longueur des travaux de rhtorique, qui ont dj t largement dpasses pour ce travail. Sachez
toutefois que ce travail sera plus que probablement tendu dans le futur, et disponible sur la
page Web suivante :
http://sjrd.developpez.com/algorithmique/compilation/analyseurs-syntaxiques/
Finalement, vous avez t invit examiner un projet d'analyse syntaxique fonctionnel, utilisant les trois techniques d'analyse descendante tudies.
Vous trouverez encore en annexe A des informations sur le fonctionnement de l'analyseur
lexical qu'ont utilis nos codes exemples.
L'annexe B rappelle les dirents chiers sources exemples que vous avez t invit consulter
lors de l'tude de ce travail.
Pour la dernire fois, je renvoie encore les lecteurs non rassasis au livre Compilateurs
[GBJL02], qui est sans aucun doute la rfrence en matire de compilation.
J'espre que ce document vous aura permis de comprendre les techniques essentielles de
l'analyse syntaxique, et que vous l'aurez apprci.
36
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Annexe A
Analyseur lexical utilis
L'analyseur lexical que nous avons utilis dans nos exemples fonctionne de faon trs simple,
vu de l'extrieur. Il n'est que virtuel, et n'est pas rellement implment. Il est juste l pour
pouvoir comprendre son intgration dans l'analyseur syntaxique.
Voici donc la partie interface de l'unit virtuelle AnalyseurLexical, laquelle nous faisons
rfrence dans les analyseurs syntaxiques exemples.
unit AnalyseurLexical ;
interface
5
10
type
TLexeme = record
Lig , Col : integer ;
Classe : Char ;
Repr : string ;
end ;
procedure DemarrerAnalyseurLexical ( Entree : string );
procedure LexemeSuivant ;
15
var
CurLex : TLexeme ;
Le type TLexeme dnit les informations que contient chaque lexme. Ses deux proprits
essentielles sont Classe et Repr, puisque ce sont les deux seules qui sont strictement ncessaires
du point de vue de l'analyse. On peut mme exagrer, en supprimant la proprit Repr, puisque,
pour l'analyse syntaxique, seule la proprit Classe importe. Les proprits Lig et Col sont
prsentes uniquement an de pouvoir fournir des messages d'erreurs plus sophistiqus.
La procdure DemarrerAnalyseurLexical doit tre appele en premier. Elle reoit l'entre
analyser et analyse le premier lexme. Elle stocke les informations sur ce lexme dans la variable
CurLex.
Ensuite, pour avancer sur un lexme et analyser le suivant, il sut d'appeler la procdure
37
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
LexemeSuivant. nouveau, les donnes sur le lexme analys sont stockes dans la variable
CurLex.
Il est inutile et hors-sujet d'expliquer ici l'implmentation de cet analyseur. Si vous dsirez
plus d'informations sur l'analyse lexicale, je vous renvoie au tutoriel d'Olivier Lance [LAN04]
ainsi qu'au livre Compilateurs [GBJL02, section 2.1]. Vous pouvez aussi vous intresser au code
de l'analyseur lexical du projet de test.
38
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Annexe B
Rfrentiel des chiers sources
Ce document est accompagn de quelques chiers sources, qui servent illustrer les explications donnes. Tous ces chiers sources peuvent tre trouvs dans le dossier FTP suivant :
ftp://ftp-developpez.com/sjrd/tutoriels/compilation/analyseurs-syntaxiques/
Si vous n'avez pas la possibilit d'utiliser le FTP sur votre ordinateur, utilisez le miroir HTTP
suivant :
http://sjrd.ftp-developpez.com/tutoriels/compilation/analyseurs-syntaxiques/
Vous pouvez tlcharger chacune de ces sources sparment, selon vos intrts, ou vous pouvez
tlcharger directement l'ensemble des sources proposes au moyen de ce chier .zip :
ftp://ftp-developpez.com/sjrd/tutoriels/compilation/analyseurs-syntaxiques/sources.zip (FTP)
http://sjrd.ftp-developpez.com/tutoriels/compilation/analyseurs-syntaxiques/sources.zip (HTTP)
DescenteRecursive.pas 19
Predictif.pas 26
AutomateAPile.pas 28
39
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Glossaire
fermeture (algorithme de) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23, 23
Famille d'algorithmes caractriss par le dpart d'une petite quantit de donnes et allant
en progressant, en agrandissant ces donnes partir des donnes dj calcules, et ce jusqu'
ce que plus aucune nouvelle donne ne soit trouve.
lexme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6, 11, 14
La plus petite entit signicative de caractres dans un langage source.
non-terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Utilis dans la terminologie des grammaires ; est un groupe cohrent smantiquement de
symboles grammaticaux.
premiers (ensemble des) prem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Ensemble des lexmes par lesquels peut commencer un non-terminal, un terminal, un choix
ou une n de choix donn. Si l'lment grammatical en question est nulliable, cet ensemble
contient E .
programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4, 9
Dans ce document, nous entendons par programme un code compil excutable, autrement dit un chier .exe. Je prcise cela car on peut prendre le terme dans le sens de code
source galement.
smantique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
La smantique d'un chier est sa signication, peu importe la faon dont elle est dcrite.
En programmation, la smantique d'un programme est son comportement comportement crit au moyen d'un langage de programmation et traduit en code excutable par un
compilateur.
suivants (ensemble des) suiv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Ensemble des lexmes qui peuvent suivre directement un non-terminal donn.
symbole grammatical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
lement de base de la dnition d'une grammaire ; ses deux types sont les terminaux et les
non-terminaux.
syntagme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12, 13, 18
Sous-arbre d'un arbre abstrait dont les feuilles peuvent tre des non-terminaux. L'action de
driver un syntagme signie remplacer l'un des non-terminaux qui composent ses feuilles
par un nouveau nud dont les ls reprsentent un choix de ce non-terminal. Une drivation
d'un syntagme est le rsultat de l'application rpte zro ou plusieurs fois de cette action.
terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11, 17
Utilis dans la terminologie des grammaires, signie un lexme.
40
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Bibliographie
[BELA98] Michel
Beaudouin-Lafon,
http: // www. lri. fr/ ~mbl/ ENS/ DEUG/ cours/ 3-lexique-syntaxe. html
[GBJL02]
et
Langendoen,
41
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
15
18
19
. .
20
24
3.5 Ensembles
24
25
3.7 Ensembles
25
27
29
32
34
prem
suiv
42
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.
Index
large (compilateur) . . . . . . . . . . . . . . . . . . . . . 9
A
ambigu (grammaire) . . . . . . . . . . . . . . . . . . . . . . 13 lexme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
arbre abstrait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 LI (Langage Intermdiaire) . . . . . . . . . . . . . . . . . . 6
automate
LL(1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
pile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
non-rcursif . . . . . . . . . . . . . . . . . . . . . . . 18, 27
rcursif . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18, 26
non-terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
nulliable (non-terminal) . . . . . . . . . . . . . . . . . . . 13
choix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
CI (Code Intermdiaire). . . . . . . . . . . . . . . . . . . . . 6
P
code intermdiaire . . . . . . . . . . . . . . . . . . . . . . . . . . 6 prcalcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
conits
prem (ensemble des) . . . . . . . . . . . . . . . . . . . . . . . 22
LL(1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 production . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Conway (diagramme de) . . . . . . . . . . . . . . . . . . 13
dpart (symbole de). . . . . . . . . . . . . . . . . . . . . . . .11 rcursivit
droite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
descente rcursive
gauche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
prdictif . . . . . . . . . . . . . . . . . . . . . . . . . . . 18, 26
descente rcursive
S
non-prdictif . . . . . . . . . . . . . . . . . . . . . . . . . . 18
suiv (ensemble des) . . . . . . . . . . . . . . . . . . . . . . . . 22
inutile (non-terminal) . . . . . . . . . . . . . . . . . . . . . . 13
terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
transition (table). . . . . . . . . . . . . . . . . . . . . . . . . . .27
langage intermdaire . . . . . . . . . . . . . . . . . . . . . . . . 6
V
largeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
troit (compilateur). . . . . . . . . . . . . . . . . . . . .9 virtuelle (machine) . . . . . . . . . . . . . . . . . . . . . . . . . . 5
43
Les sources prsentes dans ce document ainsi que les descriptions d'algorithmes sont
libres de droits, et vous pouvez les utiliser votre convenance. Par contre, la page
de prsentation constitue une uvre intellectuelle protge par les droits d'auteurs.
Copyright
2006 Sbastien Doeraene. Aucune reproduction, mme partielle, ne
peut tre faite de ce document et de l'ensemble de son contenu : textes, documents,
images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi
jusqu' 3 ans de prison et jusqu' 300 000 e de dommages et intrts.