Chap 1 Grammaires et dérivations.

Slides:



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

Algorithmes et structures de données avancés
Algorithmique Résume.
24 septembre 2007Cours de compilation 4 - Intranet1 Cours de compilation Techniques danalyse descendantes.
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.
Nicolas Bourbaki.
INTRODUCTION.
Introduction : Compilation et Traduction
Automate asynchrone.
Expressions rationnelles
Chapitre 1 Automates finis
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels
Conception et analyse des algorithmes
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
Introduction : Compilation et Traduction
Géométrie vectorielle
Démarche de résolution de problèmes
Analyse lexicale Généralités Expressions rationnelles Automates finis
Initiation à la conception de systèmes d'information
IFT313 Introduction aux langages formels
Notions de base de la théorie des langages
Équations différentielles.
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
Algorithmique et Programmation
Examen de compilation 4ème année - A
Espaces vectoriels Montage préparé par : S André Ross
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.
Xpath XML Path language par Yves Bekkers
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 Froduald Kabanza Département dinformatique Université de Sherbrooke Grammaires attribuées.
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke Automates à pile LR Notion de poignée.
IFT Complexité et NP-complétude
1 CSI3525: Concepts des Languages de Programmation Notes # 3: Description Syntaxique des Languages.
CSI3525: Concepts des Languages de Programmation
Hiver 2003SEG2501 analyse lexicale1 Notes supplémentaires au sujet de lanalyse lexicale Exemples Dérivation dun NFA qui accepte le même langage (algorithme:
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
Applications des langages hors-contextes Les analyseurs syntactiques ascendants GNU Yacc et Bison.
Chapitre 3 Syntaxe et sémantique.
Analyse lexicale et syntaxique
Mise en oeuvre des MMCs L'utilisation des MMCs en reconnaissance des formes s'effectue en trois étapes : définition de la topologie de la chaîne de Markov,
Partie II Sémantique.
Sémantique dénotationnelle
Les langages Syntaxe et sémantique Grammaires Sémantique axiomatique.
Description des langages
Rappel Modèle analyse-synthèse de la compilation
Modélisation des opérations Spécifier les transformations détat que lon attend des services de la machine Létat dune machine entièrement déterminée par.
IFT Complexité et NP-complétude Chapitre 0 Rappels.
Programmation procédurale Transformations
Paradigmes des Langages de Programmation
O-notation 1. Introduction 2. O-notation 3. Opérations 3.1 Somme 3.2 Produit 4. Règles générales 5. Exemple 6.Analyse des algorithmes récursifs 6.1 Dilatation.
INTRODUCTION.
Algorithmes et Programmation
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)
Introduction et Généralités sur l’Algorithmique
Recherche par automates finis
Module : Langage XML (21h)
Abdelkader Heni FUNDP Syntaxe et sémantique Abdelkader Heni FUNDP
Patricia Renault UPMC 2005/2006
CSI 3525, Grammaires, page 1 Description des langages –Syntaxe et sémantique –Grammaires –Sémantique axiomatique.
Chap 2. L'analyse descendante
Scripts et fonctions Instructions de contrôle
LOGIQUE ET PROGRAMMATION LOGIQUE
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:

Chap 1 Grammaires et dérivations. Une grammaire algébrique (context free) est donnée par : ·        un alphabet terminal A ·        un alphabet de variables (non terminal V) ·        un ensemble de règles de production R de la forme    avec V et (VA)* On a donc RVx(VA)* On note la grammaire G = (V.A.R)

Dérivations La grammaire algébrique est utilisée pour engendrer un langage formel en utilisant des dérivations. Définition Soit ,(VA)* On dit que  dérive  ( ) ssi =12, =12 et que  est une règle de la grammaire (.)R.

Pourquoi grammaire ? · Chaque langage a des règles. ·        Grammaire donne une spécification syntaxique précise facile à comprendre A partir de grammaire on peut facilement construire un analyseur syntaxique qui pourra déterminer si le programme source est correct.  ·        Grammaire bien définie donne une structure au langage de programmation très utile pour la traduction et pour détection des erreurs.  ·        Si le langage évolue c'est bien plus facile d'ajouter des nouvelles constructions si l'implémentation existante est basée sur la description grammaticale du langage.  

Start symbole La dérivation commence toujours par le symbole de début (start symbol ou axiome en français) et on remplace de façon répétée le non-terminal à gauche d'une règle par la partie droite de cette règle de production.

