Analyse syntaxique IFT-15752 Compilation et interpr etation c! Danny Dub e 2006



Documents pareils
Théorie des Langages

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

Les structures de données. Rajae El Ouazzani

Compilation. Algorithmes d'analyse syntaxique

OCL - Object Constraint Language

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Recherche dans un tableau

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

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

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

Initiation à la Programmation en Logique avec SISCtus Prolog

Algorithmique et Programmation, IMA

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Définitions. Numéro à préciser. (Durée : )

Arbres binaires de recherche

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

Grammaires d unification

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

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

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

TP1 - Prise en main de l environnement Unix.

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Calculabilité Cours 3 : Problèmes non-calculables.

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

Formula Negator, Outil de négation de formule.

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

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

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

Initiation à la programmation en Python

Rappels Entrées -Sorties

Organigramme / Algorigramme Dossier élève 1 SI

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Algorithme. Table des matières

Compilation (INF 564)

Représentation d un entier en base b

Utilisation d objets : String et ArrayList

Pourquoi l apprentissage?

Les algorithmes de base du graphisme

Initiation à l algorithmique

Cours d algorithmique pour la classe de 2nde

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Qualité du logiciel: Méthodes de test

Cours 1 : La compilation

Rappels sur les suites - Algorithme

TP1 : Initiation à Java et Eclipse

1 Introduction au codage

Fiche PanaMaths Calculs avec les fonctions sous Xcas

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

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

Utilisation des tableaux sémantiques dans les logiques de description

Fondements de l informatique Logique, modèles, et calculs

Les chaînes de caractères

Cours de Programmation 2

Modèles à Événements Discrets. Réseaux de Petri Stochastiques

LES OUTILS D ALIMENTATION DU REFERENTIEL DE DB-MAIN

Gestion mémoire et Représentation intermédiaire

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

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Chapitre 2. Eléments pour comprendre un énoncé

Débuter avec Excel. Excel

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

La saisie d un texte

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

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

Enseignement secondaire technique

Cours 1 : Qu est-ce que la programmation?

chapitre 4 Nombres de Catalan

Programmer en JAVA. par Tama

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

CRÉER UN COURS EN LIGNE


Préparation à l examen EFA en Macro

Corrigé des TD 1 à 5

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

Algorithmes récursifs

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

Les nombres entiers. Durée suggérée: 3 semaines

Algorithmes d'apprentissage

Université de Lorraine Licence AES LIVRET DE STAGE LICENCE

TP 1. Prise en main du langage Python

Introduction à MATLAB R

Théorie de la Programmation

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Java Licence Professionnelle CISII,

Initiation à LabView : Les exemples d applications :

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

Chapitre 1 I:\ Soyez courageux!

Programmation en Caml pour Débutants

Vers l'ordinateur quantique

Algorithmique et programmation : les bases (VBA) Corrigé

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

Chapitre 2 Devine mon nombre!

Calcul Formel et Numérique, Partie I

Algorithmique, Structures de données et langage C

MIS 102 Initiation à l Informatique

Transcription:

Analyse syntaxique

Introduction Les grammaires hors-contexte sont les outils que nous utiliserons pour spécifier la structure syntaxique des programmes. Les grammaires hors-contexte ont plusieurs avantages: Ils constituent une spécification précise et claire de la syntaxe des programmes. On peut construire un analyseur syntaxique efficace directement à partir de certaines classes de grammaires. Offre un cadre pour la définition de traducteurs orientés-syntaxe. Une définition et une implantation basées sur une grammaire hors-contexte rendent les modifications ultérieures du compilateur plus facile. Cette portion du cours se concentre sur l implantation à la main d analyseurs syntaxiques et se rend jusqu à la définition des grammaires LL(1).

Role et types d analyseurs syntaxiques programme source analyseur lexical jeton prochain analyseur syntaxique arbre de reste de la représentation dérivation partie frontale intermédiaire table des symboles Il y trois grands types d analyseurs syntaxiques: Les méthodes universelles: CYK, Earley. Les méthodes descendantes: descente récursive, basées sur les grammaires LL(k). Les méthodes ascendantes: basées sur les grammaires LR(k).

