Rappel sur les ensembles
annulable,
premier et
suivant:
a) L'ensemble
annulable contient les variables annulables, c'est-à-dire celles qui peuvent se dériver en ε
, éventuellement en appliquant plusieurs productions.
annulable = {}
b) L'ensemble
premier associe à une variable l'ensemble des terminaux qui peuvent apparaître comme lexème d'une dérivation
partant de cette variable, éventuellement en appliquant plusieurs productions.
premier(E) = {'+','*','a'}
c) L'ensemble
suivant associe une variable à l'ensemble des terminaux qui peuvent apparaître juste après cette variable
dans un arbre de dérivation partant de
S.
suivant(E) = {'$'} + premier(E) = {'$','+','*','a'}
On construit la table d'analyse LL selon le principe suivant :
|
... |
a |
... |
... |
|
|
|
X |
|
X ::= α si a appartient à premier(α)
X ::= ε si a appartient à suivant(X)
|
|
... |
|
|
|
Il n'y a pas de conflit, la grammaire est LL(1).
L'analyse s'effectue selon le principe suivant :
- si le sommet de la pile d'analyse est un non-terminal, on
cherche dans la table la règle à appliquer en regardant le symbole
d'entrée :
- si une règle existe, on remplace le non-terminal par le membre droit de la
règle trouvée ;
- si pas de règle, il y a échec ;
-
si le sommet de la pile d'analyse est un terminal
- s'il est différent du symbole d'entrée, il y a échec ;
- s'il est identique au symbole d'entrée
- si c'est '$', la chaîne d'entrée est reconnue ;
- on l'efface de la pile d'analyse et on avance dans
l'entrée.
Entrée |
Pile d'analyse |
Action |
a+a*a |
S |
(0) |
a+a*a |
E$ |
(3) |
a+a*a |
a$ |
shift |
+a*a |
$ |
reject |
La séquence "a+a*a" n'est pas reconnue!
Entrée |
Pile d'analyse |
Action |
+a*aa$ |
S |
(0) |
+a*aa$ |
E$ |
(1) |
+a*aa$ |
+EE$ |
shift |
a*aa$ |
EE$ |
(3) |
a*aa$ |
aE$ |
shift |
*aa$ |
E |
(2) |
*aa$ |
*EE$ |
shift |
aa$ |
EE$ |
(3) |
aa$ |
aE$ |
shift |
a$ |
E$ |
(3) |
a$ |
a$ |
shift |
$ |
$ |
accept |
Le mot "+a*aa" est reconnu!
Implémentation de l'analyseur LL en Java:
cf cours.