Grammaire des expressions arithmétiques (version 1) Ex. (*) E  E OP E E  (E) E  -E E  id OP  + OP  - OP  * OP  / A={id, +, -, *, /, (, )} V={E, OP} E est start symbol

La signification : E -E signifie qu'une expression précédée par ‘- ‘est aussi une expression. Cette production permet de générer des expressions plus complexes à partir d'expressions plus simples. On peut remplacer E par -E. On peut décrire ça en écrivant E - E, c.a.d. E dérive -E. La production E (E) nous montre qu'on peut remplacer une occurrence de E dans n'importe quelle chaîne des symboles de grammaire par (E). Par exemple, E OP E  (E) OP E ou E OP EE OP (E). On peut prendre E et appliquer des productions dans n'importe quel ordre pour obtenir une séquence de remplacements.

Exemple Ex. E -E-(E) -(id). Une séquence comme ça s'appelle une dérivation de -(id) de E. Cette dérivation montre qu'une chaîne –(id) est une expression valide.

Manière plus abstraite A si A est une production de grammaire et  et  sont des chaînes arbitraires.   Si on a : 1  2 …n. On dit que 1 dérive n. Symbole  signifie dérive immédiatement (dans un seul étape). * Alors : Si on veut dire dérive en 0 ou plus étapes on utilise  1)          pour  + 2)       Si    et  alors   dérive en un ou plus étapes

Définition de L(G) : langage généré par G.  Chaînes contenues dans L(G) peuvent contenir seulement des symboles terminaux de G.   La chaîne de terminaux wL(G) ssi Sw. w est une phrase de G; Le langage qui peut être généré par G est un langage algébrique. Si 2 grammaires génèrent le même langage elles sont équivalentes.

Exemples Ex 1. -(id+id) est une phrase du langage engendré par G parce qu'il y a une dérivation : E-E-(E)  -(E OP E)  -(id OP E)  -(id + E)  -(id+id).

Exemples Ex 2. G’ : a b ou pour simplifier a + b avec A={a, b} et V = {}. Le langage engendré par  est l'ensemble des expressions arithmétiques en notation polonaise préfixe. a : unique symbole d'opérateurs et b : unique symbole de variable. LG() ={b, abb, aabbb, ababb, …}

Exemples Ex 3. H :   ab    A={a, b} V={}   A={a, b} V={} Le langage engendré par H est l'ensemble des expressions bien parenthésées avec a : parenthèse ouvrante, b : parenthèse fermante.

Grammaires et automates finis Les automates finis correspondent à une classe particulière de grammaires algébriques : ce sont les grammaires linéaires dont toutes les règles sont de la forme   a avec V, aA ou bien . Considérons un automate fini A=(Q, I, T, F) et la grammaire G ayant comme ensemble de variables l'ensemble Q des états de A et comme règles p aq pour toutes les flèches (p.a.q) de A et des règles t  pour tout tT. Le langage engendré par la grammaire G à partir des variables de I est égal au langage reconnu par l'automate. On a une dérivation p  wq dans G ssi  un chemin p q, étiquetté par w dans A. (par recurrence sur la longueur de w).

Réciproquement, si G = (V, A, R) est une grammaire linéaire on construit A=(Q,i,T,F) qui reconnaît le langage engendré par G en prenant Q=V, i=start, F={(.a.)|   a} et T={V| } a b b reconnaît le langage    a + b   b + a +   

Pourquoi utiliser les expressions rationnelles pour définir le syntaxe lexicale d'un langage ? · Les règles lexicales sont souvent très simples, et alors pour les décrire on n'a pas besoin d'une notation aussi puissante que grammaires · Expressions rationnelles donnent une notation pour décrire les lexèmes plus facile à comprendre que des grammaires.

Analyse lexicale et analyse syntaxique Les analyseurs lexicales plus efficaces peuvent être plus facilement construits automatiquement à partir des expressions rationnelles que à partir des grammaires arbitraires. Quand on sépare la structure syntaxique d'un langage dans les parties lexicales et non-lexicales on obtient un moyen efficace pour modulariser un compilateur. On obtient deux modules de taille possible à gérer.

