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

Présentations similaires


Présentation au sujet: "IFT313 Introduction aux langages formels"— Transcription de la présentation:

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

2 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

3 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

4 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

5 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

6 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

7 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

8 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

9 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

10 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 : (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

11 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

12 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

13 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

14 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

15 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

16 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

17 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

18 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

19 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

20 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

21 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

22 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

23 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

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

25 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

26 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

27 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

28 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

29 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

30 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

31 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

32 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

33 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

34 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

35 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

36 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

37 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

38 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

39 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

40 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

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


Télécharger ppt "IFT313 Introduction aux langages formels"

Présentations similaires


Annonces Google