You are on page 1of 8

Grammaire

Un ensemble de r` egles qui donne une enum eration r ecursive des mots du langage.

Langages et Compilation
Grammaires formelles

u: Une grammaire est un quadruplet G = , N, S, P o` est un alphabet de lettres dites terminales N est un alphabet de lettres dites non terminales ou variables S N est la variable de d epart ou axiome P est une famille nie de productions, i.e. de r` egles de d erivation o` u , sont des mots de N et contient au moins une variable. = {a, b}, N = {S, A, B }, S, S AB A aAb S P = ou de fa con concise A A B bBa B B

AB

aAb |

bBa |

D erivation
Soit G = , N, S, P une grammaire. {a, b}, {S, A, B }, S, {S AB, A aAb | , B bBa | } Pour toutes cha nes u, v ( V ) , erive en v et lon note u v , on dit que u se d sil existe une production P telle que u = et v = . aaAbbbBa aaaAbbbbBa aaAbbbBa aaAbbbbBaa
k

Langage engendr e
Pour toute cha ne ( V ) , on note par LG () lensemble des cha nes terminales qui d erivent de : LG () = {u : u} Le langage engendr e par une grammaire G = , N, S, P est lensemble des cha nes terminales qui d erive de laxiome S : L(G) = LG (S ) = {u : S u} G = {a, b}, {S, A, B }, S, {S AB, A aAb | , B bBa | }

A aAb P , = aa, = bbbBa B bBa P , = aaAbbb, = a

On note u v sil existe des cha nes u1 , u2 , , uk1 d enissant une suite de k d erivations u u1 u2 uk1 v . On note u v sil existe un k tel que u v . AB 4 B bbbaaa 3
2 k

LG (B ) = {bn an : n N}

LG (A) = {an bn : n N} A , A aAb ab, A aAb aaAbb aabb, ... L(G) = {an bn+m am : n, m N}

AB B B bBa bbBaa bbbBaaa bbbaaa 4

Classication de Chomsky
On d enit di erents types de grammaire suivant la forme des r` egles. de type 0 Toute grammaire

Exemple
Grammaire r eguli` ere qui engendre le langage r egulier (a + b) (aa + abaaa + abab)

rarchie stricte Hie

de type 1 Les grammaires contextuelles Les r` egles sont de la forme avec || | | ebriques de type 2 Les grammaires hors contexte ou alg Les r` egles sont de la forme A avec A N de type 3 Les grammaires r eguli` eres eaires ` a droite les grammaires lin Les r` egles sont de la forme A uB ou A u avec A, B N et u

lensemble des terminaux = {a, b} lensemble des variables N = {S, T , U } laxiome S les productions P S aS | bS | aT T baU | a U aa | b LG (U ) : aa + b LG (T ) : ba(aa + b) + a

eaires ` a gauche Les grammaires lin Les r` egles sont de la forme A Bu ou A u avec A, B N et u 5

L(G) : (a + b) (aa + abaaa + abab) 6

Exemple
Grammaire hors contexte qui engendre les expressions arithm etiques totalement parenth es ees lensemble des terminaux = {+, , , \, (, ), nb} lensemble des variables N = {Exp, Op} laxiome Exp les productions P Exp (Exp Op Exp) | nb Op +|||\ D erivation de (nb (nb nb)) Exp (Exp Op Exp) (nb Op Exp) (nb Op Exp) (nb Exp) (nb (Exp Op Exp)) (nb (nb Op Exp)) (nb (nb Exp)) (nb (nb n)) 7 8

Exemple
Grammaire sensible au contexte qui engendre le langage {an bn cn : n N} lensemble des terminaux = {a, b, c} lensemble des variables N = {S, B } laxiome S les productions P S aBc | aB aaBBc | ab bB bb cB Bc

S aBc abc S aBc aaBBcc aabBcc aabbcc S aBc aaBBcc aaaBBcBcc aaabBcBcc aaabbcBcc aaabbBccc aaabbbccc

Classication de Chomsky
Ici, les deux types de grammaire qui nous int eressent sont : les grammaires r eguli` eres qui caract erisent les langages r eguliers, les grammaires hors contexte ou alg ebriques qui d enissent les langages alg ebriques. Objectif principal : d evelopper les outils algorithmiques qui, etant donn ee une telle grammaire, d eterminent si un mot est engendr e ou non par cette grammaire.