Gestion et signalement des erreurs Rappelons qu on peut classer les erreurs en ces catégories: lexicales,syntaxiques,sémantiquesetlogiques. Étant donné que peu d erreurs peuvent être détectées au niveau lexical, l analyseur syntaxique détecte la plupart des erreurs des deux premières catégories. Objectifs du gestionnaire d erreurs: Les erreurs doivent être signalées clairement (messages) etprécisément(causesetcoordonnées). Il devrait y avoir récupération après une erreur afin de continuer la compilation et la détection d erreurs pour le reste du programme. La gestion des erreurs ne devrait pas ralentir la compilation desprogrammescorrectsdefaçonimportante. L analyseur syntaxique peut tenter de récupérer après une erreur de diverses façons: Mode panique: abandon des jetons jusqu à un jeton dit de synchronisation (certains délimiteurs ou mots clés). Correction locale: modification d un préfixe court de l entrée pour permettre à l analyse de se poursuivre. Productions d erreurs: utilisation de productions d erreur qui captent certaines erreurs et fournissent une réaction adéquate. Correction globale: calcul d une plus petite distance d édition qui transforme le programme erroné en un programme syntaxiquement valide.

Conventions de notation Pour minimiser le verbiage inutile, on adopte plusieurs conventions liées à la notation. 1. Les choses suivantes sont des terminaux: des lettres minuscules du début de l alphabet comme a, b, c; des opérateurs comme +, ; des signes de ponctuation; les chiffres 0,..., 9; des noms en gras comme id, if. 2. Les choses suivantes sont des non-terminaux: des lettres majuscules du début de l alphabet comme A, B, C; la lettre S qui est souvent le symbole de départ; des noms en minuscules et en italique comme expr, stmt. 3. Les lettres majuscules de la fin de l alphabet, comme X, Y et Z, représententdessymbolesdelagrammaire;c est-à-dire, des terminaux et non-terminaux indifféremment. 4. Les lettres minuscules de la fin de l alphabet, comme u,...,z, représententdeschaînesfaitesdeterminaux. 5. Les lettres grecques minuscules, comme α, β et γ, représententdeschaînesfaitesdesymbolesdelagrammaire. Par ex., A α est la forme générale d une production où A et α sont les membres gauche et droit, respectivement. 6. Si on a les productions A α 1,...,A α k,appeléesa-productions, on peut écrire A α 1... α k et appeler les α i les alternatives pour A. 7. Àmoinsd indicationscontraires,lemembregauchedelapremière production est le symbole de départ.

Une phrase est une suite de terminaux (synonyme d une chaîne). Définitions Une forme de phrase est une suite de terminaux et de non-terminaux. Une forme de phrase α est dérivable en une forme de phrase α,qu ondénoteparα α,siα = βaγ, α = βδγ et que A δ est une production. On dit aussi que α 1 est dérivable en α n,qu ondénoteparα 1 α n,siα 1 α 2... α n et n 1. Si n>1, onpeutécrire α 1 + α n. On a une dérivation de E en w si E w. Une chaîne w est générée par la grammaire si S w où S est le symbole de départ. Le langage généré par une grammaire G, dénoté L(G), est l ensemble des chaînes générées par G. Un langage L est hors-contexte s il existe une grammaire G dont le langage est L. Deux grammaires sont é q u i v a l e n t e sis elles génèrent le même langage. On dit que α est dérivable à gauche(droite) d abord en α,qu onnoteα lm α (α rm α,respectivement),siα = waβ, α = wγβ et A γ est une production (α = βaw et α = βγw, respectivement). On a une dérivation à gauche(droite) d abord de w, S lm gauche(droite) d abord. w (S rm w,respectivement),sichaqueétapedeladérivationsefaità Un arbre de dérivation d une chaîne w... Une grammaire est ambiguë s il existe plus d un arbre de dérivation (ou plus d une dérivation à gauche(droite) d abord) pour un certain w.

