Langages de programmation et compilation



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

Théorie des Langages

Cours 1 : La compilation

Compilation. Algorithmes d'analyse syntaxique

Recherche dans un tableau

Cours de Programmation 2

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Initiation à la Programmation en Logique avec SISCtus Prolog

LES OUTILS D ALIMENTATION DU REFERENTIEL DE DB-MAIN

Traduction des Langages : Le Compilateur Micro Java

Arbres binaires de recherche

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

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

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

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

Génie Logiciel avec Ada. 4 février 2013

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Limites finies en un point

Vérification de programmes et de preuves Première partie. décrire des algorithmes

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

Image d un intervalle par une fonction continue

Initiation à l algorithmique

Classes et Objets en Ocaml.

Exercice autour de densité, fonction de répatition, espérance et variance de variables quelconques.

Analyse de sécurité de logiciels système par typage statique

Fiche PanaMaths Calculs avec les fonctions sous Xcas

Formula Negator, Outil de négation de formule.

Encryptions, compression et partitionnement des données

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

ARBRES BINAIRES DE RECHERCHE

Compilation (INF 564)

Informatique Théorique : Théorie des Langages, Analyse Lexicale, Analyse Syntaxique Jean-Pierre Jouannaud Professeur

Algorithmique et Programmation, IMA

TP 1. Prise en main du langage Python

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

modules & compilation

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

Les structures de données. Rajae El Ouazzani

III- Raisonnement par récurrence

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Théorie de la Programmation

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

Algorithmes d'apprentissage

STAGE IREM 0- Premiers pas en Python

De même, le périmètre P d un cercle de rayon 1 vaut P = 2π (par définition de π). Mais, on peut démontrer (difficilement!) que

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TP1 : Initiation à Java et Eclipse

Gestion mémoire et Représentation intermédiaire

Les algorithmes de base du graphisme

Grammaires d unification

Évaluation et implémentation des langages

Université Paris-Dauphine DUMI2E 1ère année, Applications

Cours d initiation à la programmation en C++ Johann Cuenin

LES TYPES DE DONNÉES DU LANGAGE PASCAL

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

Utilisation des tableaux sémantiques dans les logiques de description

Continuité et dérivabilité d une fonction

Java Licence Professionnelle CISII,

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Théorie de la Mesure et Intégration

Bases de programmation. Cours 5. Structurer les données

Chapitre 2 Le problème de l unicité des solutions

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Processus aléatoires avec application en finance

Introduction à l étude des Corps Finis

Développement décimal d un réel

Vérification formelle de la plate-forme Java Card

Construction d un cercle tangent à deux cercles donnés.

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Hedging delta et gamma neutre d un option digitale

Cours de Programmation en Langage Synchrone SIGNAL. Bernard HOUSSAIS IRISA. Équipe ESPRESSO

Utilisation d objets : String et ArrayList

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Axiomatique de N, construction de Z

I. Polynômes de Tchebychev

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Jeux sous forme extensive (Jeux dynamiques)

F. Barthélemy. 17 mai 2005

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

IV- Comment fonctionne un ordinateur?

Structurer ses données : les tableaux. Introduction à la programmation

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

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

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Maple: premiers calculs et premières applications

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

Aide : publication de décisions VS

J AUVRAY Systèmes Electroniques TRANSMISSION DES SIGNAUX NUMERIQUES : SIGNAUX EN BANDE DE BASE

Cours 1 : Qu est-ce que la programmation?

«Dire et écrire» pour réaliser une composition en travail collaboratif en géographie. Agnès Dullin, lycée J. Racine 20 rue du Rocher, Paris

Cours Programmation Système

Fonctions de plusieurs variables, intégrales multiples, et intégrales dépendant d un paramètre

Transcription:

École Normale Supérieure Langages de programmation et compilation Jean-Christophe Filliâtre Cours 6 / 9 novembre 2015 Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 1

petite devinette quel point commun? Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 2

analyse syntaxique l objectif de l analyse syntaxique est de reconnaître les phrases appartenant à la syntaxe du langage son entrée est le flot des lexèmes construits par l analyse lexicale, sa sortie est un arbre de syntaxe abstraite Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 3

analyse syntaxique suite de lexèmes fun x -> ( x + 1 ) analyse syntaxique syntaxe abstraite Fun "x" App Op + App Var "x" Const 1 Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 4

erreurs de syntaxe en particulier, l analyse syntaxique doit détecter les erreurs de syntaxe et les localiser précisément les identifier (le plus souvent seulement erreur de syntaxe mais aussi parenthèse non fermée, etc.) voire, reprendre l analyse pour découvrir de nouvelles erreurs Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 5

quels outils pour l analyse syntaxique, on va utiliser une grammaire non contextuelle pour décrire la syntaxe un automate à pile pour la reconnaître c est l analogue des expressions régulières / automates finis utilisés dans l analyse lexicale Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 6