Grammaire r eguli` ere


Une grammaire r eguli` ere est soit une grammaire lin eaire ` a droite et toutes ses productions sont de la forme A uB Au A Bu Au avec A, B N et u .

eaire ` a gauche et toutes ses productions sont soit une grammaire lin de la forme Proposition Les langages engendr es par les grammaires r eguli` eres sont exactement les langages r eguliers. Autrement dit, on h erite de tous les outils algorithmiques d evelopp es pour les AF. 9 10

Grammaire r eguli` ere


De grammaire r eguli` ere vers AF {a, b, c}, N = {S, A, }, S laxiome, P = S abS | cA A cS | bacA | c

Grammaire r eguli` ere


De grammaire r eguli` ere vers AF ` partir de la grammaire , N, S, P dont les r` egles sont de la A forme A aB et A , on construit lAFN , N, , S, F o` u (A, a) = {B : A aB P } et F = {A : A }. S A X Y1 Y2 Z aX | cA cS | bY1 | cZ bS aY2 cA c
S A

Comment mimer une d erivation par un calcul sur AF ? abcbac L(G) : S abS abcA abcbacA abcbacc ab c bac c S S A A un etat nal Etape pr eliminaire : se ramener ` a une grammaire telle que les les productions soient de la forme lettre terminale. A A aB o` u a est une simple

c c
Y2

b
X

c b
Y1

S abS ; S aX, X bS A bacA ; A bY1 , Y1 aY2 , Y2 cA Ac ; A cZ, Z 11 12

Grammaire r eguli` ere


DAF vers grammaire r eguli` ere Pour tout AFD A = , Q, , q0 , F , la grammaire lin eaire ` a droite , Q, q0 , P o` u P = {q ar : (q, a) = r } {q : q F }, engendre L(A). a+b b 3 a a les terminaux : a, b les variables : 1, 2, 3 laxiome : 1 les productions : 1 a2 | b2 2 a3 | b2 3 a3 | b1 | 14

Grammaire alg ebrique ou hors contexte


Les r` egles sont de la forme A avec A N Ces grammaires sont susamment expressives pour d ecrire la syntaxe des langages de programmation (du moins la plupart) et susamment simples (modulo quelques hypoth` eses suppl ementaires) pour admettre des algorithmes ecaces qui d etermine si un programme est syntaxiquement correct et en cr ee une repr esentation sous forme darbre La grammaire dun langage de programmation est classiquement repr esent ee sous format BNF (Backus-Naur Form) qui permet quelques variantes sur la notation des grammaires alg ebriques.

13

Grammaire alg ebrique et format BNF


Un extrait de la grammaire de JAVA
Blocks and Commands <block> ::= <block statements>? <block statements> ::= <block statement> | <block statements> <block statement> <block statement> ::= <local variable declaration statement> | <statement> <local variable declaration statement> ::= <local variable declaration> ; <local variable declaration> ::= <type> <variable declarators> <statement> ::= <statement without trailing substatement> | <labeled statement> | <if then statement> | <if then else statement> | <while statement> | <for statement> <statement no short if> ::= <statement without trailing substatement> | <labeled statement no short if> | <if then else statement no short if> | <while statement no short if> | <for statement no short if> <statement without trailing substatement> ::= <block> | <empty statement> | <expression statement> | <switch statement> | <do statement> | <break statement> | <continue statement> | <return statement> | <synchronized statement> | <throws statements> | <try statement> <empty statement> ::= ; <labeled statement> ::= <identifier> : <statement> <labeled statement no short if> ::= <identifier> : <statement no short if> <expression statement> ::= <statement expression> ; <statement expression> ::= <assignment> | <preincrement expression> | <postincrement expression> | <predecrement expression> | <postdecrement expression> | <method invocation> | <class instance creation expression> <if then statement>::= if ( <expression> ) <statement> <if then else statement>::= if ( <expression> ) <statement no short if> else <statement> <if then else statement no short if> ::= if ( <expression> ) <statement no short if> else <statement no short if>