Grammaires H-C versus expressions régulières On sait que pour toute expression régulière, on peut créer une grammaire hors-contexte qui génère le même langage. Donc, pourquoi tient-on à utiliser les expressions régulières pour définir la structure lexicale des langages de programmation? La structure lexicale des langages est habituellement très simpleetnenécessite pas l usage des grammaires hors-contexte. Les expressions régulières sont plus compactes et plus claires. On peut produire des analyseurs lexicaux plus efficaces à partir d expressions régulières qu à partir de grammaires. La séparation en structure lexicale et structure syntaxique aide à modulariser le compilateur.

Vérification du langage généré Le créateur d un langage de programmation doit s assurer que le langage généré par la grammaire qu il emploie génère bien le bon langage. Le degré de formalisme dans la vérification peut varier. Aussi, il est rarement nécessaire de vérifier l ensemble de la grammaire d un coup. Pour montrer qu une grammaire génère le bon langage, il faut montrer que toutes les chaînes appartenant au langage et seulement celles-ci sont généréesparlagrammaire. À titre d exemple,le manuel présente l exemple 4.7 où on démontre que le langage des chaînes dans {(, )} qui sont bien parenthésées est généré par la grammaire: S (S)S ɛ

Élimination de l ambiguïté La grammaire décrivant un langage doit être conçue pour être sans ambiguïté ou bien doit être convertie de façon à ce qu elle ne comporte plus d ambiguïté. Par exemple, la grammaire synthétique suivante génère des énoncés mais elle est ambiguë: stmt if expr then stmt if expr then stmt else stmt other Toutefois, on peut la modifier par la grammaire équivalente suivante, laquelle n est pas ambiguë: stmt matched stmt unmatched stmt matched stmt if expr then matched stmt else matched stmt other unmatched stmt if expr then stmt if expr then matched stmt else unmatched stmt

Considérons la grammaire récursive à gauche suivante: A Aα β Élimination de la récursion à gauche où β ne commence pas par A. OnpeutéliminerlarécursionàgaucheenremarquantqueA ne peut mener qu à des formes de phrases du genre βα.ainsi,lagrammairesuivantegénèrelemêmelangagemaissansutiliserlarécursion à g a u c h e. A βa A αa ɛ Exemple 4.8 On peut éliminer la récursion à gauche de la grammaire suivante: E E + T T T T F F F (E) id en la transformant en la grammaire suivante: E TE E +TE ɛ T FT T FT ɛ F (E) id

Élimination de la récursion à gauche La technique d élimination de la récursion à gauche fonctionne peu importe le nombre de A-productions. Àtitred exemple,lesa-productions suivantes peuvent se grouper en celles qui commencent avec A et celles qui ne commencent pas avec A: A Aα 1... Aα m β 1...β n On peut alors transformer la grammaire en une grammaire sans récursion à gauche: A β 1 A... β n A A α 1 A... α m A ɛ Ce genre de transformation élimine les récursions à gauche directes. Certainsnon- terminaux peuvent être récursifs à gauche indirectement. Par exemple, dans la grammaire suivante, S est récursif à gauche: S Aa b A Ac Sd ɛ

Élimination de la récursion à gauche L algorithme suivant élimine toute récursion à gauche d une grammaire, même indirecte. Il fonctionne en autant qu il n y ait pas de cycles, c est-à-dire qu il y n ait pas un A tel que A + A. Algorithme 4.1 Entrée: Une grammaire G sans cycles ni ɛ-productions. Sortie: Une grammaire équivalente sans récursion à gauche. Méthode: 1. Ordonner les non-terminaux par indices A 1,...,A n. 2. Pour i := 1àn faire Pour j := 1ài 1 faire Remplacer chaque production de la forme A i A j γ par les productions A i δ 1 γ... δ k γ, où A j δ 1... δ k sont les A j -productions actuelles Fin Éliminer les récursions immédiates à gauche des A i -productions Fin Exemple 4.9 Éliminer la récursion à gauche de la grammaire: S Aa b A Ac Sd ɛ

