IFT313 Introduction aux langages formels

Slides:



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

DTD Sylvain Salvati
Système formel Nous avons introduit : signes de variables (x, y, z, …), de constantes (0, 1), d’opérations (+, ), de relations (=, ) Axiomes : ce sont.
Chap 1 Grammaires et dérivations.
INTRODUCTION.
Introduction : Compilation et Traduction
Expressions rationnelles
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
IFT313 – Introduction aux langages formels Eric Beaudry Département dinformatique Université de Sherbrooke Laboratoire 4 – JFlex Été 2010.
IFT313 Introduction aux langages formels
Points importants de la semaine Les types arithmétiques. Les opérateurs.
Cours de programmation
IFT313 Introduction aux langages formels
Introduction : Compilation et Traduction
Partie 1 Etude de l'existant
IFT 615 – Intelligence artificielle Agents intelligents
Points importants de la semaine Les boucles. Les types arithmétiques. Les opérateurs.
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
Initiation à la conception de systèmes d'information
Chapitre 2: Les régularités et les relations
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
I.A. Session 2009/2010 E.P.S.I. Bordeaux – C.S.I.I – 2 ème Année – Cours n°3.
RDF(S)
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels
Techniques de test Boulanger Jean-Louis.
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
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 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke JavaCC.
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.
Expressions régulières et hash tables
1 CSI3525: Concepts des Languages de Programmation Notes # 3: Description Syntaxique des Languages.
CSI3525: Concepts des Languages de Programmation
Chapitre 1 Le Sens des nombres
Applications des langages hors-contextes Les analyseurs syntactiques ascendants GNU Yacc et Bison.
Chapitre 3 Syntaxe et sémantique.
Analyse lexicale et syntaxique
Les langages Syntaxe et sémantique Grammaires Sémantique axiomatique.
Description des langages
Rappel Modèle analyse-synthèse de la compilation
Paradigmes des Langages de Programmation
RESEAU.
INTRODUCTION.
Programmation linéaire en nombres entiers
CSI3525: Concepts des Langages de Programmation Notes # 13: Introduction au SmallTalk.
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)
IFT313 – Introduction aux langages formels Eric Beaudry Département d’informatique Université de Sherbrooke Laboratoire sur JFLEX Été 2010.
Hiver 2004SEG2501 Chapître 41 Chapître 4 SDL – structure d’un système et son comportement.
Chap 1 Grammaires et dérivations.
CSI 3525, Grammaires, page 1 Description des langages –Syntaxe et sémantique –Grammaires –Sémantique axiomatique.
Scripts et fonctions Instructions de contrôle
Chapitre 4 La représentation des nombres.
Philippe Gandy - 8 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Chap. 3 Récursion et induction. Les définitions par récurrence consistent à construire des objets finis, à partir d'autres, selon certaines règles. Les.
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 Grammaires

Sujets Rappel : langages, expressions régulières, automates finis. C’est quoi une grammaire ? C’est quoi le langage généré par une grammaire ? C’est quoi une dérivation ? C’est quoi un arbre d’analyse ? C’est quoi une grammaire ambiguë ? Quelles sont les différentes types de grammaires C’est quoi une grammaire hors-contexte ? IFT313 © Froduald Kabanza

Objectifs Savoir reconnaître et expliquer les différentes types de grammaires. Pouvoir donner une grammaire qui génère un langage donné. Pouvoir décrire le langage généré par une grammaire donnée. Connaître le rapport entre les grammaires et les automates finis. Pouvoir expliquer le concept d’arbre d’analyse. Pouvoir expliquer ce qu’une grammaire ambiguë. IFT313 © Froduald Kabanza

Rappel Nous avons vu qu’un langage est un ensemble de mots (chaîne de caractères). Pour les langages réguliers (par exemple, le langage de tokens d’un langage de programmation), plutôt que d’énumérer les mots explicitement, on spécifie une expression régulière décrivant le langage ou on donne un automate fini acceptant le langage. Les expressions régulières décrivent un langage de manière déclarative en indiquant des patterns qui sont matchés par des mots du langage. Les automates finis décrivent le langage de manière analytique par un modèle simple d’un programme reconnaissant les mots du langages. IFT313 © Froduald Kabanza