grammaire non contextuelle Définition Une grammaire non contextuelle (ou hors contexte) est un quadruplet (N, T, S, R) où N est un ensemble fini de symboles non terminaux T est un ensemble fini de symboles terminaux S N est le symbole de départ (dit axiome) R N (N T ) est un ensemble fini de règles de production Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 7

exemple : expressions arithmétiques N = {E}, T = {+, *, (, ), int}, S = E, et R = { (E, E+E), (E, E*E), (E, (E)), (E, int) } en pratique on note les règles sous la forme E E + E E * E ( E ) int les terminaux de la grammaire seront les lexèmes produits par l analyse lexicale int désigne ici le lexème correspondant à une constante entière (i.e. sa nature, pas sa valeur) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 8

dérivation Définition Un mot u (N T ) se dérive en un mot v (N T ), et on note u v, s il existe une décomposition avec X N, X β R et u = u 1 Xu 2 v = u 1 βu 2 exemple : E * ( } {{ } u 1 E }{{} X ) }{{} u 2 β E * ( E } {{ + E} ) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 9

dérivation une suite w 1 w 2 w n est appelée une dérivation on parle de dérivation gauche (resp. droite) si le non terminal réduit est systématiquement le plus à gauche i.e. u 1 T (resp. le plus à droite i.e. u 2 T ) on note la clôture réflexive transitive de Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 10

exemple E E * E int * E int * ( E ) int * ( E + E ) int * ( int + E ) int * ( int + int ) en particulier E int * ( int + int ) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 11

langage Définition Le langage défini par une grammaire non contextuelle G = (N, T, S, R) est l ensemble des mots de T dérivés de l axiome, i.e. L(G) = { w T S w } dans notre exemple int * ( int + int ) L(G) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 12

arbre de dérivation Définition À toute dérivation S w, on peut associer un arbre de dérivation, dont les nœuds sont étiquetés ainsi la racine est S les feuilles forment le mot w dans l ordre infixe tout nœud interne X est un non terminal dont les fils sont étiquetés par β (N T ) avec X β une règle de la dérivation attention : ce n est pas la même chose que l arbre de syntaxe abstraite Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 13

exemple la dérivation gauche E E + E int + E int + E * E int + int * E int + int * int donne l arbre de dérivation mais la dérivation droite E E + E int E int * E int E E + E E + E * E E + E * int E + int * int int + int * int également Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 14

ambiguïté Définition Une grammaire est dite ambiguë si un mot au moins admet plusieurs arbres de dérivation exemple : le mot int + int * int admet les deux arbres de dérivations E E + E int E int * E int E E * E E int + E int int Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 15

grammaire non ambiguë pour ce langage-là, il est néanmoins possible de proposer une autre grammaire, non ambiguë, qui définit le même langage E E + T T T T * F F F ( E ) int cette nouvelle grammaire traduit la priorité de la multiplication sur l addition, et le choix d une associativité à gauche pour ces deux opérations Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 16

grammaire non ambiguë ainsi, le mot int + int * int * int n a plus qu un seul arbre de dérivation, à savoir E T F int T F E int correspondant à la dérivation gauche + T T * F int * F int E E + T T + T F + T int + T int + T * F int + T * F * F int + F * F * F int + int * F * F int + int * int * F int + int * int * int Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 17

résultat négatif déterminer si une grammaire est ou non ambiguë n est pas décidable (rappel : décidable veut dire qu on peut écrire un programme qui, pour toute entrée, termine et répond oui ou non) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 18

approche on va utiliser des critères décidables suffisants pour garantir qu une grammaire est non ambiguë, et pour lesquels on sait en outre décider l appartenance au langage efficacement (avec un automate à pile déterministe) les classes de grammaires définies par ces critères s appellent LL(1), LR(0), SLR(1), LALR(1), LR(1), etc. Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 19

analyse descendante Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 20

idée générale idée : procéder par expansions successives du non terminal le plus à gauche (on construit donc une dérivation gauche) en partant de S et en se servant d une table indiquant, pour un non terminal X à expanser et les k premiers caractères de l entrée, l expansion X β à effectuer (en anglais on parle de top-down parsing) supposons k = 1 par la suite et notons T (X, c) cette table en pratique on suppose qu un symbole terminal # dénote la fin de l entrée, et la table indique donc également l expansion de X lorsque l on atteint la fin de l entrée Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 21

fonctionnement de l analyse on utilise une pile qui est un mot de (N T ) ; initialement la pile est réduite au symbole de départ à chaque instant, on examine le sommet de la pile et le premier caractère c de l entrée si la pile est vide, on s arrête ; il y a succès si et seulement si c est # si le sommet de la pile est un terminal a, alors a doit être égal à c, on dépile a et on consomme c ; sinon on échoue si le sommet de la pile est un non terminal X, alors on remplace X par le mot β = T (X, c) en sommet de pile, le cas échéant, en empilant les caractères de β en partant du dernier ; sinon, on échoue Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 22

exemple transformons encore la grammaire des expressions arithmétiques et considérons la table d expansion suivante E T E E + T E ɛ T F T T * F T ɛ F ( E ) int + * ( ) int # E TE TE E +TE ɛ ɛ T FT FT T ɛ *FT ɛ ɛ F (E) int (on verra plus loin comment construire cette table) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 23

exemple illustrons l analyse descendante du mot int + int * int + * ( ) int # E TE TE E +TE ɛ ɛ T FT FT T ɛ *FT ɛ ɛ F (E) int pile E E T E T F E T int E T E E T + E T E T F E T int E T E T F * E T F E T int E T # E # ɛ # entrée int+int*int# int+int*int# int+int*int# int+int*int# +int*int# +int*int# +int*int# int*int# int*int# int*int# *int# *int# int# int# Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 24

programmation d un analyseur descendant un analyseur descendant se programme très facilement en introduisant une fonction pour chaque non terminal de la grammaire chaque fonction examine l entrée et, selon le cas, la consomme ou appelle récursivement les fonctions correspondant à d autres non terminaux, selon la table d expansion Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 25

programmation d un analyseur descendant faisons le choix d une programmation purement applicative, où l entrée est une liste de lexèmes du type type token = Tplus Tmult Tleft Tright Tint Teof on va donc construire cinq fonctions qui consomment la liste d entrée val e : token list -> token list val e : token list -> token list val t : token list -> token list val t : token list -> token list val f : token list -> token list et la reconnaissance d une entrée pourra alors se faire ainsi let recognize l = e l = [Teof] Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 26

programmation d un analyseur descendant les fonctions procèdent par filtrage sur l entrée et suivent la table + * ( ) int # E TE TE let rec e = function (Tleft Tint) :: _ as m -> e (t m) _ -> error () + * ( ) int # E +TE ɛ ɛ and e = function Tplus :: m -> e (t m) (Tright Teof) :: _ as m -> m _ -> error () Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 27

programmation d un analyseur descendant + * ( ) int # T FT FT and t = function (Tleft Tint) :: _ as m -> t (f m) _ -> error () + * ( ) int # T ɛ *FT ɛ ɛ and t = function (Tplus Tright Teof) :: _ as m -> m Tmult :: m -> t (f m) _ -> error () Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 28

programmation d un analyseur descendant + * ( ) int # F (E) int and f = function Tint :: m -> m Tleft :: m -> begin match e m with Tright :: m -> m _ -> error () end _ -> error () Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 29

programmation d un analyseur descendant remarques la table d expansion n est pas explicite : elle est dans le code de chaque fonction la pile non plus n est pas explicite : elle est réalisée par la pile d appels on aurait pu les rendre explicites on aurait pu aussi faire le choix d une programmation plus impérative val next_token : unit -> token Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 30

construire la table d expansion reste une question d importance : comment construire la table? l idée est simple : pour décider si on réalise l expansion X β lorsque le premier caractère de l entrée est c, on va chercher à déterminer si c fait partie des premiers caractères des mots reconnus par β une difficulté se pose pour une production telle que X ɛ, et il faut alors considérer aussi l ensemble des caractères qui peuvent suivre X déterminer les premiers et les suivants nécessite également de déterminer si un mot peut se dériver en ɛ Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 31

définitions Définition (null) Soit α (T N). null(α) est vrai si et seulement si on peut dériver ɛ à partir de α i.e. α ɛ. Définition (first) Soit α (T N). first(α) est l ensemble de tous les premiers terminaux des mots dérivés de α, i.e. {a T w. α aw}. Définition (follow) Soit X N. follow(x ) est l ensemble de tous les terminaux qui peuvent apparaître après X dans une dérivation, i.e. {a T u, w. S uxaw}. Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 32

calcul de null, first et follow pour calculer null(α) il suffit de déterminer null(x ) pour X N null(x ) est vrai si et seulement si il existe une production X ɛ, ou il existe une production X Y 1... Y m où null(y i ) pour tout i problème : il s agit d un ensemble d équations mutuellement récursives dit autrement, si N = {X 1,..., X n } et si V = (null(x 1 ),..., null(x n )), on cherche la plus petite solution d une équation de la forme V = F ( V ) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 33

calcul de point fixe Théorème (existence d un plus petit point fixe (Tarski)) Soit A un ensemble fini muni d une relation d ordre et d un plus petit élément ε. Toute fonction f : A A croissante, i.e. telle que x, y. x y f (x) f (y), admet un plus petit point fixe. preuve : comme ε est le plus petit élément, on a ε f (ε) f étant croissante, on a donc f k (ε) f k+1 (ε) pour tout k A étant fini, il existe donc un plus petit k 0 tel que f k 0 (ε) = f k 0+1 (ε) a 0 = f k 0 (ε) est donc un point fixe de f soit b un autre point fixe de f on a ε b et donc f k (ε) f k (b) pour tout k en particulier a 0 = f k 0 (ε) f k 0 (b) = b a 0 est donc le plus petit point fixe de f Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 34

remarque le théorème de Tarski donne des conditions suffisantes mais pas nécessaires Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 35

calcul de null dans le cas du calcul de null, on a A = Bool Bool avec Bool = {false, true} on peut munir Bool de l ordre false true et A de l ordre point à point (x 1,..., x n ) (y 1,..., y n ) si et seulement si i. x i y i le théorème s applique alors en prenant ε = (false,..., false) car la fonction calculant null(x ) à partir des null(x i ) est croissante Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 36

calcul de null pour calculer les null(x i ), on part donc de null(x 1 ) = false,..., null(x n ) = false et on applique les équations jusqu à obtention du point fixe i.e. jusqu à ce que la valeur des null(x i ) ne soit plus modifiée Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 37

exemple E T E E + T E ɛ T F T T * F T ɛ F ( E ) int E E T T F false false false false false false true false true false false true false true false Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 38

justification pourquoi cherche-t-on le plus petit point fixe? par récurrence sur le nombre d étapes du calcul précédent, on montre que si null(x ) = true alors X ɛ par récurrence sur le nombre d étapes de la dérivation X ɛ, on montre que null(x ) = true par le calcul précédent Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 39

calcul de first de même, les équations définissant first sont mutuellement récursives first(x ) = first(β) X β et first(ɛ) = first(aβ) = {a} first(x β) = first(x ), si null(x ) first(x β) = first(x ) first(β), si null(x ) de même, on procède par calcul de point fixe sur le produit cartésien A = P(T ) P(T ) muni, point à point, de l ordre et avec ε = (,..., ) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 40

exemple E T E E + T E ɛ T F T T * F T ɛ F ( E ) int null E E T T F false true false true false first E E T T F {+} {*} {(, int} {+} {(, int} {*} {(, int} {(, int} {+} {(, int} {*} {(, int} {(, int} {+} {(, int} {*} {(, int} Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 41

calcul de follow là encore, les équations définissant follow sont mutuellement récursives follow(x ) = first(β) follow(y ) Y αx β Y αx β, null(β) on procède par calcul de point fixe, sur le même domaine que pour first note : il faut introduire # dans les suivants du symbole de départ (ce que l on peut faire directement, ou en ajoutant une règle S S#) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 42

exemple null E E T T F false true false true false E T E E + T E ɛ T F T T * F T ɛ F ( E ) int first E E T T F {(, int} {+} {(, int} {*} {(, int} follow E E T T F {#} {#, )} {#} {+, #} {*} {#, )} {#, )} {+, #, )} {+, #} {*, +, #} {#, )} {#, )} {+, #, )} {+, #, )} {*, +, #, )} {#, )} {#, )} {+, #, )} {+, #, )} {*, +, #, )} Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 43

application : construction de la table d expansion à l aide des premiers et des suivants, on construit la table d expansion T (X, a) de la manière suivante pour chaque production X β, on pose T (X, a) = β pour tout a first(β) si null(β), on pose aussi T (X, a) = β pour tout a follow(x ) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 44

exemple E T E E + T E ɛ T F T T * F T ɛ F ( E ) int first E E T T F {(, int} {+} {(, int} {*} {(, int} follow E E T T F {#, )} {#, )} {+, #, )} {+, #, )} {*, +, #, )} + * ( ) int # E TE TE E +TE ɛ ɛ T FT FT T ɛ *FT ɛ ɛ F (E) int Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 45

grammaire LL(1) Définition (grammaire LL(1)) Une grammaire est dite LL(1) si, dans la table précédente, il y a au plus une production dans chaque case. LL signifie Left to right scanning, Leftmost derivation Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 46

construire des grammaires LL(1) il faut souvent transformer les grammaires pour les rendre LL(1) en particulier, une grammaire récursive gauche, i.e. contenant une production de la forme X X α ne sera jamais LL(1) il faut alors supprimer la récursion gauche (directe ou indirecte) de même il faut factoriser les productions qui commencent par le même terminal (factorisation gauche) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 47

conclusion les analyseurs LL(1) sont relativement simples à écrire (cf TD de cette semaine) mais ils nécessitent d écrire des grammaires peu naturelles on va se tourner vers une autre solution (la semaine prochaine) Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 48

la suite TD cette semaine analyseur LL(1) cours semaine prochaine analyse syntaxique 2/2 Jean-Christophe Filliâtre Langages de programmation et compilation 2015 2016 / cours 6 49