<switch statement> ::= switch ( <expression> ) <switch block> <switch block> ::= <switch block statement groups>? <switch labels>? <switch block statement groups> ::= <switch block statement group> | <switch block statement groups> <switch block statement group> <switch block statement group> ::= <switch labels> <block statements> <switch labels> ::= <switch label> | <switch labels> <switch label> <switch label> ::= case <constant expression> : | default : <while statement> ::= while ( <expression> ) <statement> <while statement no short if> ::= while ( <expression> ) <statement no short if> <do statement> ::= do <statement> while ( <expression> ) ; <for statement> ::= for ( <for init>? ; <expression>? ; <for update>? ) <statement> <for statement no short if> ::= for ( <for init>? ; <expression>? ; <for update>? ) <statement no short if> <for init> ::= <statement expression list> | <local variable declaration> <for update> ::= <statement expression list> <statement expression list> ::= <statement expression> | <statement expression list> , <statement expression> <break statement> ::= break <identifier>? ; <continue statement> ::= continue <identifier>? ; <return statement> ::= return <expression>? ; <throws statement> ::= throw <expression> ; <synchronized statement> ::= synchronized ( <expression> ) <block> <try statement> ::= try <block> <catches> | try <block> <catches>? <finally> <catches> ::= <catch clause> | <catches> <catch clause> <catch clause> ::= catch ( <formal parameter> ) <block> <finally > ::= finally <block>

15

16