Rappel (suite) Ces deux formes de description d’un langage sont complémentaire et il est utile d’avoir les deux. Le style déclaratif des expressions régulières est utile lorsqu’on veut décrire le langage plutôt que de le reconnaître. C’est le cas lorsqu’on définit une spécification JFlex. Le style analytique des automates est utile lorsqu’on veut reconnaître le langage. Par exemple, si on veut implémenter un analyseur lexical directement, ou programmer un générateur d’analyseurs lexicaux. IFT313 © Froduald Kabanza

Rappel (suite) Il y a une autre approche pour décrire les langages : approche générative. Avec une approche générative on décrit comment le langage est généré en donnant une grammaire. IFT313 © Froduald Kabanza

Rappel (suite) Par exemple, considérons le langage des expressions arithmétiques valides pour une calculatrice comme bc sous UNIX. Après avoir fait la commande bc sous UNIX, vous pouvez tapez une expression arithmétique telle que 3*5*(7+5). ensuite bc évalue l’expression et affiche le résultat. Les expressions arithmétiques constituent le “langage de programmation” de bc. Vous pouvez le voir comme un tout petit sous-ensemble d’un langage plus complet tel que C/C++ ou Java. IFT313 © Froduald Kabanza

Rappel (suite) On peut décrire le langage des expressions arithmétiques par les règles syntaxiques suivantes: Une expression est un nombre, ou l’addition de deux expressions, ou la multiplication de deux expressions, ou une expression entre parenthèse. Pour garder les choses simples, nous considérons uniquement des expressions avec les opérations d’addition and de multiplication. IFT313 © Froduald Kabanza

Rappel (suite) Les programmeurs vont spécifier de telles règles syntaxique dans une forme d’écriture dite de Backus-Naur : Exp ® num Exp ® ( Exp ) Exp ® Exp + Exp Exp ® Exp * Exp Ces règles décrivent le langage des expressions arithmétiques, c-à-d., le langage dont l’ensemble de mots sont les chaînes formés uniquement des symboles terminaux num, (, ), + et * , et respectant la syntaxe indiquée par les règles. Une règle de la grammaire est aussi appelé une règle de production ou une règle de réécriture. IFT313 © Froduald Kabanza

Rappel (suite) De manière général, le langage défini par une grammaire est l’ensemble de chaînes de terminaux obtenu en appliquant récursivement les règles de la grammaire, à partir du symbole de départ. Par défaut le symbole de départ est le premier symbole non-terminal mentionné dans les règles de productions. Voici des exemples des mots dans le langage généré par la grammaire précédente : 0 121 1+2 1+20 1+(5*7) Notez que les nombres sont en réalité représentés par des tokens num, qui est un symbole terminal terminal dans la grammaire. Pour obtenir le vrai langage, il faut donc remplacer les tokens par leurs textes correspondants. IFT313 © Froduald Kabanza

En résumé Nous allons utiliser une grammaire pour décrire un langage de programmation : Elle permet de tenir compte de la syntaxe mieux que les expressions régulières. Nous pouvons décrire plus de langages en utilisant les grammaires qu’avec les expressions régulières. Les expressions régulières sont juste bon pour décrire un langage de tokens. Toutefois, pour implémenter un analyseur syntaxique (parser) pour le langage, une fois de plus nous utiliserons un automate. Mais pas un automate fini. Nous utiliserons un type d’automate plus puissant, appelé “automate à pile”, ayant un nombre fini d’états et une pile de taille arbitraire. IFT313 © Froduald Kabanza

Grammaires Le principe de base derrière les grammaires est de spécifier des règles de réécriture des mots d’un langage. Les règles de réécriture indiquent comment des séquences de symboles peuvent être remplacée par d’autres séquences de symboles pour obtenir des mots du langage. Les mots du langage sont ceux pouvant être obtenus en appliquant les règles de réécriture, à partir d’un symbole spécial appelé le symbole de départ. IFT313 © Froduald Kabanza

Définition formelle Une grammaire G est un quadruple G=(V,A,R,S) tel que : V est un ensemble fini de symboles non-terminaux, appelé aussi variables. A est un ensemble fini de symboles terminaux, appelé aussi l’alphabet. R dans ((V U A)+ × (V U A)*) est un ensemble fini de règles de réécriture, appelés aussi règle de productions S dans V est le symbole de départ. Les ensembles de symboles V et A doivent être disjoints. Seuls les symboles terminaux formes les mots du langage. Les symboles non-terminaux sont là juste pour aider à générer le langage. La génération du langage commence toujours par le symbole de départ S. IFT313 © Froduald Kabanza

