Vous êtes sur la page 1sur 7

CH3 : Analyse syntaxique

Dans ce chapitre nous allons tudier comment produire des analyseurs syntaxique pour les langages dfinis par des grammaires hors contexte. 3.1 Grammaires hors contexte Pour dcrire la syntaxe dun langage de programmation, on utilise une grammaire. Une grammaire est un ensemble de rgles dcrivant comment former des phrases. Dfinition : Une grammaire hors contexte est un quadruplet G = {VT ; VN; S0; P} o : VT est lensemble des symboles terminaux du langage. Les symboles terminaux correspondent aux mots dcouverts par lanalyseur lexical. On reprsentera les terminaux souligns pour les identifier. VN est lensemble des symboles non-terminaux du langage. Ces symboles napparaissent pas dans le langage mais dans les rgles de la grammaire dfinissant le langage, ils permettent dexprimer la structure des rgles grammaticales. S0 VN est appel llment de dpart de G (ou axiome de G). Le langage que G dcrit (not L(G)) correspond lensemble des phrases qui peuvent tre drives partir de S0 par les rgles de la grammaire. P est un ensemble de production (ou rgles de rcriture) de la forme N 12 n avec i VT U VN. Cest dire que chaque lment de P associe un non terminal une suite de terminaux et non terminaux. A titre dexemple, voici la grammaire G1 dfinissant le langage dont les chanes sont les expressions arithmtiques formes avec des nombres, des identificateurs et les deux oprateurs + et *, comme 60 * vitesse + 200 . Suivant notre convention, les symboles non terminaux sont expression, terme et facteur ; le symbole de dpart est expression : expression expression "+" terme | terme terme terme "*" facteur | facteur facteur nombre | identificateur |opt opt+ | * Drivations et arbres de drivation Drivation. Le processus par lequel une grammaire dfinit un langage sappelle drivation. Il peut tre formalis de la manire suivante : Soit G = (VT ; VN; S0; P) une grammaire non contextuelle, A VN un symbole non terminal et ( VT U VN)* une suite de symboles, tels quil existe dans P une production A . Quelles que soient les suites de symboles et on dit que A se drive en une tape en la suite ce qui scrit

A en gnrale si 0 1 2 n alors on dit que 0 se drive en n en n tapes not 0* n Soit G = {VT ; VN; S0; P} une grammaire non contextuelle ; le langage engendr par G est lensemble des chanes de symboles terminaux qui drivent de S0 :

Si L(G) on dit que est une phrase de G. Plus gnralement, si (VT U VN)* est tel que S0 * alors on dit que est une proto-phrase de G. Une proto-phrase dont tous les symboles sont terminaux est une phrase. Par exemple, soit encore la grammaire G1 : expression expression "+" terme | terme terme terme "*" facteur | facteur facteur nombre | identificateur |"(" expression ")" et considrons la chaine "60 * vitesse + 200" qui, une fois lue par lanalyseur lexical, se prsente ainsi : = ( nombre "*" identificateur "+" nombre ). Nous avons expression* , cest dire L(G1) ; en effet, nous pouvons exhiber la suite de drivations en une tape :

Drivation gauche : La drivation prcdente est appele une drivation gauche car elle est entirement compose de drivations en une tape dans lesquelles chaque fois cest le non terminal le plus gauche qui est rcrit. On peut dfinir de mme une drivation droite, o chaque tape cest le non-terminal le plus droite qui est rcrit. Arbre de drivation : Soit une chaine de symboles terminaux du langage L(G) ; il existe donc une Drivation telle que S0 * . Cette drivation peut tre reprsente graphiquement par un arbre, appel arbre de drivation, dfini de la manire suivante :

la racine de larbre est le symbole de dpart, les nuds intrieurs sont tiquets par des symboles non terminaux, si un nud intrieur e est tiquet par le symbole S et si la production S S1S2 Sk a t utilise pour driver S alors les fils de e sont des nuds tiquets, de la gauche vers la droite, par S1, S2 . . . Sk, les feuilles sont tiquetes par des symboles terminaux et, si on allonge verticalement les branches de Larbre (sans les croiser) de telle manire que les feuilles soient toutes la mme hauteur, alors, lues de la gauche vers la droite, elles constituent la chaine . Qualit dune grammaire Grammaires ambiges : Une grammaire est ambige sil existe plusieurs drivations gauches diffrentes pour une mme chaine de terminaux. Par exemple, la grammaire G2 suivante est ambige :

En effet, la Grammaire ci-dessus (G2) montre deux arbres de drivation distincts pour la chaine "2 * 3 + 10". Ils correspondent aux deux drivations gauches distinctes :

Grammaires quivalentes : Deux grammaires sont dites quivalentes si elles engendrent le mme langage. Il est souvent possible de remplacer une grammaire ambige par une grammaire non ambige quivalente, mais il ny a pas une mthode gnrale pour cela. Par exemple, la grammaire G1 est non ambige et quivalente la grammaire G2 ci-dessus. Grammaires rcursives gauche : une grammaire est rcursive gauche sil existe un nonterminal A et une drivation de la forme A*A, o est une chaine quelconque. Cas particulier, on dit quon a une rcursivit gauche simple si la grammaire possde une production de la forme AA. La rcursivit gauche ne rend pas une grammaire ambige, mais empche lcriture danalyseurs pour cette grammaire. Par exemple, la grammaire G1 de la section 1 est rcursive gauche, et mme simplement : Il existe une mthode pour obtenir une grammaire non rcursive gauche quivalente une grammaire donne. Dans le cas de la rcursivit gauche simple, cela consiste remplacer une production telle que Par les deux productions :

En appliquant ce procd la grammaire G1 on obtient la grammaire G3 suivante :

A propos des productions. La transformation de grammaire montre ci-dessus a introduit des productions avec un membre droit vide, ou -productions. Si on ne prend pas de disposition particulire, on aura un probl me pour lecriture dun analyseur, puisquune production telle que

qui est possible quelle que soit la chaine dentre ; ainsi, notre grammaire semble devenir ambige. On rsout ce problme en imposant aux analyseurs que nous crirons la rgle de comportement suivante : dans la drivation dun non-terminal, une -production ne peut re choisie que lorsquaucune autre production nest applicable. Dans lexemple prcdent, cela donne : si la chaine dentre commence par + alors on doit ncessairement choisir la premire production. Factorisation gauche : nous cherchons crire des analyseurs prdictifs. Cela veut dire qu tout moment le choix entre productions qui ont le mme membre gauche doit pouvoir se faire, sans risque derreur, en comparant le symbole courant de la chaine analyser avec les symboles susceptibles de commencer les drivations des membres droits des productions en comptition. Une grammaire contenant des productions comme

viole ce principe car lorsquil faut choisir entre les productions A1 et A2 le symbole courant est un de ceux qui peuvent commencer une drivation de , et on ne peut pas choisir `a coup sur entre A1 et A2. Une transformation simple, appele factorisation gauche, corrige ce dfaut (si les symboles susceptibles de commencer une rcriture de 1 sont distincts de ceux pouvant commencer une rcriture de 2) :