Abdelkader Heni ahe@info.fundp.ac.be FUNDP 2009-2010 Syntaxe et sémantique Abdelkader Heni ahe@info.fundp.ac.be FUNDP 2009-2010
I. Expressions régulières, langages et automates
Langages réguliers Soit ∑ un alphabet (fini). ∅ est un langage régulier ; {є} est un langage régulier ; a ∈ ∑ , {a} est un langage régulier ; Si L1 et L2 sont réguliers, alors : L1 · L2 = {w1w2 | w1 ∈ L1 , w2 ∈ L2} est régulier ; L1 ∪ L2 est régulier. L∗ = {є} ∪ {wwww · · ·w | w ∈ L} est régulier ;
Langages réguliers Théorème de Kleene : Un langage est régulier si et seulement s’il est reconnu par un automate fini Lemme de pompage (pour les langages réguliers) Soit L un langage sur un alphabet ∑. Si L est régulier alors p ∈ N : w∈ L, |w| p x,y,z ∈ ∑* : 1- w = xyz 2- |y| 1 3- |xy| p 4- i ∈ N , x yi z ∈ L
Algorithme de déterminisation (D. pp140-141) Donnée : un AFN Résultat : un AFD acceptant le même langage Principe: Construire une table de transition Dtran comme suit: 1 - q0 = є-fermeture(e0) est le seul état de l’AFD 2 - Tant qu’il y a des transitions manquantes dans Dtran pour chaque état q et pour chaque symbole a faire * q’ := є-fermeture( Transiter(q, a) ) * Dtran [q, a ] := q’ * Ajouter q’ à la liste des états s’il n y est pas déjà
Algorithme de minimisation (D. p 160) Donnée : un AFD M Résultat : un AFD minimal M’ acceptant le même langage que M Principe: 1. Initialisation : = { F , E \ F } 2. Répéter - Partitionner chaque groupe G de en sous groupes S1 ,S2, .. de manière que : q, q’ ∈ Si a , q et q’ ont des transitions sur a vers des états d’un même groupe de - Remplacer G par S1 ,S2, .. Jusqu’à ce que devienne stationnaire 3- Chaque groupe de est un état de M’ 4- L’état initial de M’ est le groupe de qui contient l’état initial de M 5- G G’ ssi q ∈ G, q’ ∈ G’ : q q’ a a
II. Analyse descendante LL(k)
Automate à pile AP = un automate a nombre fini d’états classique + une pile non bornée Automate - Ensemble d'états Q - État initial q0 - Ensemble d'états finaux F - Alphabet d'entrée ∑ Pile : Alphabet Z
Grammaire non contextuelle Définition : Une grammaire est dite non contextuelle si chaque production est de la forme X X VN (VN VT) *
Grammaire régulière Définition Grammaires non contextuelles Définition Une grammaire est dite régulière si chaque production est de la forme X X Y ou X ou X X Y ou X VT* X VN Si G est régulière alors L(G) est régulier. Il existe des grammaires non régulières qui engendrent un langage régulier. grammaire pas régulière langage pas régulier Grammaires régulières
Grammaire ambiguë Une grammaire est ambiguë s’il existe un mot qui admet deux arbres syntaxiques pour une grammaire donnée Décider de l'ambiguïté d'une grammaire est difficile : c'est un problème indécidable.
X 1|2 | … | n | 1 |2 |…. | m Factorisation gauche Remplacer : X 1|2 | … | n | 1 |2 |…. | m Par X X’ | 1 |2 |…. | m X’ 1|2 | … | n |
Suppression de la récursivité gauche Remplacer : X X1|X2 | … | Xn | 1 | 2 |…. | m Par X 1 X’ | 2 X’| …. | mX’ X’ 1X’| 2X’ | … | nX’ |
Transitions de l’automate des items Soit G = (VT , VN, S, P) une grammaire non contextuelle. Les transitions de son automate des items sont : Si le sommet de pile est [X → α • Y β] et que la production Y → γ appartient à la grammaire, remplacer le sommet de pile par [X → α • Y β][Y → •γ] (Expansion) ; Si le sommet de pile est [X → α • aβ] et que le symbole sous la tête de lecture est a, remplacer le sommet de pile par [X → αa • β] et avancer la tête de lecture (Lecture) ; Si la partie supérieure de pile est [X → α • Y β][Y → γ•] alors la remplacer par [X → αY • β] (Réduction).
Définition : ε-productif PremierK Définition : ε-productif Un non terminal X VN est dit ε-productif si X ⇒∗ ε Ensemble Premier1 (α) ? α Premier (α) α = ε α = a ou α = aβ , a VT a α = X , X VN {Premier (ϒi) |X → ϒi P} α = Xβ , X VN , X est ε-productif premier (X) Premier (β) α = Xβ , X VN , X n’est pas ε-productif Premier (X)
Problèmes : Comment choisir entre X αβ et X ? ( Premier() = ) Si la tête de lecture est $ ? Quelle production choisir ?
SuivantK Calcul de suivant. Les ensembles Premier ne suffisent pas. On a besoin des ensembles SuivantK. Calcul de suivant. Pour l’axiome S on ajoute { $ } à Suivant(S) Suivant (X) = Suivant (X) dans toutes les productions P Suivant(X) Y = αX Suivant(Y) Y = αX β, β n’est pas ε-productif Premier (β) Y = αX β, β est ε-productif Premier (β) Suivant(Y)
Table d’analyse LL(1) Algorithme : Entree : une grammaire G, Premier et Suivant Sortie : la table d'analyse TAB Méthode 1) pour toute production X β faire a) Ajouter X β à TAB[ X, a ] pour tout a Premier(β) b) Si β est ε-productif alors Ajouter X β à TAB[ X, b ] pour tout b Suivant(X) 2) Ajouter erreur dans les entrées de TAB restées vides
- Soit Premier( ) Premier(β) Une grammaire est LL(1) si Chaque case de la table d’analyse contient une seule production ou erreur. Une grammaire n'est pas LL(1) s'il existe 2 productions X et X β telles que : - Soit Premier( ) Premier(β) - Soient est ε-productif et Premier(β) Suivant(X) - Soit et β sont tous les deux ε-productifs (la grammaire est ambiguë).
Suppression de la récursivité générale On ordonne les non-terminaux : X1,X2, . . . ,Xn On applique l’algorithme suivant Algorithme : Pour i allant de 1 à n faire 1) Pour j allant de 1 à (i - 1) faire On remplace la règle Xi Xj où Xj β1 | . . . | βk par la règle Xi β1 | . . . | βk 2) On élimine la récursivité à gauche immédiate pour toutes les règles de Xi. Remarque : Cet algorithme n'est efficace que si la grammaire est propre
Exercices 1) Qu’est ce qu’une grammaire LL(0) ? 2) Montrer que la grammaire suivante n’est pas LL(k) pour tout k S aBb | Bac B aB | d
III. Analyse LR(0), SLR(1), LALR(1), LR(1)
Automate LR(0) : Relation de transition La relation de transition de l'automate LR(0) est telle que : Lecture : - si a est sous la tête de lecture ; - si q est en sommet de pile ; - et l'un des items de q est de la forme [X ….●a…. ] ; alors on empile l'état successeur de q pour a. Réduction : - si q est en sommet de pile - si l'un des items de q est de la forme [X α● ] ; | α | = n Alors on dépile n états puis on empile δ(q,X) le successeur par X de l'état q en sommet de pile.
Table d'un analyseur LR(0) Table des actions/goto : Q x (VT {$}) ---> ensemble d'actions Q x VN ----> Destinations indique quelle action effectuer dans un état q Q si x (VT {$}) est sous la tête de lecture et à quel état revenir s’il s’agit d’une réduction . Trois types d’actions possibles : - Lecture du terminal x - Réduction par une production p (red par p) ; - Acceptation Actions Goto États a b c $ A B 1 2 3
Table des Actions/Goto LR(0) 1) a VT et q Q : si δ(q, a) = q’ alors mettre Shiftq’ dans T[q,a] 2) q Q, q qf : si q contient un item terminal de la forme X α● , alors a ( VT {$} ) mettre ReduceM dans T[q,a] (M est le numéro de la règle X α ) 3) Mettre acceptation dans la case (qf , $) 4) Mettre erreur dans les cases encore vides Goto Pour tout A VN et q Q : si δ(q, A) = q’ alors mettre q’ dans T[q,A]
Conflits LR(0) L'automate LR(0) construit peut ne pas être déterministe : État autorisant 2 réductions (ou plus) : conflit LR(0) reduce/reduce X α● Y β● État autorisant 1 réduction et 1 lecture (ou plus) : conflit LR(0) shift/reduce X …●a… Y α● Une grammaire est dite LR(0) si aucun de ses états ne contient de conflit LR(0).
Comment résoudre les conflits LR(0) ? Solution : essayer avec SLR(1) SLR(1) prend en compte un symbole de prévision a pour décider d'une réduction : Reduce X α ssi a Suivant(X)
Table des Actions/Goto SLR(1) 1) a VT et q Q : si δ(q, a) = q’ alors mettre Shiftq’ dans T[q,a] 2) q Q, q qf : si q contient un item terminal de la forme X α● , alors a ( VT {$} ) et a Suivant(X) mettre Reduce X α dans T[q,a] 3) Mettre acceptation dans la case (qf , $) 4) Mettre erreur dans les cases encore vides Goto Pour tout A VN et q Q : si δ(q, A) = q’ alors mettre q’ dans dans T[q,A]
Conflits SLR(1) État autorisant 2 réductions (ou plus) : conflit SLR(1) reduce/reduce X α● Y β● et suivant (X) suivant (Y) État autorisant 1 réduction et 1 lecture (ou plus) : conflit SLR(1) shift/reduce X …●a… Y α● et a suivant (Y) Une grammaire est dite SLR(1) si aucun de ses états ne contient de conflit SLR(1). Essayons avec LALR(1)… ... mais avant, on va voir LR(1)
Automate LR(1) 1- On commence par calculer I0 = fermeture (S’ ● S, $) 2- On calcule les Ij = δ(I0, X) X ( VT VN) 3- On répète l’étape 2 pour chaque ensemble Ij Fermeture (I) Répéter pour tout item [ X α● B β, a ] de I, pour chaque production B γ de G’ et chaque terminal b de premier( β a) Ajouter [ B ● γ, b ] à I Jusqu’à ce qu’aucun nouvel élément ne puisse être ajouté à I
Table des Actions/Goto LR(1) 1) a VT et q Q : si δ(q, a) = q’ alors mettre Shiftq’ dans T[q,a] 2) q Q, q qf : si q contient un item de la forme [ X α●, a ] , alors a VT mettre ReduceM dans T[q,a] 3) Mettre acceptation dans la case (qf , $) 4) Mettre erreur dans les cases encore vides Goto Pour tout A VN et q Q : si δ(q, A) = q’ alors mettre q’ dans T[q,A]
Conflits LR(1) État autorisant 2 réductions (ou plus) : conflit LR(1) reduce/reduce X α● U Y β● U’ et U U’ État autorisant 1 réduction et 1 lecture (ou plus) : conflit LR(1) shift/reduce X …●a… U Y α● U’ et a U’ Une grammaire est dite LR(1) si aucun de ses états ne contient de conflit LR(1).
LALR(1) 1. À partir de l’automate LR(1)…. 1- Construire la collection des ensembles d’items LR(1) pour G’ 2- Pour chaque cœur présent parmi les items LR(1), trouver tous les états ayant ce même cœur et remplacer ces états par leur union 3- Construire la table en utilisant le même algorithme que pour LR(1)
LALR(1) 2. Sans passer par l’automate LR(1) 1- On construit l’automate SLR(1) 2- On calcule les symboles de prévision comme suit: - SP (S’ ●S ) = { $ } - SPq’(X α A ● β ) = SPq (X α ● A β ) Tel que δ(q, A) = q’ - SPq(X ● α ) = SPq (Y β●X ) Tel que Y β●X q premier (θ) \ ε Tels que Y β●X θ q et θ ε SPq (Y β●X θ) Tels que Y β●X θ q , θ ε et ε premier(θ)
Exercice 18 E0 E3 S’→ ●S $ S → ●nASA S → ●s S’→ ●S $ S → ●nASA $ A → ●aB n,s n a a a E1 a S’→ S● S → nAS●A $ A → ●aB $ S E5 E6 A → a●B n,s B → ●aAB B → ● $ a $ a E8 $ a a n,s a a n,s a $ a B→ a●AB n,s A→ ●aB $ $ a a B A A a E7 E9 E10 A → aB● n,s S → nASA● $ a B → aA●B n,s,$,a B → ●aAB n,s,$,a B → ● n,s,$,a B E11 B → aAB● n,s,$,a
Conflits LALR(1) État autorisant 2 réductions (ou plus) : conflit LALR(1) reduce/reduce X α● U Y β● U’ et U U’ État autorisant 1 réduction et 1 lecture (ou plus) : conflit LALR(1) shift/reduce X …●a… U Y α● U’ et a U’ Une grammaire est dite LALR(1) si aucun de ses états ne contient de conflit LALR(1).
Langages non contextuels Lemme de pompage (pour les langages non contextuels) Soit L un langage sur un alphabet ∑. Si L est non contextuel alors p ∈ N : M∈ L, |M| p x,y,z,v,w ∈ ∑* : 1- M = x.v.y.w.z 2- |vw| 1 3- |vyw| p 4- i ∈ N , x viywiz ∈ L
IV. Grammaires attribuées
Grammaires attribuées On enrichit donc les grammaires BNF par deux concepts: Les données sont représentes par des attributs associés aux terminaux et non-terminaux ; Les calculs des données sont exprimes sous la forme de règles sémantiques associées aux productions. On obtient une grammaire décorée appelée grammaire attribuée.
Remarque: Une GA spécifie comment calculer des valeurs associées a ses symboles mais elle ne dit pas quand effectuer ces calculs ni dans quel ordre effectuer les actions. GA = formalisme de spécification, pas d'exécution
Attributs synthétisés L'attribut X.a est synthétisé si X apparaît en partie gauche la valeur de X.a est calculée en fonction de la valeur d'attributs associés a des symboles apparaissant en partie droite. X X1 X2 ….Xn { X.a = f(X1.x1, X2.x2,…. ,Xn.x1 }
Attributs hérités L'attribut Y.a est hérite si Y apparaît en partie droite La valeur de Y.a est calculée en fonction de la valeur d'attributs associés a des symboles apparaissant en partie gauche et/ou des autres symboles apparaissant en partie droite. X X1 X2 … Y….Xn { Y.a = f(X.x, X1.x1, X2.x2,…. ,Xn.x1 }
Grammaire S-attribuée Une grammaire attribuée ne comportant que des attributs synthétisés est dite S-attribuée. Grammaire L-attribuée X X1 X2 ….Xn Les attributs hérités de Xi (1 i n) dépendent uniquement de la valeur : d'attributs hérités du père X ; d'attributs des frères Xj , avec ji
Restrictions sur les GA Analyse descendante : parcours de l'arbre en ordre préfixe, en profondeur d'abord: Les attributs hérités de X2 ne peuvent venir de ses frères de droite
Restrictions sur les GA Analyse ascendante : parcours de l'arbre en ordre postfixe Les attributs hérités de X2 ne peuvent venir de ses frères de droite, ni de son père