Exemple Nous avons déjà vu la grammaire du langage des expressions arithmétiques avec les opérations + et *. La voici cette fois-ci de manière précise : G = (V, A, R, Exp), tel que : V = {Exp} A = {(, ), +, *, num} R = { Exp ® num Exp ® ( Exp ) Exp ® Exp + Exp Exp ® Exp * Exp } IFT313 © Froduald Kabanza

Exemple (suite) La chaine (36+4)*50 ou plus exactement (num+num)*num, fait partie du langage généré par la grammaire précédente. En effet, elle est générée comme suit : Exp Exp * Exp Symbole de départ Exp * num Productions 1. Exp → num 2. Exp → ( Exp ) 3. Exp → Exp + Exp 4. Exp → Exp * Exp (Exp) * num (Exp + Exp) * num (Exp + num) * num (num + num) * num IFT313 © Froduald Kabanza

Un autre exemple En général, on peut avoir plusieurs grammaires générant le même langage. Par exemple, la grammaire suivante génère le même langage que la précédente : G = (V, A, R, Exp), tel que : V = {Exp, Op} A = {(, ), +, *, num} R = { Exp ® Exp Op Exp Exp ® ( Exp ) Exp ® num Op ® + Op ® * } IFT313 © Froduald Kabanza

Conventions S dénote souvent le symbole de départ dans des exemples artificiels. Les lettres en majuscule sont des non-terminaux. Les lettres en minuscule sont des terminaux. Les lettres grecs en minuscules tels que a, b,g,d et s representent des mots (chaînes) de symboles de grammaires (possiblement avec des terminaux et des non-terminaux). IFT313 © Froduald Kabanza

Conventions Lorsque nous avons plusieurs productions avec la même partie de gauche, comme par exemple: X ® a X ® b X ® s On les écrit en utilisant une seule production-multiple comme suit: X ® a | b | s IFT313 © Froduald Kabanza

Exemple Exp ® Exp Op Exp peuvent aussi s’écrire Les productions Exp ® Exp Op Exp Exp ® ( Exp ) Exp ® num Op ® + Op ® * peuvent aussi s’écrire Exp ® Exp Op Exp | (Exp) | num Op ® + | * IFT313 © Froduald Kabanza

Dérivation Le processus de générer une chaîne de symboles d’une grammaire en appliquant une production est appelé une dérivation de la chaîne. Si une seule production est appliqué, une seule fois, pour produire une chaîne, on parle de dérivation en une étape. Si plusieurs productions sont utilisées ou une production plusieurs fois, on parle de dérivation en plusieurs étapes. La dérivation en zéro étapes donne la chaîne elle-même. IFT313 © Froduald Kabanza

Dérivation en une étape Soit G = (V,A,R,S) et u une chaîne dans (VUA)+ et v dans (VUA)*. La grammaire G dérive v de u en une étape (noté u Þ v, ou u Þ v lorsque G est sous-entendu) si et seulement si il y a des chaînes x et y dans V* telles que: u = xu’y v=xv’y u’ ® v’ est une production dans R G IFT313 © Froduald Kabanza

Exemple Soit la grammaire G = (V, A, R, Exp) telle que: V = {Exp} A = {(, ), +, *, num} R = { Exp ® num Exp ® (Exp) Exp ® Exp + Exp Exp ® Exp * Exp } En une étape, on peut seulement dériver des chaînes qui sont des parties droites des règles de production, à partir du symbole de départ Exp. num Exp Þ num ( Exp ) Exp Þ (Exp) Exp + Exp Exp Þ Exp + Exp Exp * Exp Exp Þ Exp * Exp IFT313 © Froduald Kabanza

Dérivation en plusieurs étapes Soit G = (V,A,R,S) et u dans (VUA)+ et v dans (VUA)*. La grammaire G dérive v de u en zéro ou plusieurs étapes (noté u Þ v ou u Þ v si G est sous-entendu) si et seulement si il existe des chaînes v0, …,vk dans (VU)* pour k³0, telle que : u = v0 v=vk vi Þ vi+1 for 0£ i £ k. * G * IFT313 © Froduald Kabanza