Les langages algébriques non reconnaissables par les automates finis Un langage formel L est un langage algébrique (context-free) si  une grammaire algébrique G telle que L=LG().  beaucoup de langages algébriques qui ne sont pas reconnaissables par des automates finis.   Ex.   ab +  Supposons que P soit reconnu par un automate A=(Q, I, R, F). Pour n0 le mot anbn est bien parenthesé, donc  un chemin in pntn. pn est un état ou on arrive après la lecture de an. Si n<>m, pn <> pm puisque ambn n'est pas bien parenthesé et si pn = pm on ait un chemin in pn= pmtn. D'ou la contradiction, car A doit avoir le nombre fini d'états par définition.

Dérivation gauche et dérivation droite Revenons à dérivation permettant à reconnaître une phrase -(id+id) dans la grammaire des expressions arithmétiques.   Gauche : E-E-(E) -(E OP E) -(id OP E)  -(id + E)  -(id+id) (1) Droite : à partir de -(E OP E) -(E OP id)  -(E + id)  -(id+id).(2) L'ordre de remplacement est différent. Pour comprendre certains analyseurs il faut considérer des dérivations ou à chaque moment de dérivation on remplace juste le non-terminal le plus à gauche. On appelle une dérivation comme ça – dérivation gauche. En utilisant des conventions de notation on peut marquer chaque étape wAw ou w consiste juste de terminaux A est une production et  est une chaîne des symboles de grammaire. Dérivation droite est définie de façon analogue.

Arbres de dérivation (parse trees) C'est une représentation graphique pour une dérivation qui filtre le choix de remplacement.   A chaque étape de dérivation il y a 2 choix à faire. Il faut choisir quel non-terminal on veut remplacer et après avoir fait ce choix, il faut choisir quelle alternative on veut utiliser.

Les étapes de construction pour -(id+id). E E E - E - E - E ( E ) ( E ) E OP E E E E - E - E - E ( E ) ( E ) ( E ) E OP E E OP E E OP E id id + id + id En lisant la frontière on obtient la phrase. Les feuilles sont étiquetées par des terminaux.

Nous allons simplifier un peu notre grammaire des expressions arithmétiques. Nous allons garder les opérateurs ‘+’ et ‘*’ et le non-terminal E simplement pour raccourcir la constructions des arbres: E E + E E  E * E E  (E) E  id

Il y a 2 dérivations gauches distinctes. Est-ce que chaque phrase en langage engendré par la grammaire des expressions arithmétiques donne nécessairement un seul arbre ou une seule gauche ou droite dérivation?  On prend une phrase id + id*id. Il y a 2 dérivations gauches distinctes. EE+E E E E*E E id+E E + E E+E*E E * E id+E*E id E * E id+E*E E + E id id+id*E id id  id+id*E id id id+id*id id+id*id La première reflète la précédence normale des opérateurs.

Ambiguité : Une grammaire qui produit plus qu'un seul arbre de dérivation pour une phrase quelconque s'appelle une grammaire ambiguë.   Pour beaucoup d'analyseurs c'est préférable de pouvoir transformer une grammaire ambiguë dans une grammaire non-ambiguë.

Exemple de transformation – élimination d'ambiguité.   "dangling else". Instr si Expr alors Instr | si Expr alors Instr sinon Instr |autre autre– toute autre instruction.

si Expr alors Instr sinon Instr si E1 alors S1 sinon si E2 alors S2 sinon S3. Instr   si Expr alors Instr sinon Instr   E1 S1 si Expr alors Instr sinon Instr E2 S2 S3

si E1 alors si E2 alors S1 sinon S2. (*) a)                        Instr                                                                          si Expr alors Instr E1 si Expr alors Instr sinon Instr  E2 S1 S2

b) E2 S1 Instr si Expr alors Instr sinon Instr E1 S2   si Expr alors Instr sinon Instr E1 S2 si Expr alors Instr E2 S1

Dans tous les langages on préfère (a).

Règle : Faites correspondre chaque sinon avec le plus proche "unmatched" alors. On peut incorporer cette règle directement dans la grammaire. Instr Matched_instr | Unmatched_instr Matched_instr si Expr alors Matched_instr sinon Matched_instr | autre Unmatched_instr  si Expr alors Instr | si Expr alors Matched_instr sinon Unmatched_instr

instr Unmatched_instr si Expr Alors instr E1 Matched_instr   Unmatched_instr si Expr Alors instr E1 Matched_instr si Expr alors Matched_instr sinon matched_instr E2 autre autre S1 S2