Chap 1 Grammaires et drivations Une grammaire algbrique
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) 1
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. 2
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. 3
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. 4
Grammaire des expressions arithmétiques (version 1) Ex. (*) E E OP E E (E) E -E E id OP + OP * OP / A={id, +, -, *, /, (, )} V={E, OP} E est start symbol 5
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. 6
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. 7
Manière plus abstraite A si A est une production de grammaire 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). Si on veut dire dérive en 0 ou plus étapes *on utilise Alors : 1) pour 2) + Si et alors + dérive en un ou plus étapes 8
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. 9
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 + E) -(id+id). 10
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, …} 11
Exemples Ex 3. H: a b 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. 12
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). 13
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 reconnaît le langage a + b b + a + 14
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. 15
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. 16
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. 17
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 w. A 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. 18
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. 19
Les étapes de construction pour -(id+id). E E - E ( - E ) E ( E E E OP E - E ( E id OP ) E E E - E ) E ( - E E ) ( E ) E OP E id + id En lisant la frontière on obtient la phrase. Les feuilles sont étiquetées par des terminaux. 20
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 21
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 id+E*E id+id*id E E + E id E * id E E*E E+E*E id+E*E id+id*E id+id*id E E * E + E id id E id La première reflète la précédence normale des opérateurs. 22
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ë. 23
Exemple de transformation – élimination d'ambiguité. "dangling else". Instr si Expr alors Instr | si Expr alors Instr sinon Instr |autre– toute autre instruction. 24
�si E 1 alors S 1 sinon si E 2 alors S 2 sinon S 3. Instr si Expr alors Instr sinon E 1 Instr S 1 si Expr alors Instr sinon Instr E 2 S 3 25
�si E 1 alors si E 2 alors S 1 sinon S 2. (*) a) Instr si Expr E 1 alors Instr si Expr alors Instr sinon Instr E 2 S 1 S 2 26
b) Instr si Expr alors Instr sinon E 1 Instr S 2 si Expr E 2 alors Instr S 1 27
Dans tous les langages on préfère (a). 28
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 29
instr Unmatched_instr si Expr Alors E 1 si instr Matched_instr Expr alors Matched_instr sinon matched_instr E 2 autre S 1 S 2 30
- Slides: 30