2.2.1 Grammaires LL(k)

Documents pareils
Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Théorie des Langages

Continuité et dérivabilité d une fonction

Résolution de systèmes linéaires par des méthodes directes

1 Première section: La construction générale

CH.6 Propriétés des langages non contextuels

Quelques algorithmes simples dont l analyse n est pas si simple

Compilation. Algorithmes d'analyse syntaxique

Programmation linéaire

Exercices - Polynômes : corrigé. Opérations sur les polynômes

Programmation Par Contraintes

Continuité en un point

Représentation d un entier en base b

Organigramme / Algorigramme Dossier élève 1 SI

CHAPITRE VIII : Les circuits avec résistances ohmiques

L exclusion mutuelle distribuée

Algèbre binaire et Circuits logiques ( )

Cours d Analyse. Fonctions de plusieurs variables

Fonctions de deux variables. Mai 2011

Probabilités sur un univers fini

Pour l épreuve d algèbre, les calculatrices sont interdites.

Comparaison de fonctions Développements limités. Chapitre 10

Intégration et probabilités TD1 Espaces mesurés Corrigé

CONJUGUÉ D'UN POINT PAR RAPPORT À UN TRIANGLE

Procédure de sauvegarde pour AB Magique

FONCTIONS DE PLUSIEURS VARIABLES (Outils Mathématiques 4)

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

Limitations of the Playstation 3 for High Performance Cluster Computing

Chapitre 2. Matrices

Algorithmique et Programmation, IMA

Chp. 4. Minimisation d une fonction d une variable

Machines virtuelles Cours 1 : Introduction

TSTI 2D CH X : Exemples de lois à densité 1

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Initiation à l algorithmique

Sujet proposé par Yves M. LEROY. Cet examen se compose d un exercice et de deux problèmes. Ces trois parties sont indépendantes.

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Limites finies en un point

Chapitre 3. Quelques fonctions usuelles. 1 Fonctions logarithme et exponentielle. 1.1 La fonction logarithme

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

* très facile ** facile *** difficulté moyenne **** difficile ***** très difficile I : Incontournable T : pour travailler et mémoriser le cours

Activités numériques [13 Points]

LES GENERATEURS DE NOMBRES ALEATOIRES

Exercice 1 Trouver l équation du plan tangent pour chaque surface ci-dessous, au point (x 0,y 0,z 0 ) donné :

Programmation Linéaire - Cours 1

Optimisation des fonctions de plusieurs variables

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

Étude des formes de pratiques de la gymnastique sportive enseignées en EPS à l école primaire

LE PROCESSUS ( la machine) la fonction f. ( On lit : «fonction f qui à x associe f (x)» )

Les BRMS Business Rules Management System. Groupe GENITECH

Intégration et probabilités TD1 Espaces mesurés

Structures algébriques

La fonction exponentielle

Probabilités sur un univers fini

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Maintenabilité d un parc applicatif

Corrigé des TD 1 à 5

Cours 9. Régimes du transistor MOS

La maison Ecole d ' Amortissement d un emprunt Classe de terminale ES. Ce qui est demandé. Les étapes du travail

Exo7. Matrice d une application linéaire. Corrections d Arnaud Bodin.

Image d un intervalle par une fonction continue

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Fonctions homographiques

Jeux de caracte res et encodage (par Michel Michaud 2014)

Équations non linéaires

Comment créer un nouveau compte? 1/2- Pour le consommateur

ARBRES BINAIRES DE RECHERCHE

ELEC2753 Electrotechnique examen du 11/06/2012

Introduction à l étude des Corps Finis

VMware ESX : Installation. Hervé Chaudret RSI - Délégation Centre Poitou-Charentes

Processus d Informatisation

PEUT-ON «VOIR» DANS L ESPACE À N DIMENSIONS?

Optimisation non linéaire Irène Charon, Olivier Hudry École nationale supérieure des télécommunications

Mesure. Multimètre écologique J2. Réf : Français p 1. Version : 0110

Exo7. Limites de fonctions. 1 Théorie. 2 Calculs

Contexte. Pour cela, elles doivent être très compliquées, c est-à-dire elles doivent être très différentes des fonctions simples,

Introduction à MATLAB R

DÉRIVÉES. I Nombre dérivé - Tangente. Exercice 01 (voir réponses et correction) ( voir animation )

