Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Context-Free Languages
Introduction
Le contexte des langages hors contexte
Notion de Grammaires :
P→SVC
S → il | elle P ⤳¹ S V C
V → lit | ecrit
⤳² il V C
C→DN
D → une | la ⤳⁴ il lit C
N → leçon | voiture ⤳⁶ il lit D N
⤳⁸ il lit la N
il lit la leçon ⤳⁹ il lit la leçon 3
elle ecrit une voiture :
P ⤳¹ S V C
⤳² il V C
⤳⁴ il lit C
⤳⁶ il lit D N
⤳⁸ il lit : expected tokens la ou une
G = < T, N, R, S >
T : alphabet de terminaux
N : alphabet de non-terminaux
N ∩ T = ∅ et V = T ∪ V
R ⊆ V*× V* fini
S ∈ N : Start Symbol
L(G) = { w ∈ T* / S ⟹* w }
R ⊆ V*× V* fini
Le vide (epsilon) des deux côtés des règles de production :
Le vide à gauche et à droite
Cela veut dire quoi ?
Problème:
Du côté gauche cela signifie que le vide peut produire une
proto-phrase !
Deux restrictions s’imposent :
R ⊆ V⁺ × V⁺ fini ∪ ( S → 𝜺 )
Exemple :
Sinon ...
R ⊆ V⁺× V⁺ fini ∪ ( S → 𝜺 )
𝞪 → 𝞫 𝞪, 𝞫 ∈ V⁺
xE→yF
XE→YF
X→x
Y→y
Exemple : A →² aABC
A → abC →¹ aabCBC
A → aABC
→³ aabBCC
CB → BC
bB → bb →⁴ aabbCC
bC → bc →⁵ aabbcC
cC → cc
→⁶ aabbcc
A →¹ abC →⁵ abc
Cette grammaire dénote le langage aⁿbⁿcⁿ
Grammaires sensibles au contexte
Context -Sensitive Grammars (CSG)
𝞪A𝞫 → 𝞪𝞬𝞫
𝞬 ∈ V⁺
Toute grammaire sensible au contexte est
monotone
A → abC
A → aABC
CB → BC CB → CX
CX → BX
bB → bb
BX → BC
bC → bc
cC → cc
Toute grammaire monotone est sensible au
contexte
Grammaires hors contexte
Context-Free Grammars (CFG)
A → 𝞪
𝞪 ∈ V⁺, A ∈ N
A → 𝞪
𝞪 ∈ T⁺
a,b
a a, b
A B C
A → aA | bA | aB A → aA | bA | aB
B → aC | bC B → a𝜺 | b𝜺
C → 𝜺
En général si A →* 𝜺
A → BC | Da | Ae | 𝜺
A → A’ | 𝜺
A’ → BC | Da | Ae | e
A → uB | v
u ∈ T*, v ∈T⁺ , A, B ∈ N
A → Bu | v
u ∈ T*, v ∈T⁺ , A, B ∈ N
S→N |L& N S→a|f|o|L
N→a|f|o L→aF|fF|oF
L → N ‘,’ N | N F → ‘,’ L | & a | & f | &o
( ( (a + f + o) , )* (a + f + o ) & )? (a + f + o)
aⁿ n ∈ N Grammaires à. Choix Fini Type 4
Finite . Mémoire :
Automaton - ∅ : FA
Langages hors contexte : aⁿbⁿ
IN : . I /o :
I : accepteur
I/O : Traducteur
O : Producteur
Finite
Automaton
. Mémoire :
LIFO - ∅ : FA
OUT :
Langages hors contexte : aⁿbⁿ
. I /o :
I : accepteur
IN :
I/O : Traducteur
O : Producteur
FA . Mémoire :
- ∅ : FA
LIFO - LIFO : PDA
Push Down
OUT Automaton
:
IN : . I /o :
I : accepteur
I/O : Traducteur
O : Producteur
FA
. Mémoire :
LIFO - ∅ : Finite Automaton
OUT : - LIFO : Push Down
Automaton
-
- RAM : Turing Machine
Mémoire & Machines:
- ∅ : FA
- LIFO : PDA
- LBRAM : Lineary Bounded TM
- RAM : TM
IN : . I /o :
I : accepteur
I/O : Traducteur
O : Producteur
FA
. Mémoire :
LIFO - ∅ : FA
OUT :
- LIFO : PDA
- LBRAM : LBTM
- RAM : TM
Langages hors contexte
& Analyse
Une approximation du type des langages de
programmation : ils sont hors contexte modulo le
typage !
Que représente en C : a * b ;
E→ E+E|E-E|E*E|E/E|n
E→ E+E|E-E|E*E|E/E| (E)|n
● E ⤳² n
● E ⤳¹ E + E ⤳² n + E ⤳² n + n
● E ⤳¹ E + E ⤳² E + n ⤳² n + n
Deux dérivations pour un même mot : n + n
n n 2 3
- les noeuds feuilles sont étiquetés par des terminaux, et les noeuds
internes par des non-terminaux ;
E + E E + E
n E + E E + E n
n n n
n
n + (n + n) (n + n) + n
E₊ E₊
En + E₊ E₊ + En
n En + En En + En n
n n n n
n + (n + n) (n + n) + n
E→ E+E |n
E₊ → E₊ + E₊ NON
E → E₊ |
E₊ → E₊ + OUI
E₊ → E + E ≡ E₊ → + E₊ NON
→ n E₊ → + OUI
E → E₊ |
⇒ E₊ → E₊ + | +
→n
E → E₊ | E → E+ |
⇔ E₊ → E + →n
→n
⇔ E→ E+n |n
S → S op S
E→ E+n E→ E*n
|E*n |E+n
| n | n
Ces deux grammaires ne sont pas équivalentes
En + Eₓ E₊ * En
n En * En En + En n
n n n n
n + (n * n) (n + n) * n
E→ E+E |E*E| n E₊ → E₊ + E₊ NON
| E₊ + Eₓ OUI
E → E₊ | Eₓ |
| E₊ + OUI
E₊ → E + E
| Eₓ + E₊ NON
Eₓ → E * E
| Eₓ + Eₓ NON
→n
| Eₓ + OUI
| + E₊ NON
| + Eₓ NON
| + OUI
Eₓ → E₊ * E₊ NON
| E₊ * Eₓ NON
| E₊ * NON
| Eₓ * E₊ NON
| Eₓ * Eₓ NON
| Eₓ * OUI
| * E₊ NON
| * Eₓ NON
| * OUI
E → E₊ | Eₓ | E → E₊ | T
E₊ → E₊ + Eₓ | E + T → Eₓ |
Eₓ → Eₓ * | * E₊ → E + T
→n Eₓ → T *
→n
la
S if E then S fi
La question :
Quelle partie droite de la notion non terminal utiliser ?
la la
E S
E S
la la
Z S$ if E then S fi $ if true then S
E E → true E → false
Follow (A)
Règle 2 :
A A →𝛼 𝛆
● First (t) ={t} ∀ t ∊ T
● X → X1X₂...Xn
First (X1X₂...Xn) ⊇ First(X₁)\ {𝛆 }
si X₁ est nullable alors
First (X1X₂...Xn) ⊇ First(X₂)\ {𝛆 }
……
M → 𝛼N𝛽 :
Y ∅ C c c
Les ensembles Follow :
Z → XYZ Follw(X) ⊇ First(YZ) = First(Y) ⋃ First(Z)
Follw(Y) ⊇ First(Z)
Z→d
X→a
X→Y Follow(Y ) ⊇ Follow(X) 0 1 2
Y→c Z ∅ ∅ ∅
Y→𝛆
X ∅ a, c, d a, c, d
Y ∅ acd a, c, d
LL a c d
Z → XYZ
Z→d Z Z → XYZ Z → XYZ Z → XYZ
X→a Z→d
X→Y
Y→c X X→a
X→Y X→Y X→Y
Y→𝛆
E 1, 2 1, 2
T 3, 4 3, 4
F 5 6
Toute grammaire récursive à gauche est non LL(1)
A → A 𝞪₁ | A 𝞪₂ |... | A 𝞪 | 𝞫₁ | 𝞫₂ |... | 𝞫
A → 𝞫₁ A’ | 𝞫₂ A’ |...| 𝞫 A’
A → 𝞪 A’
A’ → 𝞫₁ | 𝞫₂ |... | 𝞫
S → if b then S else S S → if b then S S’ | a
| if b then S | a S’ → else S | 𝛆
First Follow
Nullables S’
: S if , a else, $
S’ else else, $
LL if a else $
S 1 2
S’ 3, 4 4
S→E$ S→E$
E→T +E |T E → T E’
T→F* T| |F E’→ + T E’ | 𝛆
F→n|(E) 1 2 T → F T’
E’ o o
T’ → * F T’ | 𝛆
T’ o o
F→n|(E)
E N n
T N n
F N n
1 2
1 2 3 4
S→E$
E $, ) $, )
S ∅ ∅ ∅ n, (
E → T E’ E’ $ $, )
E ∅ ∅ n, ( n, (
E’ + + + +
E’→ + T E’ | 𝛆 T + +, $, )
T ∅ n, ( n, ( n, ( T → F T’ T’ + +, $, )
T’ * * * * T’ → * F T’ | 𝛆 F * *,+, $, )
F n, ( n, ( n, ( n, (
F→n|(E)
S→E$
E → T E’
First Follow
E’→ + T E’ | 𝛆
T → F T’ E n, ( $, )
T’ → * F T’ | 𝛆
E’ + $, )
F→n|(E)
n ( + * ) $
T n, ( $, ),+
S 0 0
E 1 1 3 3 T’ * $, ),+
E’ 2 3 3
F n, ( $, ), +,
T 4 4 *
T’ 6 5 6 6
F 7 8
// S → E $ : terminal courant est mémorisé
// dans la variable lookahead
// E → T E’
void E() { T(); E’(); }
// E’→ + T E’ | 𝛆
void E’() { Traiter(‘+’); T(); E’(); }
/ / T → F T’
void T() {F(); T’();}
// T’ → * F T’ | 𝛆
void T’() { Traiter(‘*’); F(); T’(); }
//F→n|(E)
void F() {
if (looka==’n’) Traiter(‘n’);
else if (looka==(((‘) { E() ; Traiter(‘)‘);
else error();
}
Version itérative : pile explicite
Le mot à analyser : (n +n ) * n $
La dérivation :
(n +n )* n T’E’$ ⇒ (n +n )* n E’$⇒ (n +n )* n $
Pile Entrée Action
$E (n+n)*n $ E → TE’
$E’T (n+n)*n $ T → FT’
$E’T’F (n+n)*n $ F → (E)
$E’T’)E( (n+n)*n $ dépiler
$E’T’)E n+n)*n $ E → TE’
$E’T’)E’T n+n)*n $ T → FT’’
$E’T’)E’T’F n+n)*n $ F→ n
$E’T’)E’T’n n+n)*n $ dépiler
$E’T’)E’T’ +n)*n $ T’ → 𝛆
$E’T’)E’ +n)*n $ E’ → +TE’
$E’T’)E’T+ +n)*n $ dépiler
$E’T’)E’T n)*n $ T → FT’
$E’T’)E’T’F n)*n $ F→ n
$E’T’)E’T’n n)*n $ dépiler
$E’T’F n$ F→ n
$E’T’n n$ dépiler
$E’T’ $ T’ → 𝛆
$E’ $ E’ → 𝛆
$ $ Le mot est accepté
Interprétation : Compliquée
E
Comment peut-on évaluer
une expression ?
T(1) E’
1 +2+3
+ T(2) E’
+ T(3) E’
𝛆
1 +2+3
int S () { int e = E(); Traiter(‘$’); return e; }
// E → T E’
int E() { int t = T(); int e = E’( t ); }
// E’→ + T E’ | 𝛆
int E’(int t1) { Traiter(‘+’); int t = T(); int e = E’(t ) + t1 ; }
Extended Backus Naur Form : BNF to EBNF
E → T + E | T - E |T
T→F* T|F/ T |F
F→n|(E)
⇔ E → T (+T | -T )*
T → F (* F | / F)*
F→ n|(E)
void E () {
T();
while (la {+,-})
if (la==+) { Traiter(+); T(); }
else // la ==-
{ Traiter(-); T(); }
}
int E () {
return valeur
Analyse ascendante
● Analyse LR