La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313.

Présentations similaires


Présentation au sujet: "IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313."— Transcription de la présentation:

1 IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313 Grammaires

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

3 IFT313© Froduald Kabanza3 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 darbre danalyse. Pouvoir expliquer ce quune grammaire ambiguë.

4 IFT313© Froduald Kabanza4 Rappel Nous avons vu quun langage est un ensemble de mots (chaîne de caractères). Pour les langages réguliers (par exemple, le langage de tokens dun 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 dun programme reconnaissant les mots du langages.

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

6 IFT313© Froduald Kabanza6 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.

7 IFT313© Froduald Kabanza7 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 lexpression 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 dun langage plus complet tel que C/C++ ou Java.

8 IFT313© Froduald Kabanza8 Rappel (suite) On peut décrire le langage des expressions arithmétiques par les règles syntaxiques suivantes: Une expression est un nombre, ou laddition 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 daddition and de multiplication.

9 IFT313© Froduald Kabanza9 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 lensemble 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.

10 IFT313© Froduald Kabanza10 Rappel (suite) De manière général, le langage défini par une grammaire est lensemble 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 : (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.

11 IFT313© Froduald Kabanza11 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 quavec 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 dautomate plus puissant, appeléautomate à pile, ayant un nombre fini détats et une pile de taille arbitraire.

12 IFT313© Froduald Kabanza12 Grammaires Le principe de base derrière les grammaires est de spécifier des règles de réécriture des mots dun langage. Les règles de réécriture indiquent comment des séquences de symboles peuvent être remplacée par dautres 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 dun symbole spécial appelé le symbole de départ.

13 IFT313© Froduald Kabanza13 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 lalphabet. 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.

14 IFT313© Froduald Kabanza14 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 }

15 IFT313© Froduald Kabanza15 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 Symbole de départ Productions 1. Exp num 2. Exp ( Exp ) 3. Exp Exp + Exp 4. Exp Exp * Exp Exp * Exp Exp * num (Exp + Exp) * num (Exp + num) * num (num + num) * num (Exp) * num

16 IFT313© Froduald Kabanza16 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 * }

17 IFT313© Froduald Kabanza17 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 et representent des mots (chaînes) de symboles de grammaires (possiblement avec des terminaux et des non-terminaux).

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

19 IFT313© Froduald Kabanza19 Exemple Les productions Exp Exp Op Exp Exp ( Exp ) Exp num Op + Op * peuvent aussi sécrire Exp Exp Op Exp | (Exp) | num Op + | *

20 IFT313© Froduald Kabanza20 Dérivation Le processus de générer une chaîne de symboles dune 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.

21 IFT313© Froduald Kabanza21 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

22 IFT313© Froduald Kabanza22 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

23 IFT313© Froduald Kabanza23 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 v 0, …,v k dans (VU) * pour k 0, telle que : u = v 0 v=v k v i v i+1 for 0 i k. *G*G *

24 IFT313© Froduald Kabanza24 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 lexpression ( )*81 *

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

26 IFT313© Froduald Kabanza26 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 lensemble de mots générés par G : L(G) = {v dans A * | S v } *G*G *G*G

27 IFT313© Froduald Kabanza27 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 lensemble dont les mots sont des expressions arithmétiques en notation infixée, avec seulement les entiers, laddition et la multiplication.

28 IFT313© Froduald Kabanza28 Exemple 2 G = ({S}, {a,b}, R, S) telle que R = {S ε, S aSb} L(G) est lensemble de chaînes de la forme a n b n, avec n0.

29 IFT313© Froduald Kabanza29 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 Symbole de départ Productions 1. Exp num 2. Exp ( Exp ) 3. Exp Exp + Exp 4. Exp Exp * Exp Exp * Exp (Exp) * Exp (num + Exp) * Exp (num + num) * Exp (num + num) * num (Exp + Exp) * Exp

30 IFT313© Froduald Kabanza30 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 Symbole de départ Productions 1. Exp num 2. Exp ( Exp ) 3. Exp Exp + Exp 4. Exp Exp * Exp Exp * Exp Exp * num (Exp + Exp) * num (Exp + num) * num (num + num) * num (Exp) * num

31 IFT313© Froduald Kabanza31 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 dautres mots, v est dérivable de la grammaire. Si v est une forme sententielle constitué uniquement de terminaux, on dit aussi que cest 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*G

32 IFT313© Froduald Kabanza32 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.

33 IFT313© Froduald Kabanza33 Parsers LL (Top-down) Les parsers LL (appelés aussi top-down parsers) valident la syntaxe dune chaîne de tokens (le code dun 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 (doù le « top »), en allant vers la chaîne à dériver, c-à-d., vers le bas (doù 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.

34 IFT313© Froduald Kabanza34 Analyse syntaxique LR (ou Bottom-up) Les analyseurs LR ( appelés aussi bottom-up) valident la syntaxe dune chaîne de tokens (le code dun 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 (doù le « bottom »), en allant vers le symbole de départ de la grammaire, c-à-d., vers le haut (doù 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

35 IFT313© Froduald Kabanza35 Arbres danalyses Un arbre danalyse est un arbre obtenu à partir dune dérivation en connectant chaque symbole au symbole à partir du quel il est dérivé. Exemple: Exp Symbole de départ Productions 1. Exp num 2. Exp ( Exp ) 3. Exp Exp + Exp 4. Exp Exp * Exp Exp * Exp Exp * num (Exp + Exp) * num (Exp + num) * num (num + num) * num (Exp) * num Exp * num Exp() + GrammaireDérivationArbre danalyse

36 IFT313© Froduald Kabanza36 Grammaires ambiguës Une grammaire est ambiguë si on peut en dériver une chaîne avec deux arbres danalyse 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 danalyse 1 Exp * + num Exp num Arbre danalyse 2 Exp + num * Exp num Exp num

37 IFT313© Froduald Kabanza37 Grammaires ambiguës Plus tard nous verrons que les grammaires ambiguës sont problématiques puisquelles donnent naissance à plusieurs interprétations différentes dune 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 lapplication des règles de la grammaire.

38 IFT313© Froduald Kabanza38 Types de grammaires Il existe plusieurs types de grammaires avec un pouvoir dexpressivité 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 dune grammaire est de la forme 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 telle que C-à-d., la partie droite dune production doit contenir au moins autant de symboles que la partie gauche, excepté pour la production S ε.

39 IFT313© Froduald Kabanza39 Types de grammaires (suite) Grammaires de Type 2 (hors-contexte - context-free) : Les productions sont de la forme tel que A est un non-terminal. Grammaires de Type 3 (régulières - regular) : Les productions sont de la forme B, B, ou ε tels que A et B sont des non-terminaux et 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.

40 IFT313© Froduald Kabanza40 Types de grammaires (suite) Pour lanalyse 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 jusquici sont des grammaires hors- contexte.

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


Télécharger ppt "IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313."

Présentations similaires


Annonces Google