Exercices - Fonctions de plusieurs variables : corrigé. Pour commencer

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Nouvelles propositions pour la résolution exacte du sac à dos multi-objectif unidimensionnel en variables binaires

Exercices - Nombres complexes : corrigé. Formes algébriques et trigonométriques, module et argument

Filtres maîtres et distribués ADSL

La conversion de données : Convertisseur Analogique Numérique (CAN) Convertisseur Numérique Analogique (CNA)

Méthodes de quadrature. Polytech Paris-UPMC. - p. 1/48

Optimisation Discrète

Fiche PanaMaths Calculs avec les fonctions sous Xcas

Séminaire TEST. 1 Présentation du sujet. October 18th, 2013

Correction TD algorithmique

Chapitre 7. Récurrences

Utilisation des tableaux sémantiques dans les logiques de description

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

La NP-complétude. Johanne Cohen. PRISM/CNRS, Versailles, France.

Croissance et vieillissement cellulaires Docteur COSSON Pierre Nb réponses = 81 sur 87. Résultats des questions prédéfinies

Résolution d équations non linéaires

Proposition. Si G est un groupe simple d ordre 60 alors G est isomorphe à A 5.

Cours d Informatique

Problèmes de Mathématiques Filtres et ultrafiltres

N.B : L explorateur vivement conseillé pour utiliser le service d inscription est Firefox. Accessible à :

Techniques de Lyapunov en contrôle quantique pour le couplage dipolaire et polarisabilité

Transcription:

2.2.1 Grammaires LL(k) Le non-déterminisme dans les analyses descendantes vient du fait que, étant donné un non-terminal A à dériver, on a le choix entre toutes les parties droites des règles A β. On a vu que si β commence par un terminal, une décision sur la productivité de la dérivation peut être prise immédiatement (en comparant ce terminal à la chaîne à reconnaître). Mais si β commence par un non-terminal, il n est pas facile de trouver comment prendre une bonne décision. L idée des grammaires LL(k) est de construire, à partir de la grammaire initiale (sans la modifier), une table de prédiction : étant donné le non-terminal à dériver, et le symbole courant du mot à reconnaître, cette table donne les parties droites susceptibles de donner finalement le symbole à reconnaître. S il n y a qu une dérivation possible dans chaque cas (au plus), la grammaire est dite LL(1). Si on peut construire une table où il n y a qu une dérivation possible en regardant 2 caractères, la grammaire est dite LL(2). Pourquoi ce nom LL(k)? Parce que ces grammaires permettent directement de mettre en œuvre des analyseurs construisant de manière déterministe de gauche à droite (left-to-right) des dérivations gauches (left) avec un regard avant (look-ahead) de k symboles. (SLL(1) désigne les grammaires simples de cette famille.) 2.2.1.1 Tables de prédiction Exemple LL(1) Comme premier exemple de table de prédiction (ou d analyse prédictive), considérons le cas de la grammaire suivante, qui est (presque) sous forme de Greibach S asb; S cc ; C dc ; C c. La table représente, pour chaque non-terminal à dériver, pour chaque lettre du mot à apparier, la (ou les) règle(s) de dérivation à appliquer. S asb cc Exemple LL(1) (non Greibach) Cette grammaire n est pas sous forme de Greibach, ce qui ne l empêche pas d être LL(1) : S asb; S CC ; S b; C dc ; C c. Langage engendré : a n (d cd c b)b n. La table, qu on peut facilement construire à la main en regardant la grammaire (même si pour être sûr de ne pas faire d erreur, il vaut mieux vérifier avec l algorithme qu on va voir ensuite), montre bien que la grammaire est LL(1). S asb b CC CC Dans ces deux exemples, il y a au plus une dérivation par case (les cases vides correspondent à des cas d erreur), il est donc possible de décider quelle dérivation appliquer en considérant 1 caractère de la chaîne à produire, ces grammaires sont LL(1). Soit le mot aacddcbb, on peut vérifier facilement que l analyse avec la première grammaire sur la base de la table donne une décision unique à chaque étape : l arbre d exploration n a 12