Arbre de d erivation
Soit une grammaire G = , N, S, P . erivation ou arbre danalyse ou arbre de syntaxe Un arbre de d pour G est un arbre etiquet e par N {} tel que la racine est etiquet ee par laxiome S les nuds internes sont etiquet es par les variables les feuilles sont etiquet ees par les terminaux si A est l etiquette dun nud interne et x1 , ..., xk sont les egle de G. etiquettes de ses ls alors A x1 xk est une r` La fronti` ere de larbre est le mot form e des feuilles de larbre (lues de gauche a ` droite). Le langage engendr e par G est lensemble des mots u tels quil existe un arbre de d erivation de fronti` ere u. 17 18 A

Arbre de d erivation
Des arbre de d erivation de la grammaire {a, b}, {S, A, B }, S, {S AB, A aAb | , B bBa | } S B A a A a A a fronti` ere : ba b b b S B b B a b B a

b B a

fronti` ere : a3 b5 a2

Arbre de d erivation
Chaque arbre de d erivation peut synth etiser plusieurs d erivations. S A B S AB B bBa ba S AB AbBa bBa ba S AB AbBa Aba ba

Notion dambigu t e
Une grammaire G est ambigu e sil existe un mot w L(G) qui admet plusieurs arbres de d erivation. G = ({a, +, }, {S }, S, {S S + S | S S | a}) est ambigu e : le mot a a + a admet deux arbres danalyse. S S S S S + S a S a S S + S a

b B a

Une d erivation est dite gauche si cest la variable la plus ` a gauche qui est d eriv ee a ` chaque etape. a droite qui est Elle est droite si cest toujours la variable la plus ` d eriv ee. S AB B bBa ba est un d erivation gauche S AB AbBa Aba ba est un d erivation droite

a a a le mot a a + a admet deux d erivations gauches : et deux d erivations droites :

S SS aS aS+S aa+S aa+a

S S+S SS+S aS+S aa+S aa+a

` un arbre danalyse correspond exactement une d A erivation gauche et une d erivation droite. 19 20

S SS SS+S SS+aSa+aaa+a

S S+S S+aSS+aSa+aaa+a

Notion dambigu t e
Tout mot dune grammaire non ambigu e admet exactement - un arbre danalyse, - une d erivation gauche, - une d erivation droite. La grammaire {+, , , \, (, ), nb}, {Exp, Op}, Exp, Exp (Exp Op Exp) | nb, Op + | | | \} qui engendre les expressions totalement parenth es ee, nest pas ambigu e.
` partir de lexpression A (nb (nb nb)), on peut reconstruire lunique arbre associ e Exp ( Exp nb Exp Op ) Exp

Notion dambigu t e
G = {a, +, }, {S, T, F }, S, {S S + T | T, T T F | F, F a} engendre le m eme langage que la grammaire ambigu e G = ({a, +, }, {S }, S, {S S + S | S S | a}), mais nest pas ambigu e. S S T T F a F a + T F a

a a + a d enit un unique arbre de d erivation

Lunique d erivation gauche


S S +T T +T T F + aa+T aa+F aa+a T F F +T aF +T

( Exp ) Exp Op Exp nb nb

21

22

Notion dambigu t e
Un langage est inh eremment ambigu lorsque toute grammaire qui lengendre est ambigu e. L = {a b c : n = m ou m = p} est inh eremment ambigu.
n m p

Grammaire r eduite
Eliminer les variables inutiles Une grammaire G = , N, S, P est dite r eduite si toute variable est productive : chaque variable A engendre au moins un mot terminal, LG (A) = toute variable est accessible ` a partir de laxiome : pour chaque variable A, il existe u, v (N ) tels que S uAv Chaque variable dune grammaire r eduite appara t dans au moins un arbre de d erivation. Fait. Pour toute grammaire G, on peut construire de mani` ere eective une grammaire r eduite equivalente.

Quelque soit la grammaire qui engendre L, on peut montrer que le mot an bn cn pour n assez grand admet toujours deux arbres de d erivation

Le langage engendr e par les expressions arithm etiques sur lalphabet {+, , a} nest pas inh eremment ambigu. Modier une grammaire pour la rendre non ambigu e nest pas toujours possible.

23

24

Grammaire r eduite
Lalgorithme se faite en deux etapes. Etape 1. Suppression des variables improductives On construit par r ecurrence sur i, lensemble Prodi des variables A qui sont racines dun arbre de d erivation de hauteur i. Prod1 = {A N : A u P et u } Prodi+1 = {A N : A P et (Prodi ) } Arr et lorsque Prodi+1 = Prodi (au bout dau plus |N | etapes)
S T G = {a, b}, {S, T, U, V }, S, U V aT aU aU aT | bT U | abT S | U V | bT | a | bU | bS | a

Grammaire r eduite
Etape 2. Suppression des variables inaccessibles On construit par r ecurrence sur i, lensemble Acci des variables A qui sont nuds dun arbre de d erivation de racine S et de hauteur i. Acc0 = {S } Acci+1 = {A N : B A P et B Acci } Arr et lorsque Acci+1 = Acci (au bout dau plus |N | etapes)
S G1 = {a, b}, {S, T, V }, S, T V aT | abT S bT | a aT | bS | a

Acc0 = {S } , Acc1 = {S, T } , Acc2 = Acc1 . ; {a, b}, {S, V }, S, {S aT | abT S, T bT | a}


L etape 1 doit etre eectu ee avant l etape 2. La suppression de variables improductives peut introduire de nouvelles variables inaccessibles.

P rod1 = {T, V } , P rod2 = {T, V, S } , P rod3 = P rod2

G1 = {a, b}, {S, T, V }, S, {S aT | abT S, T bT | a, V aT | bS | a}


NB. On a un algo qui d etermine si L(G) = .

25

26

Lever certaines ambigu t es


{+, (, ), nb}, {E }, E, {E E + E | (E ) | nb} est ambigu e. nb + nb + nb + nb admet plusieurs arbres de d erivation E E E + E E + E nb E nb nb E E + E nb E + E nb 27 nb + E nb E nb + E E + E E + E nb nb nb 28 + E nb E E + E E nb E nb nb E + E

Usuellement, on eectue les additions de la gauche vers la droite (associativit e gauche). Ceci correspond au premier arbre.

E E E + E E + E nb nb nb + E nb

E + E E + E nb nb nb nb

E + E E nb E + E E E + F E + F nb F nb nb + F nb

La grammaire modi ee nest plus ambigu e.

Pour forcer lassociativit e ` a gauche, on ajoute une nouvelle variable. E E+F |F F (E ) | nb

Lever certaines ambigu t es


{+, , (, ), nb}, {E }, E, {E E + E | E E | (E ) | nb} est ambigu e. E Ambigu t e li ee a lassociativit ` e: nb + nb + nb admet deux arbres de d erivation E E + E nb nb E E E + E nb nb E nb E nb E + E + E nb E nb E + E

Lever certaines ambigu t es


Pour supprimer les ambigu t es, on choisit suivant le sch ema habituel de privil egier lassociativit e` a gauche E E + E nb nb E E nb + E E + E nb

E + E nb nb

{nb + nb} + nb Ambigu t e sur la priorit e des op erations : nb + nb nb admet deux arbres de d erivation 29

nb + {nb + nb}

la priorit e de la multiplication sur laddition

E E nb nb 30

E E nb nb

{nb + nb} nb

nb + {nb nb}

Lever certaines ambigu t es


E E nb + E Emp echer les expressions non parenth es ees avec + ou Ajouter deux nouvelles variables T et F

E E nb nb

Emp echer les expressions non parenth es ees avec + E T F E E+T |T T F |F (E ) | nb E T F nb + T

T F F nb nb

La grammaire modi ee nest plus ambigu e. 31

You might also like