You are on page 1of 29

Compilation

Analyse syntaxique CHAPITRE 4
Chapitre 4

Implémentation de
l’analyseur syntaxique
1
Compilation
Analyse syntaxique CHAPITRE 4
Analyse déscendante
récursive prédictive
2
Compilation
Analyse syntaxique CHAPITRE 4
Plan
L’analyseur LL(1) déterministe
Principe et spécifications
L’ensemble directeurs d’une expression de choix
Ensemble des symboles premiers
Ensemble des symboles suivants
Ensemble des symboles directeurs
Ecriture de l’analyseur syntaxique LL(1) déterministe et optimal
3
Compilation
Analyse syntaxique CHAPITRE 4
SPECIFICATIONS
DES TRAITEMENTS DE
L’ANALYSEUR
4
Compilation
Analyse syntaxique CHAPITRE 4
Procedure A;
Debut
T(o);
Fin;
Principe
A chaque règle grammaticale
A÷o
on associe une procédure de la forme:
Où T(o) est le traitement associé à la partie droite de la règle A
5
Compilation
Analyse syntaxique CHAPITRE 4
S
X
#
Partie correcte
Partie incorrecte
Spécification de l’analyseur syntaxique
SYM_COUR
S();
Si SYM_COUR=‘#’
ALORS
AFFICHER("TOUT LE FICHIER EST OK")
SINON
AFFICHER(" FIN DE FICHIER NON OK")
FINSI
6
Compilation
Analyse syntaxique CHAPITRE 4
A
Spécification d’une règle de la grammaire
SYM_COUR
A
SYM_COUR
Premier symbole après
la partie reconnue
par la règle
A
SYM_COUR
Premier symbole
erroné
ETAT INITIAL
SUCCES
ECHEC
7
Compilation
Analyse syntaxique CHAPITRE 4
TRADUCTION D’UNE
REGLE EN
TRAITEMENT
8
Compilation
Analyse syntaxique CHAPITRE 4
Composants de o
a eV
t

A eV
n

c
|
1
|
2
|
1
| |
2
¬ A o, o contient l’une des formes suivantes
9
Compilation
Analyse syntaxique CHAPITRE 4
a
a
T(aeV
T
)= SI SYM_COUR=‘a’
ALORS SYM_SUIV()
SINON ERREUR(" ERR: a attendu ")
FINSI
Le cas d’un terminal
SYM_COUR
10
Compilation
Analyse syntaxique CHAPITRE 4
A
Spécification d’une règle de la grammaire
SYM_COUR
A
SYM_COUR
Premier symbole après
la partie reconnue
par la règle
A
SYM_COUR
Premier symbole
erroné
ETAT INITIAL
SUCCES
ECHEC
T(A)= A(); //appel de la procédure A
11
Compilation
Analyse syntaxique CHAPITRE 4
c
c
Le cas de c
retourne toujours vrai!! C’est l’élément neutre
Il est toujours dépassé
Le cas de c
c
c
a
b
a
b
T(c)= ; //instruction vide
SYM_COUR
SYM_COUR
12
Compilation
Analyse syntaxique CHAPITRE 4
Le cas d’une concaténation |
1
|
2
SYM_COUR
|
1
|
2

T(|
1
|
2
)= T(|
1
) T(|
2
)
|
1
|
2

13
Compilation
Analyse syntaxique CHAPITRE 4
CAS de o
1
|o
2
|…|
,
o
n

o
1
|o
2
|…|
,
o
n
La phrase peut être engendrée
Par n’importe quel choix
o
1
, o
2
, … ou bien o
n
SYM_COUR
Algorithme naïf:
Tester les o
i
les uns après les autres jusqu’à trouver le o
k
qui a engendré la phrase ou
déclarer la phrase erronée après l’échec de tous les o
i

OPTIMISATION:
Tester un seul o
k
:
soit o
k
a engendré la phrase et l’analyse continue,
soit o
k
n’a pas engendré la phrase et on déclare alors que la phrase est erronée!
14
Compilation
Analyse syntaxique CHAPITRE 4
QUESTION: comment faire pour choisir a coup sûr ce o
k?

Principe: pour une expression de choix o
1
|o
2
|…|
,
o
n ,
on caractérise

chaque choix o
i
parmi les o
1
, o
2
, …,o
n
par le début des phrases du L(o
i
)

o
i
C’est l’ensemble des symboles premiers de o
i

On le note premier(o
i
) ou o
i

o
i
’={aeV
t
/ - o
i
a|, | eV
t
* }
15
Compilation
Analyse syntaxique CHAPITRE 4
Calcul de o’
Cet ensemble se calcule récursivement selon le tableau suivant:

o Règle de calcul de o’
a eV
t
{a}
A eV
n
Il existe une règle A tel que: A |:
L(A)=L(|) donc A’=|’
c C
|
1
|
2
Si c e L(|
1
) alors (|’
1
|
2
’ ) sinon |’
1


|
1
| |
2
|’
1
|
2

16
Compilation
Analyse syntaxique CHAPITRE 4
Nous avons vu que c’= C!!

Problème: comment caractériser alors les dérivations en c ???

Exemples:
aA | bB |

c
a b
C
a………. b……….
c
o’
a*
aaaaa….
c
c
c
17
Compilation
Analyse syntaxique CHAPITRE 4

Définition: symboles suivants d’une expression o