Exemple Soit encore une fois la grammaire G = (V, A, R, Exp), telle que: V = {Exp} A = {(, ), +, *, num} R = { Exp ® num Exp ® ( Exp ) Exp ® Exp + Exp Exp ® Exp * Exp } En plusieurs étapes on peut dériver la chaîne (num+num)*num à partir du symbole de départ: Exp Þ (num+num)*num Dépendamment du texte scanné pour les tokens num, cette chaîne pourrait représenter l’expression (234 + 10)*81 * IFT313 © Froduald Kabanza

Exemple (suite) Dérivation de la chaîne (num+num)*num. Exp Þ Exp * Exp Symbole de départ Exp * num Þ Productions 1. Exp → num 2. Exp → ( Exp ) 3. Exp → Exp + Exp 4. Exp → Exp * Exp (Exp) * num Þ (Exp + Exp) * num Þ (Exp + num) * num Þ (num + num) * num IFT313 © Froduald Kabanza

Langage généré par une grammaire Les mots générés par une grammaire G = (V, A, R, S), sont les chaînes v dans A* (c-à-d., composés seulement de terminaux) dérivables à partir du symbole de départ c-à-d., les chaînes v telles que S Þ v Le langage généré par une grammaire G = (V, A, R, S), (noté L(G)) est l’ensemble de mots générés par G : L(G) = {v dans A* | S Þ v } * G * G IFT313 © Froduald Kabanza

Exemple 1 Soit encore une fois la grammaire G = (V, A, R, Exp), telle que: V = {Exp} A = {(, ), +, *, num} R = { Exp ® num Exp ® ( Exp ) Exp ® Exp + Exp Exp ® Exp * Exp } L(G) est l’ensemble dont les mots sont des expressions arithmétiques en notation infixée, avec seulement les entiers, l’addition et la multiplication. IFT313 © Froduald Kabanza

Exemple 2 G = ({S}, {a,b}, R, S) telle que R = {S ® ε, S ® aSb} L(G) est l’ensemble de chaînes de la forme anbn, avec n≥0. IFT313 © Froduald Kabanza

Dérivation la plus à gauche (lefttmost) Une dérivation la plus à gauche est une dérivation dont chaque étape remplace le non-terminal le plus à gauche. Exemple : Exp Þ Exp * Exp Þ Symbole de départ (Exp) * Exp Þ Productions 1. Exp → num 2. Exp → ( Exp ) 3. Exp → Exp + Exp 4. Exp → Exp * Exp (Exp + Exp) * Exp Þ (num + Exp) * Exp Þ (num + num) * Exp Þ (num + num) * num IFT313 © Froduald Kabanza

Dérivation la plus à droite (rightmost) Une dérivation la plus à droite est une dérivation dont chaque étape remplace le non-terminal le plus à droite. Exemple : Exp Þ Exp * Exp Þ Symbole de départ Exp * num Þ Productions 1. Exp → num 2. Exp → ( Exp ) 3. Exp → Exp + Exp 4. Exp → Exp * Exp (Exp) * num Þ (Exp + Exp) * num Þ (Exp + num) * num Þ (num + num) * num IFT313 © Froduald Kabanza

Notion de forme sententielle Étant donné une grammaire G = (V, A, R, S), une chaine v dans (VUA)* est appelée une forme sentantielle (sentatial form) si et seulement si S Þ v. En d’autres mots, v est dérivable de la grammaire. Si v est une forme sententielle constitué uniquement de terminaux, on dit aussi que c’est une phrase (sentence). Si v est dérivé par une dérivation la plus à gauche, on parle de forme sentielle gauche (left sentential form). De manière analogue, si v est dérivé par une dérivation la plus à gauche, on parle de forme sententielle droite (right sentential form). * G IFT313 © Froduald Kabanza

Parsers LL et LR Les analyseurs syntaxiques utilisent soit la dérivation la plus à gauche ou la dérivation la plus à droite. Les parsers qui utilisent la dérivation la plus à gauche sont appelés des parsers LL pour “Left-to-right scan and Leftmost derivation of the input”. Les parsers qui utilisent la dérivation la plus à droite sont appelés des parsers LR pour “Left-to-right scan and Rightmost derivation of the input”. IFT313 © Froduald Kabanza