Dans une grammaire comme la suivante: Factorisation à gauche stmt if expr then stmt else stmt if expr then stmt on ne peut choisir dès le départ laquelle des productions il faututiliser. Toutefois,en mettant en commun les 4 premiers symboles on retarde la prise de décision jusqu au point où on dispose des informations nécessaires: stmt if expr then stmt stmt stmt else stmt ɛ Plus généralement, on peut remplacer les productions: par: A αβ 1 αβ 2 A αa A β 1 β 2

Factorisation à gauche Algorithme 4.2 Entrée: Une grammaire G. Sortie: Une grammaire équivalente factorisée à gauche. Méthode: 1. Pour chaque non-terminal A, trouverlepluslongpréfixeα commun à au moins deux A- productions. 2. Si α ɛ, remplacer: A αβ 1... αβ n γ 1... γ m par (où A est un nouveau non-terminal): A αa γ 1... γ m A β 1... β n 3. Répéter jusqu à ce qu il n y ait plus de non-terminal pour lequel il existe un préfixe commun non-trivial. Exemple 4.10

Langages non hors-contexte Les langages suivants ne sont pas hors-contexte: L 1 = {wcw w {a, b} } L 2 = {a n b m c n d m n 1 et m 1} L 3 = {a n b n c n n 0} Pourtant, ils ressemblent beaucoup aux langages suivants qui, eux, sont hors-contexte: L 1 = {wcw R w {a, b} } L 2 = {a n b m c m d n n 1 et m 1} L 3 = {an b n n 0}

Analyse syntaxique descendante Section 4.4 Contenu: Analyse syntaxique descendante. Analyse syntaxique descendante sans rebroussement (backtracking) ouanalyseprédictive. La classe des grammaires LL(1). Analyseurs prédictifs sans récursion.

Analyse syntaxique descendante L analyse syntaxique descendante peut être vue comme étant: une tentative de trouver une dérivation à gauche d abord pour la chaîne d entrée; ou une tentative de construire un arbre de dérivation pour la chaîne d entrée en construisant les noeuds de l arbre en pré-ordre. En règle générale, l analyse syntaxique descendante demande de faire du rebroussement. Ce n est pas souhaitable en compilation car, pour certaines grammaires, l analyse peut prendre un temps exponentiel en pire cas. Exemple 4.14 Simulons l analyse descendante de la chaîne w = cad en considérant la grammaire: S cad A ab a Nécessite un rebroussement!

Analyseurs prédictifs Dans certains cas, en concevant bien notre grammaire, en éliminant les ambiguïtés et les récursions à gauche, on obtient un analyseur syntaxique descendant qui n a pas besoin d effectuer de rebroussement, c est-à-dire un analyseur prédictif. Pour obtenir un analyseur prédictif, il faut respecter la condition stipulant que: pour tout non-terminal A à s u b s t i t u e r, pour tout terminal a qui doit être consommé sur l entrée, il doit y avoir au plus une alternative parmi A α 1... α n qui est capable de générer une chaîne commençant par a. Par exemple, en ce qui concerne le non-terminal stmt dans la grammaire suivante, la condition est respectée: stmt if expr then stmt else stmt while expr do stmt begin stmt list end

Diagrammes de transition On peut décrire le comportement d un analyseur prédictif à l aide de diagrammes de transition. Les diagrammes de transition pour l analyse syntaxique diffèrent légèrement des diagrammes pour l analyse lexicale: Les diagrammes sont associés aux non-terminaux et il y a un seul diagramme par non-terminal. Les étiquettes sur les transitions peuvent aussi être des non-terminaux. Une transition sur un terminal correspond à la consommation du terminal sur l entrée. Une transition sur un non-terminal correspond à appeler la procédure d analyse associée au non-terminal. On construit un diagramme de transition pour un non-terminal A ainsi: 1. Créer un état de départ et un état final. 2. Pour chaque production A X 1...X n,ajouterunchemindontlesétiquettessontx 1,..., X n (ou ajouter une transition étiquetée avec ɛ si la production est A ɛ).