L’ensemble de symboles suivants de o est l’ensemble des symboles terminaux qui apparaissent
après les phrases engendrées par o
Notation: suivant(o) ou o’’
o
o’’
18
Compilation
Analyse syntaxique CHAPITRE 4
Nouveau problème: et si c apparaît en fin de chaîne ?
pointeur
c
Symboles
précédents
Phrase analysée
Question: comment caractériser ce c en fin de phrase
Avec le même principe et la même logique?
‘rien’
Fin de la
phrase
c
Symboles
précédents
Phrase analysée
#
Fin de la
phrase
19
Compilation
Analyse syntaxique CHAPITRE 4
Définition: grammaire étendue

Soit G=(V
t
, V
n
, P, S) une grammaire. La grammaire étendue associée à G est G
+
=(V
t
+
, V
n
+
, P
+
,¿)
avec:
V
t
+
= V
t
{#}; V
n
+
= V
n
{¿}; P
+
=P {¿S#}; ¿ super axiome
Exemple: si G1=(V
t
, V
n
, P, S) et V
t
={a, b}, V
n
={A, S}, P={S÷aS|A, A÷a|bA}, S axiome alors:
G
+
=(V
t
+
, V
n
+
, P
+
,¿) avec:
V
t
+
={a, b, #},
V
n
+
={¿ , A, S},
P
+
={¿ S#, S÷aS|A, A÷a|bA}, ¿ super axiome
20
Compilation
Analyse syntaxique CHAPITRE 4
L’analyseur LL(1) déterministe

Calcul des symboles suivants:

Soit une expression quelconque, dans un
contexte tel que Xoo|.
o’’
X
se calcule récursivement par :
o’’
X
=
|’ si ce L(|)
|’ X’’ si c e L(|)
X
|
o o
X
|
o o
c
|’
X"
21
Compilation
Analyse syntaxique CHAPITRE 4
Calcul des symboles suivants:
Soit une règle et soit o’’
Xoo|
les symboles suivants de o
dans la règle Xoo|. o’’
Xoo|
se calcule récursivement selon la règle suivante:
o’’
Xoo|
=
|’ si ce L(|)
|’X’’ si c e L(|)
X
|
o o
X
|
o o
c
|’
X’’
Et :
o’’=
Xoo|
o’’
Xoo|
22
Compilation
Analyse syntaxique CHAPITRE 4
Ensemble directeur d’une expression:

Soit une expression de choix ç=o
1
| o
2
| …| o
n
. L’ensemble directeur de o
i
dans le contexte ç
est l’ensemble des symboles qui caractérisent les dérivations de o
i
dans ç .

Notation D(ç, o
i
)

Il est donné par :

D(ç, o
i
) =
o
i
’ si o
i
 c
o
i
’ ç
i
’’ si o
i
 c
23
Compilation
Analyse syntaxique CHAPITRE 4
L’ANALYSEUR LL(1)

ECRITURE DE L’ANALYSEUR
24
Compilation
Analyse syntaxique CHAPITRE 4
Le texte à analyser est dans un fichier;
La grammaire est supposée de type LL(1)
L’analyseur doit afficher un message d’erreur et s’arrêter dans le cas d’une erreur
Hypothèses de travail
25
Compilation
Analyse syntaxique CHAPITRE 4
PROGRAMME AnalyseurLL1deterministe;
CONST
symfin=‘#’;

TYPE T_SYM_COUR =ENREGISTREMENT
NOM: CHAINE[20];
CL: CLASS_LEX;
FIN
VAR
Fich FICHIER; //fichier contenant le texte à analyser
SymCour T_SYM_COUR; / /symbole courant

PROCEDURE SymboleSuivant();
DEBUT
//ANALYSEUR LEXICAL
FIN SymboleSuivant;

26
Compilation
Analyse syntaxique CHAPITRE 4
PROCEDURE PremierSymbole;
DEBUT
Ouvrir(fich);
LIRE_CAR();
SymboleSuivant();
FIN PremierSymbole;

PROCEDURE ERREUR(message : CHAINE[40]);
DEBUT
AFFICHER (‘ERREUR!!! Symbole : ‘, message, ‘attendu’);
ARRET(); //arrêter l’exécution
FIN ERREUR;


27
Compilation
Analyse syntaxique CHAPITRE 4
//pour chaque règle A  o on associe une procédure de la forme:

PROCEDURE A();
DEBUT
ζ o; //traitement associé à la partie droite de la règle
FIN A;


DEBUT //corps principal

PremierSymbole;
S(); //appel de la procedure asscoiée à l’axiome
SI SymCour=SymFin
ALORS afficher (‘la phrase est correcte’)
SINON afficher (‘la fin de la phrase est incorrecte’)
FinSi;
FIN AnalyseurLL1determinsite.
28
Compilation
Analyse syntaxique CHAPITRE 4
o Traitement associé a o
a eV
t

a_TOKEN
if (SymCour.CL==a_TOKEN) SymboleSuivant ;
else ERREUR(CODE_ERR) ;
A eV
n
A(); // appel de la procédure associée à la règle A
c ; //instruction vide
|
1
|
2
ζ|
1
; ζ|
2
;
|
1
|

|
2

Switch (SymCour.CL) {
case D(|
1
|

|
2
, |
1
) : ζ|
1
; break;
case D(|1| |2, |2) : ζ|
2
; break;
default ERREUR(CODE_ERR)
}
29