qu une branche, et l analyse est linéaire : voir figure 2.12. Figure 2.12 Arbre d exploration pour le mot aacddcbb et la grammaire S asb; S cc ; C dc ; C c (S, aacddcbb) (asb, aacddcbb) (Sb, acddcbb) (asbb, acddcbb) (Sbb, cddcbb) (ccbb, cddcbb) (Cbb, ddcbb) (dcbb, ddcbb) (Cbb,dcbb) (dcbb, dcbb) (Cbb,cbb) (cbb,cbb) (ε,ε) Analogie avec l automate : si on se souvient que la correspondance entre automates et grammaires passe par la correspondance entre états et non terminaux, on voit que la table construite ici ressemble beaucoup à la table de transition d un automate... Ce n est bien sûr pas fortuit... Exemple LL(2) Avec la grammaire suivante, il y a une case qui contient deux règles. S asb; S ab; S cc ; C dc ; C c. S asb cc ab On peut s intéresser à la table de prédiction considérant 2 caractères en avant. Dans ce cas, il faut aussi prendre en considération le fait que l on peut se trouver dans une situation où il ne reste plus qu un seul caractère à produire : ces cas sont représentés par la notation $ qui correspond à la fin du mot. aa ab ac cc cd c$ dc dd cb S asb ab asb cc cc dc c Il y a au plus une dérivation par case : on dira que la grammaire est LL(2). 2.2.1.2 Construction d une table LL(1) Dans les deux exemples précédents, la table était très facile à construire, grâce au fait que les parties droites de règles commençaient (presque) toujours par un terminal. Cependant, il est possible de construire la table de prédiction pour n importe quelle grammaire (quitte à ce qu il y ait plusieurs règles dans certaines cases). Comment procéder? Intuitivement, il faut mettre en œuvre la récursivité de la grammaire : il y a bien des règles qui produisent des terminaux à gauche de leur partie droite (la grammaire est non 13

récursive gauche par hypothèse) soit par exemple C aα ; alors je peux considérer comme pertinente pour produire un a les règles qui sont de la forme D Cβ. Cette observation nous met sur la voie d une méthode récursive de construction de la table LL, qui passe par la construction de deux ensembles associés à chaque symbole : premier() et suivant() (first et follow). premier() est défini pour tout symbole de la grammaire, terminal ou non terminal, et par extension, il peut être défini pour tout mot sur (X V), et donc en particulier pour toute partie droite de règle. Pour α (X V), premier(α) = {a X / α au} Intuitivement, cette fonction associe à tout proto-mot son «coin gauche» : le premier terminal du proto-mot dérivé. Si le proto-mot commence par un terminal, c est trivial, sinon, il faut regarder comment le non terminal finit par se réécrire (il peut y avoir plusieurs étapes, mais si la grammaire est non récursive gauche, ça doit se terminer). Une fois identifié, ce coin gauche ne peut pas changer (avec une grammaire algébrique : les terminaux ne sont jamais effacés ou déplacés). suivant() est défini seulement pour les non terminaux de la grammaire : il s agit du premier symbole qui peut suivre le mot produit par le non terminal. Pour A V, suivant(a) = {a X / S αaaβ} Par convention, on introduit la notation $ pour représenter le fait que la fin du mot peut suivre un non terminal donné. L algorithme de construction d une table LL(1) commence par le calcul de ces deux ensembles, qui en pratique doivent être calculés pour chaque non terminal (dans les autres cas, premier() est trivial, et suivant() n a pas besoin d être calculé). Le calcul des premier() se fait avec un algorithme de point fixe. Il faut réitérer la manœuvre suivante (donc pour chaque non terminal) jusqu à ce qu aucun changement ne soit enregistré. Pour chaque non terminal A : Pour chaque règle A α : Si α = ε, ajouter {ε} à prem(a) Sinon (alors α = A 1 A 2...A k ) : i = 0 répeter : i = i+1 ajouter prem(a i )\{ε} à prem(a) tant que i k et ε prem(a i ) si i = k et ε prem(a i ) : ajouter {ε} à prem(a) N.B. ce calcul nous donne la valeur de prem() pour n importe quel A V, il peut être facilement généralisé, avec les mêmes précautions concernant la présence d ε dans les prem(), et en supposant que si x X, prem(x) = {x}, au calcul de prem(β) pour tout β (X V). Le calcul de suiv() utilise le résultat de prem(). L algorithme consiste aussi à réitérér le calcul suivant (pour chaque règle) jusqu au point fixe : 14