Diagrammes de transition L analyseur prédictif effectue son travail en se frayant un chemin à travers un diagramme de l état de départ à l état final en faisant un certain nombre de transitions: en passant d un état s à u n é t a tt par un arc étiqueté a pourvu que le prochain symbole en entrée soit a; en passant d un état s à u n é t a t par un arc étiqueté A en appelant la procédure associée à A; toutsymboledel entréequiestconsommél estaucoursdel appelà la procédure; au retour de l appel, on considère que le symbole A aétéconsommé; en passant d un état s à u n é t a tt par un arc étiqueté ɛ sans consommer de symbole de l entrée. Aux états où l analyseur prédictif doit choisir parmi plusieurs options, il faut prévoir une méthode de prise de décision.

Diagrammes de transition Voici les diagrammes de transitions correspondant à la grammaire suivante: E TE E +TE ɛ T FT T FT ɛ F (E) id E: 0 T 1 E 2 E : T : T : F : 3 + 4 T 5 E 6 ɛ 7 F 8 T 9 10 11 F 12 T 13 ɛ 14 ( 15 E 16 ) 17 id

Diagrammes de transition Simplification de diagrammes: E : ɛ 3 + 4 T 5 E : 3 4 + T ɛ 6 ɛ 6 T E: 0 T 3 + 4 + E: 0 T 3 ɛ 6 ɛ 6 Diagrammes simplifiés (20-25% plus rapides): + E: 0 T 3 ɛ 6 T : 7 F 8 ɛ 13 F : 14 ( 15 E 16 ) 17 id

Analyse prédictive sans récursion Entrée a + b $ Pile X Y Programme de l AS prédictif Sortie Z $ Table d analyse syntaxique M

L analyseur syntaxique prédictif: Analyse prédictive sans récursion comporte un tampon d entrée, initialisé avec la chaîne d entrée suivie du symbole $; comporte une pile, initialisée avec le symbole de départ par-dessus le symbole $; utilise une table d analyse M, oùm[a, a] indique quelle production utiliser si le symbole sur le dessus de la pile est A et que le prochain symbole en entrée est a. Dans une configuration où X est sur le dessus de la pile et a est le prochain symbole dans l entrée, l analyseur effectue une des actions parmi les suivantes: Si X = a =$,l analyseurarrêtesesopérationsetannonceuneanalyseréussie. Si X = a $,l analyseurdépilex et fait avancer le pointeur de l entrée. Si X est un non-terminal, le programme de l analyseur consulte la tabled analyseenposition M[X, a]. Lacaseconsultéefournitsoituneproductionàutiliser,soituneindicationd erreur. Si, par exemple, M[X, a] ={X UVW}, alorsl analyseurdépilex et empile W, V et U, dans l ordre. En cas d erreur, l analyseur s arrête et signale l erreur. La sortie de l analyseur consiste en la suite de productions utilisées.

Analyse prédictive sans récursion Algorithme 4.3 Entrée: Une chaîne w et la table d analyse M associée à une grammaire G. Sortie: Une dérivation à gauche d abord de w si w L(G) et le signalement d une erreur sinon. Méthode: initialiser la pile avec S par-dessus $ et le tampon d entrée avec w$; faire pointer ip sur le premier symbole de l entrée; répéter soit X le symbole du dessus de pile et a le symbole pointé par ip; si X est un terminal ou $ alors si X = a alors dépiler X et incrémenter ip sinon erreur() sinon / X est un non-terminal / si M[X, a] =X Y 1...Y k alors début dépiler X; empiler Y k,...,y 1,dansl ordre; afficher la production X Y 1...Y k fin sinon erreur() jusqu à ce que X =$ / la pile est vide /

Analyse prédictive sans récursion Exemple 4.16 Àlagrammaire: E TE E +TE ɛ T FT T FT ɛ F (E) id on associe la table d analyse suivante: Non- Symbole d entrée terminal id + ( ) $ E E TE E TE E E +TE E ɛ E ɛ T T FT T FT T T ɛ T FT T ɛ T ɛ F F id F (E) Analyse prédictive de la chaîne id + id id.

