Académique Documents
Professionnel Documents
Culture Documents
COMPILATION
Février 2009
OBJECTIF (1)
• le contrôle de validité ;
PLAN DU COURS
1. Introduction
La compilation constitue la première
étape de la chaîne de production de
programmes.
Chapitre 1
2. Définition
La compilation permet la traduction
d’un programme dit programme
source écrit le plus souvent en
langage de haut niveau vers un
programme dit programme objet qui
est soit directement le langage
machine, soit le langage d’assemblage.
Chapitre 1
Programme Programme
source Compilateur cible
5. L’optimisation du code
Le code produit par le compilateur doit
être performant (ie. rapide à l’exécution
et peut coûteux en place mémoire).
Chapitre 1
Exemple
• lexicales, comme l'écriture erronée d'un
identificateur, d'un mot clé ou d'un opérateur ;
1. Mots
Définition
Remarque
Exemple
A1 = {1}
A2 = {0, 1}
A3 = {., -, /}
A4 = {0, 1, 2, ..., 9}
A5 = {a, b, ..., z}
Chapitre 2
Exemple
A={a,b,c} : un alphabet.
4, 4, 2 et 0.
Chapitre 2
Remarque
ch et c + h ≡ ch
ch (|ch|=1)
c + h ≡ ch (|c + h|=2)
Chapitre 2
Notation
• a, b, c, d, e, f, 0, 1... désignent des symboles.
• t, u, v, x, y, z désignent des chaînes.
• La chaîne aaaa est aussi notée a4. Par
conséquent, a0=ε.
• Le symbole m(i) désigne le i-ème symbole de
la chaîne m.
Chapitre 2
Remarque
• L’opération particulière :
la concaténation.
x , y : chaînes ;
La concaténation de x et y : xy
Chapitre 2
Exemple
Si u = abaa et v = bab alors
uv = abaabab et vu = bababaa
N.B.
La concaténation n’est pas commutative.
Chapitre 2
Définition
Étant donné un alphabet A :
w(p+i)=v(i) si 1 ≤ i ≤ q.
Chapitre 2
Théorème de la Décomposition
x1x2...xn , où i [1..n], xi A.
Chapitre 2
Démonstration
Comme les symboles de l'alphabet sont des
atomes, il n'est pas possible de diviser un mot
plus qu'au niveau de ces symboles. Si deux
divisions en symboles étaient possibles, cela
voudrait dire qu'un symbole peut être divisé et
donc il ne serait pas atomique.
Remarque
Notation
Par conséquent:
Par convention :
A0 = ε
A*=Un=0..∞ An
Chapitre 2
Exemple
A= {0,1} : alphabet
• A0={ε} ;
• A1 = A ={0, 1} ;
Remarque
n m
Si c1 A et c2 A
alors
c1 + c2 An+m
Exercices
Chapitre 2
Solution :
Solution :
6,
Définition
Exemple
00 est un préfixe ;
10 est un suffixe ;
Remarque Générale
Définition
Une occurrence d'une chaîne x dans une
chaîne y est une apparition de x à un endroit
précis dans la chaîne y.
Exemple
A = {a,b} : alphabet
Relations d’ordre
Ordre préfixiel
Ordre lexicographique
Ordre hiérarchique
Exercice
Solution
Chapitre 2
3. Langages et opérations
Définition
Un langage L sur un alphabet A est un
ensemble de chaînes (ou ensemble de mots)
sur A. L est un sous-ensemble de A*,
autrement dit L C A*.
Exemple 1
L2 = { 0n1n | n ≥ 0},
L3 = {0n10m | n ≥ 0, m ≥ 1},
L4 = {1n | n ≥ 2}
Exemple 2
A= {a,b,c} : alphabet
Définition
Étant donné un alphabet A, parmi tous les
langages L de P(A*) :
Exemple
L = {aib | i ≥ 0 }
L = {an | n N}
Remarque
Comme les langages sont des ensembles,
des opérations ensemblistes classiques
peuvent être appliquées: union, intersection,
complémentation, ...
Définition
union : L U M = {x | x ∈ L ou x∈ M} ;
intersection : L ∩ M = {x | x∈ L et x∈ M};
complémentaire sur A* :
Comp(L)= A*\L = {x | x ∈ A* et x ∉ L};
Chapitre 2
fermeture de Kleene :
L* = Ui=0..∞ Li où L0 = {ε} et Ln = LLn-1 = Ln-1L
fermeture positive :
L+= Ui=1..∞ Li.
Chapitre 2
Remarque
Exemple
si L1={a,bc} et L2={de,f}
alors L1 × L2= L1L2 = {ade, af, bcde, bcf}.
Chapitre 2
Exemple
Exercice
Soient les deux langages :
L = {u A∗ | |u| pair }
M = {u A∗ | |u| impair }.
• L + M = A*
• LM = M = ML
• MM = L \ {ε}
• LL = L
Chapitre 2
Propriété
•∅L = ∅ = ∅L
•L+ = LL* = L*L
•L* = {ε} U L+
•∅* = {ε}
•{ε}* = {ε}
Chapitre 2
Automates Finis.
Chapitre 3
2. Langages rationnels
Définition
1. ∅ ∈ Rat(A*);
2. {ε}∈ Rat(A*);
4. Si L1∈Rat(A*) et L 2
∈
Rat(A*) alors L1UL2
∈
Rat(A*);
Exemple
A={a,b,c} : alphabet,
Démonstration
Exercice
le langage L={0,1,00,11,000,111}
sur l'alphabet {0,1,2} est-il un
langage rationnel ?
chapitre 3
Solution
Remarque
On peut construire à l'aide des opérateurs de la
définition précédente de nombreux langages
désignés par des expressions mathématiques.
Exemple
L={(({a}U{b})*×{a})*×({b}×{c})*}, ce qui,
en appliquant les définitions peut se simplifier
en L={({a,b}*×{a})*×{bc}*}.
chapitre 3
Remarque
Exercice
Solution
3. Expressions rationnelles
Définition
Exemple:
L={(({a}U{b})*×{a})*×({b}×{c})*
}
= ((a|b)*a)*(bc)*
chapitre 3
N.B.
Théorème
chapitre 3
A : un alphabet
C = { |, *, ε, (, )} ; A∩C=∅ ;
w ∈ A* ;
Notation
• w+ = w w* = w* w ;
Si n est quelconque :
wn (n ≥ 0) ≡ w* ;
wn (n > 0) ≡ w+.
chapitre 3
Exemple
Exemple
[A-Z,a-z][A-Z,a-z,0-9]*
Notation
wn : un langage rationnel quand n est un
entier fixé, par contre, ce n'est pas toujours
vrai dans le cas général, quand n est une
variable.
Exemple :
Définition
Remarque
Les expressions rationnelles décrivent des
langages, c'est-à-dire des ensembles de mots
sur un alphabet A donné (souvent
implicitement).
Définition
Propriété
Soient u, v et w des expressions rationnelles :
Union
• u|u = u (idempotence)
La mise à l'étoile
• u** = u* (idempotence)
• ∅* = ε
• u* = u|u* (absorption)
chapitre 3
La concaténation
• uε = εu = u (ε : élément neutre à
gauche et à droite)
• u∅ = ∅u = ∅ (∅ : élément absorbant
à gauche et à droite)
La concaténation et l’union
Remarque
sauf si u = w
chapitre 3
Définition
Exemple
Définition
Exercice
Solution
Exemple
• (b + ab)*(a + ε)
mots n’ayant pas deux a consécutifs ;
• a* + b*
mots n’ayant que des a ou que des b ;
• (aa + b)*
4. Définitions rationnelles
Exemple
chiffre → 0 | 1 | ... | 9 ;
id → lettre (lettre|chiffre)*.
chapitre 3
Remarque
Exercice
Solution
L'alphabet : {0,1,2,3,4,5,6,7,8,9,’,’}
• PartieEntiere [1-9][0-9]*|[0-9]
• PartieDecimale [1-9][0-9]*|0
• NbreDecimale PartieEntiere,PartieDecimale
chapitre 3
Définition
Exemple
X=a1X+a2Y+a3
Y=b1X+b2Y+b3
ai, bi (i=1,2,3) : expressions rationnelles .
chapitre 3
Solution
X=(a1|a2b2*b1)*(a3|a2b2*b3)
Y=(b2|b1a1*a2)(b3|b1a1*a3)
Remarque
les solutions ne sont pas uniques, mais, en
général, on s'intéresse à la plus petite des
solutions .
chapitre 3
Définition
Un ensemble d'équations rationnelles
d'indéterminés D={X1, ..., Xn} est en forme
standard si Xi
∀ ∈
D, il y a une équation de
la forme :
Xi=ai0 + ai1X1 + ... + ainXn
avec aij des expressions rationnelles sur A
telles que A ∩ D = ∅.
chapitre 3
Remarque
Lemme d’Arden
Soient K et L deux langages sur A* (K ⊆ A*
et L ⊆ A*), ε ∉ K, alors :
1) K*L est l'unique solution de l'équation X =
KX + L.
2) LK* est l'unique solution de l'équation X =
XK + L.
Si ε ∈ K, alors A* est solution et K*L la plus
petite solution.
chapitre 3
(a+b)* = a*(ba*)*.
= a+(ba*)* + (ba*)++1
= a+(ba*)* + (ba*)*
= (a+ + 1)(ba*)*
= a*(ba*)*
Algorithme de résolution
Xi = xiXi + Yi
Remarque
Il faut penser à simplifier continuellement vos
chapitre 3
Exemple
D = {X1, X2, X3}
A = {0,1}
le système S :
X1 = 0X2 + 1X1 + ε
X2 = 0X3 + 1X2
X3 = 0X1 + 1X3
chapitre 3
Étape 1
X1 = 1X1 + (0X2 + ε)
X2 = 1X2 + (0X3)
X3 = 1X3 + (0X1)
chapitre 3
Étape 2
X1 = 1*(0X2 + ε)
X2 = 1*0X3
Étape 3
X3 = (1+01*01*0)X3 + 01*
= (1+01*01*0)*01*
X2 = 1*(0X3)
= 1*0(1+01*01*0)*01*
X1 = 1*(0X2 + ε)
= 1*01*0(1+01*01*0)*01*+1*
chapitre 3
6. Lemme de l'étoile
Lemme de l’étoile (de la pompe)
Attention
Remarque 1
Ce théorème permet souvent de
démontrer par l'absurde qu'un
langage L n'est pas rationnel : il suffit
de montrer que, pour tout n de N, il
existe un mot z de L qui ne vérifie pas la
condition pour un i donné. Mais
attention, un mot peut ne pas fonctionner
parce que trop court !
chapitre 3
Remarque 2
Par contre, montrer qu'un langage
vérifie le lemme de l'étoile ne prouve
pas qu'il est rationnel. Si le lemme de
l'étoile ne permet pas de prouver qu'un
langage est rationnel, une piste possible
est de faire une démonstration par
l'absurde en cherchant à démontrer qu'il
est rationnel.
chapitre 3
Exemple
Le langage{ambm|m ∈N} est il rationnel?
Hypothèses
La contradiction :
= akapan-(k+p)(ap)i-1bn
= an(ap)i-1bn
chapitre 3
Conclusion :
Remarque
Ce lemme ne peut pas servir à démontrer
qu'un langage est rationnel : il existe en effet
des langages non rationnels qui le vérifient.
LES GRAMMAIRES
DE CHOMSKY
chapitre 4
1. Introduction
Un langage est défini par l'ensemble de ses
mots, de ses phrases correctes. Il est
impossible de donner la liste des phrases (ou
mots) correctes d'un langage parce qu'elle est
souvent infinie. Pour les langages rationnels
nous pouvons les dénoter par des expressions
rationnelles. Toutefois, tous les langages ne
sont pas rationnels et cette solution n'est donc
pas toujours possible.
chapitre 4
Définition
VT ∩ V N = ∅ ;
V = VT U VN : le vocabulaire de la grammaire;
chapitre 4
Remarque
Exemple
R1 : S → 0X1
R2 : 0X → 00X1
R3 : X → ε
chapitre 4
Définition
Exemple
Définition
Les mots du langage caractérisé par la
grammaire sont les mots accessibles qui ne
sont composés que de symboles terminaux.
Exemple
"01" (S=R1 → 0X1=R3 → 01)
"0011" (S=R1 → 0X1=R2 → 00X11=R3 → 0011)
"000111" ...
Définition chapitre 4
Exemple
G0 : S → 0X1 → 00X11 → 000X111 → 000111
Définition
Deux grammaires G1 et G2 sont dites
équivalentes si L(G1) = L(G2).
Exemple
G4=({0, 1}, {S, X}, S, R) avec R :
R1 : S → 0X1 ; G0
R2 : X → 0X1 ;
R3 : X → ε.
Classification des grammaires chapitre 4
x → y avec x ∈ V* × VN × V* et y ∈ V*.
Type 1 : contextuelle (sensible au contexte)
- x → y avec |x|≤|y|.
Les productions sont soumises à la contrainte que la
partie droite de la règle doit contenir au mois autant
de symbole que la partie gauche.
Le cas particulier S → ε est permis si S n’apparaît pas
dans la partie droite d’une règle de G.
chapitre 4
X → x avec X ∈ VN et x ∈ V+.
D.D.
chapitre 4
Exemple
{S → bA ; A → aA ; A → a}
"S" ::= b"A"
"A" ::= a"A" | a
chapitre 4
{S → bA ; A → aA ; A → a}
Exercice chapitre 4
B:
chapitre 4
1) S aaA | bbB
BNF: « S » ::= aa « A » | bb « B »
2) B aa | bb | cc | dd
BNF: « B »::= aa | bb | cc | dd
Arbres de dérivations
… …
Y1 Yi Ym
X1 ….. Xm
chapitre 4
Exercice
Soit la grammaire ayant S pour axiome et pour
règles de production :
Solution
1)
chapitre 4
2)
D.G.
D.D.
chapitre 4
Ambiguïté
Une grammaire est dite ambiguë si au moins
un mot dans son langage a plus d’un arbre de
dérivation.
Exemple
G = ({0, 1, … , 9, +, *}, {S, ch},R)
S → ch
Ch → ch + ch | ch * ch
ch → 0 | 1 | 2 | … | 9
chapitre 4
Considérons le mot « 3 * 1 + 5 »
Ce mot possède plus d’un arbre de dérivation.
S S
ch ch
ch + ch ch * ch
ch * ch 3 ch + ch
5
3 1 1 5
(3 * 1) + 5 3 * (1 + 5)
Exercice chapitre 4
Solution
S
1)
E
( E )
E E
( E ) ( E )
ε ε
chapitre 4
2)
E
E E
ε
ε ε
chapitre 4
4)
S
( E ) E
( E ) E ε
ε ( E ) E
ε ε
Chapitre 5
LES AUTOMATES
D'ÉTAT FINI
chapitre 5
1. Introduction
2. Machine de Turing
La machine de Turing est composée de :
Définition
On appelle configuration tout couple
symbole/état. Une règle détermine donc pour
une configuration courante, l'action à effectuer
et donc la prochaine configuration.
On appelle configuration initiale tout couple
symbole / état où l'état est un état initial.
Définition
La machine de Turing est dite déterministe si
pour toute configuration, il n'existe qu'une
seule fonction de transition applicable, c'est-à-
dire si et seulement si pour μ(x,y)=(z1,t1) et
μ(x,y)=(z2,t2) deux règles, alors z1=z2 et t1=t2.
Dans le cas contraire, la machine est dite non
déterministe (pour une configuration donnée,
plusieurs règles sont applicables).
chapitre 5
3. Automates finis
Définition
Un automate fini (AFN) est composé de la
même manière que la machine de Turing.
Généralement non déterministe, son
comportement est cependant plus restreint. Il
est défini par un quintuplet (A, Q, I, F, μ) tel
que :
chapitre 5
Remarque
Au départ, une phrase construite sur le
vocabulaire de l'automate est inscrite sur le
ruban d'entrée et est entourée de symboles ε.
L'unité centrale se trouve dans un des états
initiaux de I et la tête de lecture est placée
devant le symbole le plus à gauche de la
phrase. A partir de cette position, l'automate va
exécuter son programme.
chapitre 5
Remarque
Pour une configuration courante (ai,qj),
l'automate applique une transition μ(ai,qj) →
qk, passe alors dans l'état qk et déplace le
ruban d'une case vers la gauche. L'automate
tel qu'il est défini n'est pas forcément
déterministe.
chapitre 5
Exemple 1
Soit l'automate T={{a,b}, {1}, {2}, μ} avec :
chapitre 5
μ a b
→1 1 2
*2 1 2
chapitre 5
μ a b
→1 1 2
*2 1 2
chapitre 5
x
n Etat quelconque e f (x,e) → f
Exemple 2
Cet automate est défini sur l'alphabet A = {a,b}.
Exemple 3
Cet automate est défini sur l'alphabet A = {a,b}.
Exemple 4
Cet automate est défini sur l'alphabet A = {a,b}.
Cas particulier
Cet automate est défini sur l'alphabet A = {a,b}.
Exemple 5
Soit l'automate T={{a,b,c}, {1}, {6,8}, μ}
avec :
μ sa fonction de transition :
µ(a,1) = 2 ; µ(b,1) = 4 ; µ(a,2) = 5 ;
µ(b,2) = 3 ; µ(c,2) = 2 ; µ(a,3) = 6 ;
µ(b,3) = 4 ; µ(c,3) = 9 ; µ(c,4) = 5 ;
µ(a,5) = 5 ; µ(a,5) = 6 ; µ(c,7) = 4 .
chapitre 5
μ a b c
1 2 4 0
2 5 3 2
3 6 4 0
4 0 0 5
5 5,6 0 0
6 0 0 0
chapitre 5
Remarque
Dans certains cas, il est plus facile de
représenter un groupe de transitions par une
notation ensembliste. Par exemple, supposons
que pour un état donné e, nous avons un
passage à l'état f pour les symboles a, b et c.
A = {a, b, c, d}
chapitre 5
Automate T1
Automate T2
chapitre 5
0 1
→A B A
B B C
*C C C
aba
bcaaa
acba
acbbcaaa
abaa
abbb
chapitre 6
ANALYSES LEXICALE,
SYNTAXIQUE ET
SEMANTIQUE
Analyse lexicale
chapitre 6
1. Introduction
Les éléments rencontrés dans un programme :
- Identificateur : nom du programme, X, Y, …
Exemples
Exemple :
δ a b c Autres
q0 q1 … … …
q1 … q1 q2 …
… … … … …
chapitre 6
{
q0 q1
} Autres que { et }
chapitre 6
Programme 1
Char ← prochain caractère
Etat ← q0
Tant que (char ≠ EOF)
Etat ← δ (Etat, char)
Char ← prochain caractère
Si (Etat Є QF)
Alors accepter
Sinon rejeter
chapitre 6
Exemple :
Soit l’automate suivant :
b
a
q0 q1 Automate A
Remarque :
qr : rejeter
chapitre 6
Remarque :
Conclusion
1. Introduction
Remarque
BNF
A
n
l
a
e
l Suite de Arbres
x Analyseur
y
i syntaxique
s Symboles Syntaxiques
c
e
a
u
l
r
Erreurs de syntaxe :
Texte refusé
Analyseur syntaxique
chapitre 6
Exemple 1
x = 2009
x = 2009 chapitre 6
9
chapitre 6
Exemple 2
<programme>::=PROGRAM<identificateur><corps prog.>
<corps prog.>::=<suite de déclar.>DEBUT<suite d’affect.>FIN
<suite de déclar.>::=<déclar.>|<déclar.><suite de déclar.>
<déclar.>::=INT<identificateur>;
<suite d’affect.>::=<affect.>|<affect.><suite d’affect.>
<affect.>::=<identificateur>=<terme>;|<identificateur>=
<terme><opérateur><terme>;
<terme>::=<entier>|<identificateur>
<opérateur>::=+ | - | * | /
<identificateur>::=<lettre> | <lettre><chiffre>
<entier>::=<chiffre> | <entier><chiffre>
<lettre>::=A | B | … | Z <chiffre>::=0 | 1 | … | 9
chapitre 6
<programme>
<suite de déclar.>
<déclar.>
INT <suite de déclar.>
; <déclar.>
<suite d’affect.>
+
/
chapitre 6
<corps prog.>
<affect.>
<identificateur> =
G Non : Erreur
Conclusion
La construction des arbres syntaxiques fait
apparaître la nécessité d’avoir défini la
grammaire du langage sans ambigüité afin qu’à
aucun moment, une suite de symboles issue de
l’analyse lexicale puisse correspondre à
plusieurs règles de production différentes, ce
qui conduirait à une interprétation du sens
différente à celle voulue par le programmeur.
chapitre 6
2ème cas
<Instr>
1ér cas
Le else se rapporte au then de la première
instruction.
2ème cas
Le else se rapporte au then immédiatement
précédent.
Version corrigée
G = (VT, VN, S , P) VT = {if, then, else}
VN = {Bool, Instr-1, Instr-2, Instr} S = Instr-1
P : Instr-1 if bool then instr-1
Instr-1 if bool then instr-2 else Instr-1
Instr-1 Instr
Instr-2 Instr-1
chapitre 6
if <Bool> then<Instr-1>
if <Bool> then
<Instr-2> else<Instr-1>
<Instr-1> <Instr>
<Instr>
chapitre 6
Définitions
R: S → S + a | S + b | a | b
Soit x = a + b + b
L’analyse syntaxique essayera de construire l’arbre
de dérivation correspondant :
S
L’analyse syntaxique
ascendante construit S + a
Grammaire LL(K)
chapitre 6
grammaires LL(1).
CALCUL DE PREMIER
Pour toute chaîne α composée de symboles
terminaux et non-terminaux, on cherche
PREMIER(α):
Exemple
S → Ba
B → cP bP P ε
P → dS
S *→ a alors a ∈ PREMIER(S).
Algorithme
1. Si X est un non terminal et X → Y1Y2…Yn est une
production de la grammaire (avec Yi symbole
terminal ou non-terminal) alors :
Exemple 1
P: E → T E’
E’ → + T E’ | ε
T → F T’
T’ → * F T’ | ε
F → (E) | nb
chapitre 6
PREMIER(E’) = {ε}
Règle 2
T’ → ε, ε est ajouté à PREMIER(T’)
PREMIER(T’) = {ε}
PREMIER(E’) = {ε , +}
chapitre 6
PREMIER(T’) = {ε , *}
PREMIER(F) = {(}
PREMIER(T) = {( , nb}
Exemple 2
G = ({a, b, c, d, e, ε}, {S, A, B, C}, S, P)
P: S → ABC
A → aA | ε
B → bB | cB| ε
C → de | da | dA
chapitre 6
PREMIER(A) = {ε}
Règle 2
B → ε, ε est ajouté à PREMIER(B)
PREMIER(B) = {ε}
PREMIER(A) = {a, ε}
Règle 3)
Règle 1 i)
chapitre 6
PREMIER(B) = {b, ε}
Règle 1 i)
B → cB, PREMIER(c) est donc ajouté à PREMIER(B)
PREMIER(B) = {b, c, ε}
PREMIER(C) = {d}
chapitre 6
PREMIER(S) = {a, b, c, d}
chapitre 6
CALCUL DE SUIVANT
Exemple
G = ({a, b, c, d, ε}, {S, B, P}, S, R)
S → Sc Ba
R: B → Pa bPb P ε
P → dS
S→Sc alors c ∈ SUIVANT(S).
Exemple 1
P: E → T E’
E’ → + T E’ | ε
T → F T’
T’ → * F T’ | ε
F → (E) | nb
chapitre 6
SUIVANT(E) = {$}
SUIVANT(T) = {+}
SUIVANT(F) = {*}
chapitre 6
SUIVANT(E) = {$, )}
SUIVANT(E’) = {$, )}
SUIVANT(T) = {+, $, )}
chapitre 6
SUIVANT(T’) = {+, $, )}
SUIVANT(F) = {*, +, $, )}
chapitre 6
Exercice 1
G = ({+, *, a}, {E}, E, P)
P: E → + EE | * EE | a
PREMIER(E) = {+}
Règle 1 i)
E → * EE, * est donc ajouté à PREMIER(E)
PREMIER(E) = {+, *}
PREMIER(E) = {+, *, a}
chapitre 6
SUIVANT(E) = {$}
SUIVANT(E) = {$, +, *, a}
chapitre 6
Exercice 2
G = ({+, *, (, ), a}, {E}, E, P)
P: E → (E) | E + E | E * E | a
PREMIER(E) = {(}
Règle 1 i)
E → a, a est ajouté à PREMIER(E)
PREMIER(E) = {(, a}
chapitre 6
SUIVANT(E) = {$}
E → E + E | E * E | (E),
SUIVANT(E) = {$, +, *, )}
Table d’analyse chapitre 6
Exemple 1
S → aSbT | cT |d
le mot w = accbbadbc
T → aT | bS | c
S
w = accbbadbc
a S b T
chapitre 6
S
w = accbbadbc
a S b T
c T
chapitre 6
S
w = accbbadbc
a S b T
c T b S
a S b T
c
d c
Exemple 2
S → aAb
le mot w = acb
A → cd | c
S
w = acb
a A b
chapitre 6
S
w = acb
a A b
A → cd | c
chapitre 6
Exemple 3
S → aSb | aSc | d
le mot w = aaaaadbbcbbbc
Exemple 4
E → T E’
E’ → + T E’ | ε
T → F T’
T’ → * F T’ | ε
F → (E) | nb
le mot w = 3*4+10*(5+11)
Algorithme
Méthode :
Exemple
E → T E’
E’ → + T E’
E’ → ε
T → F T’
T’ → * F T’
T’ → ε
F → (E)
F → nb
Table d’analyse chapitre 6
E → T E’ E’ → ε T’ → *F T’ F → (E)
E’ → +T E’ T → F T’ T’ → ε F → nb
Non- nb + * ( ) $
terminal
E E → TE’ E → TE’
E’ E’→+TE’ E’ → ε E’ → ε
T T → FT’ T → FT’
T’ T’ → ε T’ → ε
T’ → ε T’ →*FT’
F F → nb F → (E)
Algorithme d'analyse
Donnée : une chaîne w et une table d'analyse M
pour une grammaire G.
Algorithme
• Positionner le pointeur source ps sur le premier
symbole de w$.
• Répéter jusqu‘à ce que X = $.
• Soit X le symbole en sommet de pile et a le
symbole pointé par ps.
• Si X est un terminal ou $ alors :
• Si X = a alors enlever X de la pile et
avancer ps.
• Sinon Erreur()
chapitre 6
Exemple précédent
le mot w = 3 + 4 * 5
T E’
+ T E’
F T’
F T’ ε
3 ε
* F T’
4
5 ε
Exercice
le mot w = (7 + 3)5
Remarque
L’algorithme précédent peut il être appliqué à
toutes les grammaires?
Définition
Une grammaire est dite de type LL(1) si la table
d’analyse associée n’a aucune case définie de
façon multiple.
Exemple
S → aAb
A → cd | c
chapitre 6
Table d’analyse
a b c d $
S S → aAb
A A → cd
A→c
chapitre 6
Remarque
La grammaire n’est pas de type LL(1). En effet,
pour pouvoir choisir entre la production A → cd
et la production A → c, il faut lire la lettre qui
suit celle que l’on pointe (donc deux symboles
de prévision sont nécessaires).
chapitre 6
Théorème
Une grammaire ambiguë ou récursive à gauche ou
non factorisée à gauche n’est pas LL(1).
Récursivité à gauche
Une grammaire est immédiatement récursive à
gauche si elle contient un non-terminal A tel qu’il
existe une production A → Aα où α est une chaîne
quelconque.
chapitre 6
Exemple
S → ScA | B
A → Aa | ε
B → Bb | d | e
Elimination de la récursivité à
gauche immédiate
Remplacer toute règle de la forme A → Aα | β par
les deux règles :
A → β A’
A’ → α A’ | ε
Théorème
La grammaire ainsi obtenue reconnaît le même
langage que la grammaire initiale.
Exemple chapitre 6
Définition
Une grammaire est récursive à gauche si elle
contient un non-terminal A tel qu’il existe une
production A+→Aα où α est une chaîne quelconque.
Exemple
S → Aa | b S est il récursif à gauche?
A → Ac | Sd | ε S → Aa → Sda
S → Aa | b
On ordonne S, A
A → Ac | Sd | ε
i = 2 et j = 1 on substitue la production A → Sd
par A → Aad | bd, on obtient A → Ac| Aad | bd| ε
On élimine la récursivité immédiate :
A → bdA’ | A’ S → Aa | b
A’ → cA’ | adA’ | ε A → bdA’ | A’
A’ → cA’ | adA’ | ε
chapitre 6
Factorisation à gauche
Exemple 1
Exemple 2
S → bacdAbd | bacdBcca
A → aD
B → cE
C→…
Au départ pour savoir s’il faut choisir S → bacdAbd
ou S → bacdBcca, il faut lire la 5ième lettre du mot (a
ou c). Dès le départ, quelle production va être
choisie? Ce qui est incompatible avec les
grammaires LL(1).
Cas général chapitre 6
Factorisation à gauche
A → αA’
A → αβ1 | αβ2
A’ → β1 | β2
Algorithme chapitre 6
Exemple
S → aEbS | aEbSeB | a
E → bcB | bca
B → ba
S → aEbSS’ | a
S’ → eB | ε
E → bcE’
E’ → B | a
B → ba
chapitre 6
Exercice
S → abS | abA | aB
A→c
B→d
S → abS’ | aB
α= a et la grammaire est :
S’ → S | A
A→c S → aS’’
B→d S’’ → bS’ | B
S’ → S | A
A→c
B→d
Analyse sémantique chapitre 6
1. Introduction
La sémantique d'un langage de programmation est la
description du sens des constructions du langage. Les
phrases syntaxiquement correctes d'un langage de
programmation n'ont pas toutes un sens. Le
compilateur, qui a la charge de traduire un programme
source vers un programme équivalent en langage
machine, doit s'assurer que le programme a bien un
sens (on dit qu'il est correct sémantiquement), avant
d'effectuer la traduction à proprement parler.
Sémantique statique chapitre 6
1 program exemple;
2 var x : integer;
3 t : array [1..10] of integer;
4 procedure p (z : real);
5 var i : integer;
6 Begin
7 z := i;
8 end; (* fin de p *)
9 begin (* program exemple *)
10 readln (i);
11 x := t;
12 p(x, i);
13 end.
chapitre 6
Remarque
Remarque
Cependant, il n'est pas possible en général
d'assurer que tout ce que fait le programme a
un sens. En d'autres termes, toute la
sémantique d'un langage ne peut être décrite
pas sa sémantique statique.
chapitre 6
program p;
var t : array [1..10] of integer;
i : integer;
function f (n : integer) : integer;
Begin
if n > 2 then f := f (n-1) + f (n-2) else f := n
end; (* f *)
begin (* program p *)
i := 1;
while f(i) < 1000 do 144
Begin
writeln (t[i]); i := i + 1;
end; end.
chapitre 6
Interprétation
Exemple
PROGRAM Z
Nom de type Taille Adresse
INT A; l’objet (octets)
INT B; A Entier 4 0
INT C2;
DEBUT B Entier 4 4
A = 4;
C Entier 4 8
B = A / 2;
C2 = B + A;
Table des symboles du programme Z
FIN
chapitre 6
N.B.
Les macros ne sont pas des instructions machine,
donc ils restent indépendant de l’architecture de
celle-ci.
chapitre 6
Exemple
Le programme Z sera transformé en :
Exemple
PROGRAM Z Z:
INT A; (0)
INT B; (4)
INT C2; (8)
DEBUT
A = 4; INIT (0) 4
B = A / 2; DIV (4) (0) 2
C2 = B + A; ADD (8) (4) (0)
FIN STOP
chapitre 6
PROGRAM Z Z: Z:
INT A; (0) (0)
INT B; (4) (4)
INT C2; (8) (8)
DEBUT
A = 4; INIT (0) 4 INIT (0) 4
B = A / 2; B=2 DIV (4) (0) 2 INIT (4) 2
C2 = B + A; C2 = 6 ADD (8) (4) (0) INIT (8) 6
FIN STOP STOP
chapitre 6
Exemple :
for i = 1 to n j := 3;
boucle for i = 1 to n
j := 3; boucle
i := i + 1; i := i + 1;
fin boucle fin boucle
chapitre 6
Exemple :
for i = 1 to n for i = 1 to n
boucle boucle
a := i * 5; a := a + 5;
fin boucle fin boucle
chapitre 6