Analyse syntaxique ascendante. De Comité L3 Miage A C 16 mai 2011 Idée Reconstruire l arbre à partir des feuilles. Réduire une chaîne terminale w à l axiome de départ, par une suite de réductions successives de sous-chaînes en non-terminaux. * * * * E * * Grammaire de l exemple précédent expr expr + terme (1) expr terme (2) terme terme facteur (3) terme facteur (4) facteur (expr) (5) facteur (6)
Remarques Pourquoi avoir choisi de réduire à la troisième étape et pas? Une réduction est l inverse d une dérivation. La suite des réductions se lit de droite à gauche comme une dérivation. Repérer une partie droite de règle, et la remplacer par le non-terminal de la partie gauche. Problèmes Comment reconnaître une partie droite de règle? Que faire dans le cas où plusieurs règles sont applicables pour une même partie droite? Comment savoir si la chaîne consérée est une partie droite de règle, ou bien s il faut attendre d en avoir une plus longue correspondant à une autre règle? Proto-phrase Définition (Proto-phrase) Une proto-phrase est une chaîne, pouvant contenir des terminaux et des non-terminaux, obtenue par dérivations de l axiome. Définition (Proto-phrase droite) Une proto-phrase droite est une proto-phrase obtenue à partir de l axiome en n utilisant que des dérivations droites. Manche Définition Un manche est une sous-chaîne reconnue par une partie droite de règle, la réduction de cette sous-chaîne constituant une étape de la construction d une dérivation droite. Plus formellement Si S αaw αβw, alors A β, dans la position α, est un manche de αβw (remplacer β par A fournit une proto-phrase droite). Remarques Si αβw est une proto-phrase droite, alors w ne contient que des symbole terminaux. Si une grammaire est non ambiguë, alors toute proto-phrase droite a un manche et un seul.
Elagage des manches général Si w est une chaîne terminale engendrée par une grammaire donnée, soit la suite de dérivations droites : S γ 0 γ 1 γ n 1 γ n = w Repérer le manche β n dans γ n Remplacer β n par A n (application de la règle A n β n ) Recommencer avec γ n 1 etc... On ne sait toujours pas comment repérer les manches Analyse syntaxique par décalage-réduction On utilise une pile qui mémorise les chaînes en attente (construction des manches). Le symbole $ marque à la fois la fin de chaîne à analyser w et le fond de la pile. On lit la chaîne à analyser de la gauche vers la droite. Au départ, la pile contient $, et on pointe sur le premier caractère de la chaîne w. En parcourant w de gauche à droite, on décale des symboles depuis w vers la pile, jusqu à ce qu on entifie un manche. Lorsque le manche est entifié, on le remplace sur la pile par la partie gauche de la règle. Pile Entrée Action $ 1 2 $ décaler $ 1 2 $ réduire par $ 2 $ réduire par $ 2 $ décaler $ 2 $ décaler $ 2 $ réduire par $ $ réduire par $ $ réduire par E $E $ accepter Actions possibles Liste des actions 1 Décaler : prendre le symbole en cours de lecture et le mettre au sommet de la pile. 2 Réduire : trouver le manche (forcément en sommet de pile), et le remplacer par la partie gauche de la règle correspondante. 3 Accepter : annoncer le succès de l analyse syntaxique (la pile contient l axiome, et il n y a plus de symbole en entrée). 4 Erreur : quand aucune des trois actions précédentes ne s applique.
Une propriété intéressante Le manche apparaît toujours en sommet de pile, et jamais à l intérieur. S S A B B A α β ɣ y z α ɣ x y z cas 1 cas 2 Une propriété intéressante Cas 1 S αaz αβbyz αβγyz Pile Entrée Action $αβγ yz$ réduire γ $αβb yz$ décaler y (qui ne contient pas de non-terminaux) $αβby z$ réduire βγy $αa z$... une propriété intéressante Cas 2 Pile Entrée Action $αγ xyz$ réduire γ $αb xyz$ décaler $αbxy z$ réduire y $αbxa z$... Le manche est toujours au sommet de la pile...... mais on ne sait toujours pas comment l entifier simplement. Restrictions L analyse syntaxique par décalage/réduction ne marche pas pour toutes les grammaires. On peut se retrouver dans une situation où on ne sait pas s il faut réduire ou décaler : conflit décalage/réduction.... ou dans une situation où on ne sait pas quelle réduction appliquer : conflit réduction/réduction.
Définitions Définition (Grammaires LR(1)) Grammaires pour lesquelles on peut régler les conflits en connaissant le symbole courant en entrée. Lecture de la chaîne de gauche à droite : Left to right Construction d une dérivation droite : Rightmost derivation Un caractère en pré-vision permet de régler d éventuels conflits. Définition (Grammaires LR(k)) Grammaires pour lesquelles on peut régler les conflits en connaissant les k prochains symboles en entrée. De bonnes grammaires Remarques Une grammaire ambiguë n est pas LR(k). Il existe des grammaires non ambiguës qui ne sont pas LR(k). La plupart des grammaires des langages de programmation sont LR(1). Dans le cas des grammaires ambiguës, on peut parfois guer l analyse en indiquant comment régler le conflit. Construire des analyseurs syntaxiques ascendants Propriétés des analyseurs LR Analyseurs gués par des tables (comme les LL) Doivent pouvoir repérer les manches dans une pile. Analyse sans retour en arrière. Plus puissants que les analyseurs LL. Difficiles à construire à la main...... mais il existe des algorithmes pour les construire! Les items et l automate LR(0) Un analyseur par décalage-réduction mémorise où il en est de l analyse syntaxique. Pour cela, il utilise des items. Un item est une règle de production de la grammaire, où on a intercalé un point dans sa partie droite, indiquant où on est de l analyse de cette règle. Si A XYZ est une règle de G, alors les items correspondants sont : A.XYZ A X.YZ A XY.Z A XYZ.
Les items Les items A.XYZ : on commence l analyse de la règle, et on espère trouver une chaîne correspondant à une dérivation de XYZ A X.YZ : on a déjà entifié une sous-chaîne dérivant de X, on recherche une dérivation correspondant à YZ A XYZ. : on a trouvé une chaîne correspondant à l application de cette règle. La règle A ɛ n engendre qu un item : A. L automate LR(0) Construction de l automate Construire des ensembles d items : fonction ermeture(). Relier ces ensembles par des transitions : fonction Aller A() Définition (ermeture(i)) Si A α.bβ est dans ermeture(i), et si B γ est une production, alors ajouter l item B.γ dans ermeture(i). Définition (Aller A(I,X)) Aller A(I,X) est la ermeture de l ensemble des items de la forme A αx.β tels que A α.x β est dans I. La fonction Aller A définit les transitions entre les ensembles d items, qui sont les états de l automate. Exercice / illustration Construction de l automate LR(0) pour la grammaire des expressions expr expr + terme expr terme terme terme facteur terme facteur facteur (expr) facteur Utilisation de l automate LR(0) Utiliser l automate des items. Etat initial : ermeture([s.s]) Curseur sur le caractère courant de la chaîne terminale (a). S il existe une flèche étiquetée par a, décaler (empiler l état, bouger le curseur). Sinon, réduire (appliquer la règle, dépiler n symboles, changer d état). Illustration Dérouler
Construction des tables d analyse L algorithme doit être formalisé pour pouvoir être programmé : on utilise des tables d analyse, comme pour les grammaires LL. Les actions et transitions se déduisent facilement de l automate. Actions Si on est dans l état i correspondant à [A α.aβ], et qu il existe une transition étiquetée a sortant de cet état, alors Action(i, a) = décaler j, où j est le numéro de l état où mène cette transition. Si on est dans l état i correspondant à [A α.], alors Action(i, a) = réduire A α pour tout a dans Suivant(A), sauf S Si l état est [S S.], alors Action(i, $) = accepter