FIRST et FOLLOW On définit l ensemble FIRST(α) comme étant l ensemble des terminaux qui débutent les chaînes générées à partir de α plus ɛ si α peut générer ɛ. Formellement: FIRST(α) ={a α aw} {ɛ α ɛ} On peut calculer un ou des ensembles FIRST à l aide des règles suivantes: FIRST(ɛ) ={ɛ}. FIRST(aα )={a}. Si X α est une production, FIRST(X) FIRST(α). Si ɛ FIRST(X), alors FIRST(Xα) =(FIRST(X) {ɛ}) FIRST(α), sinon FIRST(Xα)=FIRST(X).

FIRST et FOLLOW On définit l ensemble FOLLOW(A), A étant un non -terminal, comme étant l ensemble des terminaux qui peuvent apparaître immédiatement à droite de A dans une forme de phrase générée par la grammaire. On ajoute $ à FOLLOW(A) si A peut apparaître complètement à droite dans une forme de phrase. Plus formellement, FOLLOW(A) ={a S αaaβ} {$ S αa} On peut calculer les ensembles FOLLOW de tous les non-terminaux d une grammaire à l aide des règles suivantes: Si S est le symbole de départ, alors $ FOLLOW(S). Si A αbβ est une production, alors FIRST(β) {ɛ} FOLLOW(B). Si A αb est une production ou si A αbβ est une production et que ɛ FIRST(β), alorsfollow(a) FOLLOW(B).

FIRST et FOLLOW Exemple 4.17 Considérons (une fois encore) cette grammaire: E TE E +TE ɛ T FT T FT ɛ F (E) id alors les ensembles FIRST et FOLLOW des non-terminaux sont les suivants: FIRST(E) =FIRST(T )=FIRST(F )={(, id} FIRST(E )={+,ɛ} FIRST(T )={,ɛ} FOLLOW(E) =FOLLOW(E )={), $} FOLLOW(T )=FOLLOW(T )={+, ), $} FOLLOW(F )={, +, ), $}

Construction de tables d analyse Algorithme 4.4 Entrée: Une grammaire G. Sortie: Une table d analyse M. Méthode: 1. Pour chaque production A α, faire: (a) Pour chaque terminal a FIRST(α), ajoutera α à M[A, a]; (b) Si ɛ FIRST(α), ajoutera α à M[A, b] pour chaque symbole b FOLLOW(A). b est un terminal ou $. 2. Chaque case de M qui est encore indéfinie doit être initialisée à un signalement d erreur. Exemple 4.18.

Construction de tables d analyse Exemple 4.19 Àlagrammairesuivante(grammairesymbolisantlecasduif-then-else): S ietss a S es ɛ E b on associe la table d analyse suivante: Non- Symbole d entrée terminal a b e i t $ S S a S ietss S E E b S ɛ S es S ɛ

Grammaires LL(1) On dit qu une grammaire est LL(1) si sa table d analyse ne comporte aucune case qui contient plus d une production. L abréviation LL(1) a la signification suivante: le premier L indique que l entrée (la suite de jetons) est lue degaucheàdroite(from Left to right); le second L indique que la technique recherche une dérivation à gauche d abord (Leftmost derivation); le 1 indique qu un seul jeton constitue l horizon de l analyse. Les grammaires LL(1) possèdent plusieurs propriétés intéressantes: Aucune grammaire ambiguë ou comportant une récursion à gauche n est LL(1). S il existe deux productions A α et A β (α β) dansunegrammairell(1),onaque: il n existe pas de terminal a tel que α et β génèrent tous deux des chaînes qui commencent par a; au plus un de α et β peut générer la chaîne ɛ; si β ɛ,alorsα ne peut pas générer une chaîne dont le premier terminal est élémentdefollow(a). On peut créer un analyseur prédictif directement à partir d unegrammaireg si et seulement si G est LL(1).