Parsers LL (Top-down) Les parsers LL (appelés aussi top-down parsers) valident la syntaxe d’une chaîne de tokens (le code d’un programme) en cherchant la dérivation de la plus à gauche de la chaine. La recherche de la dérivation se fait en partant du symbole de départ (d’où le « top »), en allant vers la chaîne à dériver, c-à-d., vers le bas (d’où le « down »). Par exemple, avec la grammaire précédente et la chaîne num + num * num, un analyseur LL produirait la dérivation: Exp => Exp * Exp =>Exp + Exp * Exp=> num + Exp * Exp =>num + num * Exp => num + num * num Les parsers sont définis de tel sorte que si une dérivation ne peut être obtenue, une erreur syntaxique sera indiquée. IFT313 © Froduald Kabanza

Analyse syntaxique LR (ou Bottom-up) Les analyseurs LR ( appelés aussi bottom-up) valident la syntaxe d’une chaîne de tokens (le code d’un programme) en cherchant la dérivation de la plus à droite de la chaine. La recherche de la dérivation se fait en partant de la chaîne à dériver (d’où le « bottom »), en allant vers le symbole de départ de la grammaire, c-à-d., vers le haut (d’où le « up »). Par exemple, avec la grammaire précédente et la chaine num + num * num, on pourrait avoir la dérivation la plus à droute suivante : Exp => Exp * Exp =>Exp * num => Exp + Exp * num =>Exp + num * num =>num + num * num Toutefois, un parseur LR va déterminer cette dérivation en sens inverse, comme suit: num+num * num <= Exp + num * num <= Exp + Exp * num <= Exp * num <= Exp * Exp <= Exp IFT313 © Froduald Kabanza

Arbres d’analyses Un arbre d’analyse est un arbre obtenu à partir d’une dérivation en connectant chaque symbole au symbole à partir du quel il est dérivé. Exemple: 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

Grammaires ambiguës Une grammaire est ambiguë si on peut en dériver une chaîne avec deux arbres d’analyse différents. Exemple : Grammaire: G = ({Exp}, A, R, Exp), telle que: A = {(, ), +, *, num} R = { Exp ® num Exp ® ( Exp ) Exp ® Exp + Exp Exp ® Exp * Exp } Chaîne à dériver : num + num * num Arbre d’analyse 1 Exp * + num Arbre d’analyse 2 Exp + num * IFT313 © Froduald Kabanza

Grammaires ambiguës Plus tard nous verrons que les grammaires ambiguës sont problématiques puisqu’elles donnent naissance à plusieurs interprétations différentes d’une même entrée. Nous allons les éviter en : Définissant des grammaires non-ambiguës qui acceptent le même langage. Utilisant des règles de priorité dans l’application des règles de la grammaire. IFT313 © Froduald Kabanza

Types de grammaires Il existe plusieurs types de grammaires avec un pouvoir d’expressivité différent. Les différents types de grammaires résultent de différentes restrictions sur les productions autorisées. En général, une production d’une grammaire est de la forme a  b. Grammaires de Type 0 : Pas de restriction sur les productions. Grammaires de Type 1 (sensibles au contexte – contexte-sensitive) : Les productions doivent avoir la forme a -> b telle que |a| ≤ |b| C-à-d., la partie droite d’une production doit contenir au moins autant de symboles que la partie gauche, excepté pour la production S ® ε. IFT313 © Froduald Kabanza

Types de grammaires (suite) Grammaires de Type 2 (hors-contexte - context-free) : Les productions sont de la forme A -> b tel que A est un non-terminal. Grammaires de Type 3 (régulières - regular) : Les productions sont de la forme A -> w B, A -> w B, ou A -> ε tels que A et B sont des non-terminaux et w est une chaîne de terminaux ou la chaîne vide. Les grammaires de type 3 sont un sous-ensemble de ceux de type 2, qui sont un sous-ensemble de ceux de type 1, qui sont un sous-ensemble de ceux de type 0. Un langage généré par une grammaire de type de 3 est aussi décrit par une expression régulière et accepté par un automate-fini et vice-versa. IFT313 © Froduald Kabanza

Types de grammaires (suite) Pour l’analyse syntaxique, nous allons utiliser seulement des grammaires de type 2 (hors-contexte). Plus précisément, nous allons étudier des sous-ensembles de grammaires hors-contexte qui permettent une analyse syntaxique efficace: LL(k) et LR(k) . Tous les exemples de grammaires vu jusqu’ici sont des grammaires hors-contexte. IFT313 © Froduald Kabanza

Prochaine leçon Automate à pile pour une grammaire hors-contexte. IFT313 © Froduald Kabanza