Vidéo 6.2
Notes inspirées du cours de JANIN David
Par exemple la grammaire
1. exp -> exp + exp
2. exp -> exp * exp
3. exp -> id
4. exp -> cte
5. exp -> (E)
Tachons de reconnaître l'entrée id + id * id. Nous allons fabriquer un tableau
| Pile (ce que j'ai déjà lu) | Entrée (qui reste à lire) | Action | 
|---|---|---|
| id + id * id | Décalage | |
| id | + id * id | Réduction (3) | 
| exp | + id * id | Dec + | 
| exp + | id * id | Dec id | 
| exp + id | * id | Red (3) | 
| exp + exp | * id | Conflit Red(1) ou Dec * | 
| exp + exp * | id | Dec id | 
| exp + exp * id | EOF | Red(3) | 
| exp + exp * exp | Red(2) | |
| exp + exp | Red(1) | |
| exp | EOF | ACCEPT | 
Là nous avons un automate / analyseur à pile. La pile contient des mots terminaux et non terminaux. Les transitions lisent au plus k symboles en somme de pile (ici k = 3).
Ici on a une table d'action.
| Sommet de pile \ Entrée | identifiant | constante | plus | fois | ( | ) | 
|---|---|---|---|---|---|---|
| Rien | D | D | E | E | D | E | 
| Id | E | E | R(3) | R(3) | E | R(3) | 
| cste | E | E | R(4) | R(4) | E | R(4) | 
| exp | E | E | D | D | E | D | 
| exp + exp | E | E | R(1) | D | E | D | 
| exp * exp | E | E | R(2) | R(2) | E | R(2) | 
| (exp) | E | E | R(5) | R(5) | E | R(5) | 
| ( | D | D | E | E | D | E | 
| + | D | D | E | E | D | E | 
| * | D | D | E | E | D | E | 
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 faire une réduction x \rightarrow x_1, x_2, ... x_n; \{\$=f($1, ... , $n)}$
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 avant dans la pile, avec 0, -1 ... Ou a utiliser ce principe pour produire du code 3 adresses avec la grammaire ETC.