IFT313 Introduction aux langages formels

Slides:



Advertisements
Présentations similaires
L-System et modélisation de plantes…
Advertisements

Algorithmes et structures de données avancés
24 septembre 2007Cours de compilation 4 - Intranet1 Cours de compilation Techniques danalyse descendantes.
Chap 1 Grammaires et dérivations.
INTRODUCTION.
Introduction : Compilation et Traduction
Expressions rationnelles
Chapitre 1 Automates finis
IFT 702 – Planification en Intelligence Artificielle Planification avec des processus de décision de Markov Froduald Kabanza Département d’informatique.
IFT313 Introduction aux langages formels
Construction du graphe de Spehner.. Différentes étapes 1) Alphabet. 2) Langage. 3) Création des sommets du graphe de Spehner. 4) Ajout des différents.
IFT313 Introduction aux langages formels
Conception et analyse des algorithmes
IFT313 Introduction aux langages formels
Introduction : Compilation et Traduction
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313.
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313.
Analyse lexicale Généralités Expressions rationnelles Automates finis
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313.
IFT451 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313.
IFT313 Introduction aux langages formels
Notions de base de la théorie des langages
Programmation fonctionnelle Le langage LISP
Programmation logique Démonstrateur automatique
I.A. Session 2009/2010 E.P.S.I. Bordeaux – C.S.I.I – 2 ème Année – Cours n°3.
Bases de données lexicales
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels
Examen de compilation 4ème année - A
IFT 615 – Intelligence Artificielle Satisfaction de contraintes
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke Révision de mi-session.
IFT313 Révision finale Département d’informatique
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke Grammaires attribuées.
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313.
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke Analyseurs récursifs LL (1)
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke Automates à pile LR Notion de poignée.
IFT 702 – Planification en intelligence artificielle Transformations Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift702.
IFT313Froduald Kabanza1 IFT 313 Lab 1 1Écrivez une expression régulière pour chacun des langues suivants: a)Des mots sur lalphabet {a,b,c} telle que toute.
Expressions régulières et hash tables
Chapitre 3 Machines de Turing.
IFT Complexité et NP-complétude
1 CSI3525: Concepts des Languages de Programmation Notes # 3: Description Syntaxique des Languages.
Chapitre 7: Le théorème de Kleene
Hiver 2003SEG2501 analyse lexicale1 Notes supplémentaires au sujet de lanalyse lexicale Exemples Dérivation dun NFA qui accepte le même langage (algorithme:
Applications des langages hors-contextes Les analyseurs syntactiques ascendants GNU Yacc et Bison.
Chapitre 3 Syntaxe et sémantique.
Analyse lexicale et syntaxique
IFT313 – Introduction aux langages formels Éric Beaudry Exercices Expressions régulières, ADF et AFN Été 2010.
Rappel Modèle analyse-synthèse de la compilation
Indécidabilité.
IFT Complexité et NP-complétude Chapitre 0 Rappels.
Expressions régulières et hash tables
Paradigmes des Langages de Programmation
INTRODUCTION.
Les machines de Turing Lionel Blavy Sébastien Giraud Fabien Tricoire
D.E ZEGOUR Ecole Supérieure d’Informatique. Problèmes de décision Concepts de base Expressions régulières Notation particulière pour exprimer certaines.
Le langage Racket (Lisp)
Modèles d’entrelacement
D.E ZEGOUR Ecole Supérieure d’Informatique
Abdelkader Heni FUNDP Syntaxe et sémantique Abdelkader Heni FUNDP
Hiver 2004SEG2501 Chapître 41 Chapître 4 SDL – structure d’un système et son comportement.
Chap 1 Grammaires et dérivations.
Chap 2. L'analyse descendante
1 Initiation aux bases de données et à la programmation événementielle VBA sous ACCESS Cours N° 4 Support de cours rédigé par Bernard COFFIN Université.
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels
Transcription de la présentation:

IFT313 Introduction aux langages formels Froduald Kabanza Département d’informatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313 Automates à pile

Sujets C’est quoi un automate à pile ? Quel est le langage accepté par un automate à pile? Quelle est la correspondance entre un automate à pile et une grammaire hors-contexte? Quelle est la correspondance entre un automate à pile et un automate fini? IFT313 © Froduald Kabanza

Objectifs Savoir décrire un automate à pile acceptant un langage donné ? Savoir simuler l’exécution d’un automate à pile ? Exprimer le pouvoir d’expressivité d’un automate à pile ? IFT313 © Froduald Kabanza

Rappel Exp Þ Productions 1. Exp → num 2. Exp → ( Exp ) Le problème d’analyse syntaxique (parsing) est : étant donné une chaîne de lexèmes (tokens) et une grammaire déterminer si oui ou non la chaîne est dérivable de la grammaire et si oui, donner la séquence de dérivation ou un arbre d’analyse (ou un arbre syntaxique). Exemple : est-ce que (num + num) * num est syntaxiquement correcte? Grammaire Dérivation Arbre d’analyse Exp Þ Exp Exp * Productions 1. Exp → num 2. Exp → ( Exp ) 3. Exp → Exp + Exp 4. Exp → Exp * Exp Symbole de départ Exp * Exp Þ Exp * num Þ Exp ( ) num (Exp) * num Þ Exp + (Exp + Exp) * num Þ (Exp + num) * num Þ num num (num + num) * num IFT313 © Froduald Kabanza

Automate à pile L’approche pour analyser la syntaxe du code source d’un programme est de scanner le programme de gauche à droite, en cherchant une dérivation qui génère ce programme. Le modèle de base d’un programme qui fait une telle analyse est un automate à pile (en anglais: pushdown automaton ou stack automaton). C’est une généralisation de la notion d’automate fini à des grammaires hors-contexte. Comme expliqué auparavant, les automates finis peuvent analyser seulement la syntaxe d’une grammaire régulière. Pour analyser la syntaxe d’une grammaire hors-contexte, nous ajoutons une pile à un automate fini pour obtenir un modèle de programmes plus puissant connu sous le nom de “automate à pile”. IFT313 © Froduald Kabanza

Modèle général Dans cette leçon on voit une modèle générale d’automate à pile, valide pour les grammaires hors-contexte en général. Par la suite nous verrons des modèles d’automates à pile LL et LR, qui correspondent, respectivement aux analyseurs syntaxiques LL et LR, c-à-d., à des sous-ensembles de grammaires hors-contexte pouvant être analysés efficacement. En fait nous verrons que des parseurs LL et LR ne sont rien d’autres que des automates à piles implémentés efficacement. Nous verrons aussi comment ces parseurs peuvent être générés automatiquement à partir d’une grammaire. D’ici là, nous utiliserons des exemples artificiels très simples. IFT313 © Froduald Kabanza

Limite des automates finis Nous avons vu qu’un automate fini est un modèle de programme avec un nombre fini d’états. Par conséquent, il a nombre fini d’actions ou transitions qu’il peut effectuer. Comme il a un nombre fini d’états et de transitions, il est très simple à programmer et même à visualiser graphiquement. Par contre il ne peut pas analyser le langage généré par une grammaire hors-contexte. Il peut seulement analyser le langage généré par une grammaire régulière. IFT313 © Froduald Kabanza

Automate à pile Un automate à pile ressemble à un automate fini. Il a : un flux (stream) de lecture et un pointeur vers le prochain symbole (lexème/token) à lire; un nombre fini d’états, y compris un état initial et des états accepteurs; une relation de transition. La différence est qu’un automate à pile a en plus une pile, initialement vide, mais pouvant croître arbitrairement. Le contenu de la pile fait partie de la configuration (~ état) d’un automate. Donc un automate à pile a potentiellement un nombre infini de configurations (~ d’états). IFT313 © Froduald Kabanza

Automate à pile Un automate à pile a : Une entrée et une tête de lecture. Un nombre fini d’états dont un état initial et des états accepteurs. Une relation de transition. Une pile pouvant croître arbitrairement. Un alphabet d’entrée (terminaux d’une grammaire); Un alphabet de la pile (terminaux et non terminaux d’une grammaire) Automate à pile entrée pile $ IFT313 © Froduald Kabanza

Automate à pile L’entrée est une chaîne de tokens scanné à partir du code source du programme à analyser. La pile contient une chaîne de symboles de l’alphabet de la pile (terminaux et non-terminaux de la grammaire) Les transitions indiquent comment mettre à jour le contenu de la pile en fonction du token courant. Automate à pile entrée pile 1 2 3 4 $ IFT313 © Froduald Kabanza

Automate à pile Comment définir un automate à pile correspondant à une grammaire? Le principe de base est de mettre sur la pile des symboles de la grammaire qui correspondent (match) au préfixe de l’entrée lue jusque là et d’utiliser cette information d’une certaine façon pour déterminer la production à appliquer à la prochaine étape de dérivation. Ceci deviendra clair avec des exemples. Automate à pile entrée pile 1 2 3 4 $ IFT313 © Froduald Kabanza

Automate à pile : définition formelle Un automate à pile non-déterministe (ou simplement automate à pile) est un tuple : M = (S,V,A,R,s0,F,$), tel que : S est une ensemble fini d’états. V est l’alphabet de la pile A est l’alphabet d’entrée R: (S × A*× V*)  (S × V*) est la relation de transitions Autrement dit, la relation spécifie pour chaque état dans S, sous-chaîne lue de l’entrée (A*) et sous-chaîne en haut de la pile (V*), le prochain état (dans S) et la sous-chaîne à mettre au sommet de la pile à la place de celle dans l’antécédent de la relation. s0 (dans S) est l’état initial. F (inclus dans S) est un ensemble d’états accepteurs. $ est le symbole initialement au fond de la pile et dénote aussi la fin de l’entrée (fin de fichier). IFT313 © Froduald Kabanza

Transitions Une transition de la forme (p, u, b)  (q, g) signifie que l’automate peut passer de l’état p à l’état q, pourvu que la chaîne d’entrée commence par le préfixe u et le la chaîne b est au sommet de la pile. Après la transition, u est lu et consommé du mot d’entrée, b est enlevé de la pile et remplacé par g, et le nouvel état devient q. La chaîne b est lue de gauche à droite : son premier caractère doit donc être au sommet de la pile. La chaîne g est écrite de telle façon que son premier caractère soit au sommet de la pile. entrée pile p q $ u b g IFT313 © Froduald Kabanza

Configurations, trace, acceptation La configuration d’un automate est un triplet (S, V*, A*), indiquant, respectivement, son état courant, le contenu de la pile, et la partie de l’entrée qui reste à lire. Une trace (ou exécution) d’un automate sur une entrée est la séquence de configurations qu’il produit en lisant son entrée et en suivant ses transitions. Une exécution accepte une chaîne d’entrée si la dernière configuration est de la forme (p, $, $), avec p un état accepteur. En d’autre mot, dans la dernière configuration, la pile est vide, on est à la fin de l’entrée et l’état est accepteur. IFT313 © Froduald Kabanza

Automates à pile déterministe Un automate à pile est déterministe s’il a une seule exécution possible pour toute entrée donnée. Sinon, il est non-déterministe. Contrairement aux automates finis, il n’est pas toujours possible d’avoir un automate à pile déterministe correspondant à un automate à pile non-déterministe. Les analyseurs lexicaux pratiques (inclus ceux que nous allons étudier) sont basés sur des automates à pile déterministes. Pour toute grammaire hors-contexte, il existe un automate à pile non-déterministe acceptant le langage généré par la grammaire. IFT313 © Froduald Kabanza

Exemple 1 M = (S,V,T,R,s,S,$), tel que: S = {s,p} V = {A} T = {a,b} R = { (s, a, ε)  (s, A), (s, ε, $)  (p, ε), (s, b, A) (p, ε), (p, b, A) (p, ε)} La deuxième transition est inutile. En la supprimant on obtient un automate déterministe équivalent. Automate à pile non-déterministe correspond à la grammaire G = (V,A,R,S), tel que : V = {S} A = {a,b} R = {S ® ε, S ® aSb} L(G) = {an bn | n >= 0}, c-à-d., chaîne commençant par des a suivi d’autant de b. IFT313 © Froduald Kabanza

Exemple 1 (représentation graphique) M = (S,V,T,R,s,S,$), tel que: S = {s,p} V = {A} T = {a,b} R = { (s, a, ε)  (s, A), (s, b, A) (p, ε), (p, b, A) (p, ε)} L(M) = {an bn | n >= 0} Représentation graphique de l’automate a, ε/A b, A/ε b, A/ε s p IFT313 © Froduald Kabanza

Exemple 1 (Exécutions) M = (S,V,T,R,s,S,$) : S = {s,p} V = {A} Rappel : configuration: (état, pile, reste-de-l’entrée) M = (S,V,T,R,s,S,$) : S = {s,p} V = {A} T = {a,b} R = { (s, a, ε)  (s, A), (s, ε, $)  (p, ε), (s, b, A) (p, ε), (p, b, A) (p, ε)} L(M) = {an bn | n ≥ 0} Entrée: aabb Entrée: aabbb (s, $, aabbb$) (s, $A, abbb$) (s, $AA, bbb$) (p, $A, bb$) (p, $, b$) (s, $, aabb$) (s, $A, abb$) (s, $AA, bb$) (p, $A, b$) (p, $, $) Rejette. Aucune autre exécution n’accepte. Donc, aabbb n’est pas dans le langage. Accepte IFT313 © Froduald Kabanza

Exemple 2 Automate non-déterministe correspondant à la grammaire : M = (S,V,T,R,s,S,$) : S = {s,p} V = {A,B} T = {a,b} R = { (s, a, ε)  (s, A), (s, b, ε) (s, B), (s, ε, ε) (p, ε), (p, a, A) (p, ε), (p, b, B) (p, ε)} G = (V,A,R,S), tel que: V = {S} A = {a,b} R = {S ® ε, S ® aSa, S ® bSb} L(G) = {w wR | w est dans A*}, c-à-d., un palindrome: chaîne concaténé avec son inverse IFT313 © Froduald Kabanza

Exemple 2 (Exécutions) M = (S,V,T,R,s,S,$) : Rappel : configuration: (état, pile, reste-de-l’entrée) M = (S,V,T,R,s,S,$) : S = {s,p} V = {A,B} T = {a,b} R = { (s, a, ε) -> (s, A), (s, b, ε) ->(s,B), (s, ε, ε) ->(p,ε), (p, a, A) ->(p,ε), (p, b, B) ->(p,ε)} L(M) = {w wR | w est dans T*} Input: abba Input: abab (s, $, abab$) (s, $A, aab$) (s, $AB, ab$) (p, $AB, ab$) Pas de transition ! (s, $, abba$) (s, $A, bba$) (s, $AB, ba$) (p, $AB, ba$) (p, $A, a$) (p, $,$) Accepte. Il y a des exécutions qui n’acceptent pas. Mais abba est dans le langage puisque au moins une exécution accepte. Rejette. Aucune autre exécution n’accepte. Donc abab n’est pas dans le langage. IFT313 © Froduald Kabanza

Discussion M = (S,V,T,R,s,S,$) : L(M) = {w wR | w est dans T*} Cet automate à pile est non-déterministe. Une question intéressante est « y-a-t-il un automate à pile déterministe équivalent? » La réponse est «non». Donc le langage L1 = {w wR | w est dans {a,b}*}, est non-déterministe hors-contexte. Par contre, le langage similaire L2 = {w c wR | w est dans {a,b}*} est déterministe hors-contexte. Intuitivement, avec L2 on peut de manière déterministe vérifier le milieu de la chaîne. Avec L1, on ne peut pas. Exercice: Donner une grammaire hors-contexte et un automate à pile déterministe pour L2. M = (S,V,T,R,s,S,$) : S = {s,p} V = {A,B} T = {a,b} R = { (s, a, ε) -> (s, A), (s, b, ε) ->(s, B), (s, ε, ε) ->(p, ε), (p, a, A) ->(p, ε), (p, b, B) ->(p, ε)} L(M) = {w wR | w est dans T*} IFT313 © Froduald Kabanza

Au delà des langages hors-contexte Bien qu’un automate à pile peut avoir un nombre infini d’états (configurations), il existe des langages qui ne sont pas acceptés par un automate à pile, c-à-d., des langages qui ne sont pas hors-contextes. Exemple: L(M) = {an bn cn | n ≥0} n’est pas hors-contexte. Toutefois, il existe des modèles théoriques de programmes qui accepte un tel langage. En particulier, les machines de Turing sont des généralisations des automates à piles, pouvant accepter n’importe quel langage. IFT313 © Froduald Kabanza

Exercice Étant donné l’alphabet {a,b}, donnez : Une grammaire générant le langage composé de mots ayant le même nombre de a et de b, peu importe l’ordre dans lequel ces deux symboles apparaissent dans le mot. (b) Un automate à pile (non-déterministe) acceptant le même langage. IFT313 © Froduald Kabanza

M = ({s0},{A,B},{a,b},R, s0,{s0},$) : Solution Automate à pile correspondant Grammaire générant le langage composé de mots ayant le même nombre de a et de b G = (V,A,R,S), tel que: V = {S} A = {a,b} R = { S  ε S  aSbS S  bSaS } M = ({s0},{A,B},{a,b},R, s0,{s0},$) : a, A/AA a, $/$A a, B/ε s0 b, A/ ε b, B/BB b, $/$B IFT313 © Froduald Kabanza

Résumé Un automate à pile est un modèle de programme simple pour l’analyse syntaxique. Les parsers LL et LR sont fondamentalement des automates à pile déterministes. On les obtient en imposant des restrictions sur les grammaires hors-contexte. En général ces restrictions sont acceptables pour les langages de programmation courants. Les quelques prochaines leçons sera sur les parsers LL. Nous verrons les parsers LR vers la fin. IFT313 © Froduald Kabanza