Mettre $ dans suiv(s) Pour chaque règle A A 1 A 2...A k : Pour chaque A i (i [1,k[) : ajouter prem(a i+1 )\{ε} à suiv(a i ) Ajouter suiv(a) à suiv(a k ) j = k tant que ε prem(a j ) (et j 0) : ajouter suiv(a) à suiv(a j 1 ) j = j 1 Table LL(1) Une fois les deux ensembles (fonctions) prem() et suiv() construites, on peut construire la table LL(1) : 1. Pour la règle n o i de la forme A α : (a) Pour tout a premier(α), ajouter i à la case (A, a). (b) Si ε premier(α), ajouter i à la case (A, b) pour chaque b suivant(a). Si ε premier(α) et $ suivant(a), ajouter i à la case (A, $). 2. Marquer erreur dans toutes les cases restées vides. Voir aussi la figure 2.13 pour une autre formulation des mêmes algorithmes. 2.2.1.3 Conclusion Analyse LL(1) Il devient très facile, ainsi équipé d une table de prédiction, de formuler un algorithme de parsing descendant : cet algorithme est d une complexité linéaire, puisque chaque symbole terminal mène à une décision unique et non remise en cause. L implémentation d un tel algorithme est laissée en exercice (il faut évidemment aussi envisager une implémentation de la construction de la table...) LL1-isation Les grammaires LL(1) sont particulièrement coopératives, mais malheureusement on sait que toutes les grammaires algébriques ne sont pas équivalentes à une grammaire LL(1). Il est cependant intéressant d évoquer la ou les méthodes que l on peut utiliser pour se rapprocher d une grammaire LL(1). La première méthode consiste à supprimer les récursions gauches, ce qui est fait implicitement dans le processus de mise sous forme normale de Greibach (on a vu l algo indépendamment); une seconde transformation utile consiste à faire une factorisation gauche de la grammaire. Grammaires LL(k) Mais si ça facilite la construction de la table et peut dans certains cas augmenter le déterminisme, il reste souvent des cases contenant plusieurs règles, et donc des facteurs d indétermination. Dans ce cas, il reste la possibilité de construire des tables de prédiction en augmentant le regard en avant (cf exemple du début de la section). Il faut noter que cette généralisation, d une part augmente la complexité du pré-traitement de la grammaire, et d autre part (surtout), ne permet pas de traiter toutes les grammaires. C est évident pour les grammaires ambigües, mais c est aussi le cas pour 15

Figure 2.13 Autres versions des algos prem/suiv/ll Algorithme de construction de la table LL Pour α (X V), premier(α) = {a X / α au} Pour A V, suivant(a) = {a X / S αaaβ} Calcul de premier(a) Réitérer jusqu au point fixe : 1. Si A X, premier(a) = {A}. 2. Si A ε P, ajouter ε à premier(a). 3. Pour les règles A Y 1...Y k : (a) Ajouter les symboles de premier(y 1 ) dans premier(a); (b) S il existe un intervalle [1..l] tel que i [1..l], ε premier(y i ), ajouter à premier(a) tous les symboles des premier(y i ) pour i [1..l+1]. (c) Si k = l (ie ε appartient à tous les premier(y i )), alors ajouter ε à premier(a). Par extention (avec les mêmes précautions concernant ε), on peut calculer premier(β) pour tout β (X V). Calcul de suivant() Réitérer jusqu au point fixe : 1. Mettre $ dans suivant(s). 2. Si A αbβ, le contenu de premier(β) (sauf ε) est ajouté à suivant(b). 3. S il existe une règle A αb (ou une règle A αbβ, avec ε premier(β)), les éléments de suivant(a) sont ajoutés à suivant(b). Construction de la table LL(1) 1. Pour la règle n o i de la forme A α : (a) Pour tout a premier(α), ajouter i à la case (A,a). (b) Si ε premier(α), ajouter i à la case (A,b) pour chaque b suivant(a). Si ε premier(α) et $ suivant(a), ajouter i à la case (A,$). 2. Marquer erreur dans toutes les cases restées vides. d autres grammaires, non ambigües, dont on a pu montrer qu aucun regard en avant de taille bornée ne permettra une analyse descendante déterministe. Encore un point à noter : les grammaires LL(k) forment des familles imbriquées strictement les unes dans les autres, pour tout k. 16