Aller au contenu principal

Analyse ascendante

Notes inspirées du cours de David Janin.

Analyse par décalage-réduction​

Considérons par exemple la grammaire :

1. exp -> exp + exp
2. exp -> exp * exp
3. exp -> id
4. exp -> cte
5. exp -> (exp)

Tâchons de reconnaître l'entrée id + id * id. Nous allons construire un tableau :

Pile (ce qui a déjà été lu)Entrée (ce qui reste à lire)Action
id + id * idDécalage
id+ id * idRéduction (3)
exp+ id * idDéc +
exp +id * idDéc id
exp + id* idRéd (3)
exp + exp* idConflit Réd (1) ou Déc * : on décale
exp + exp *idDéc id
exp + exp * idEOFRéd (3)
exp + exp * expEOFRéd (2)
exp + expEOFRéd (1)
expEOFACCEPT

Il s'agit d'un automate (analyseur) à pile. La pile contient des mots de terminaux et de non-terminaux. Les transitions lisent au plus kk symboles en sommet de pile (ici k=3k = 3). Le conflit décalage/réduction est résolu en faveur du décalage pour donner la priorité à * sur +.

On obtient ainsi une table d'actions (D : décalage, R(i) : réduction par la règle i, E : erreur) :

Sommet de pile \ Entréeidentifiantconstanteplusfois()
RienDDEEDE
idEER(3)R(3)ER(3)
cteEER(4)R(4)ER(4)
expEEDDED
exp + expEER(1)DER(1)
exp * expEER(2)R(2)ER(2)
(exp)EER(5)R(5)ER(5)
(DDEEDE
+DDEEDE
*DDEEDE

Attributs et pile d'analyse​

Et les attributs : comment les manipuler en même temps qu'on fait l'analyse ? On peut stocker sur la pile d'analyse les attributs en même temps que les terminaux et non-terminaux, puis, lors d'une réduction X \rightarrow x_1 x_2 \dots x_n \; \{\$=f($1, \dots, $n)},calculerl′attributde, calculer l'attribut de X$ à partir des attributs dépilés.

Les attributs synthétisés se calculent très facilement lors de l'analyse par décalage-réduction.

Dernière remarque : on peut aussi accéder aux attributs se trouvant plus bas dans la pile, avec $0, $-1... On peut utiliser ce principe pour produire du code 3 adresses avec la grammaire ETF.