Cours 6 : Partie avant d’un compilateur
Partie avant d’un compilateur
On veut générer des analyseurs syntaxiques qui sont des automates à pile déterministes pour une exécution en temps linéaire.
- Lex : générateur d’analyseurs lexicaux
- Yacc : générateurs d’analyseurs syntaxiques ⟶ donne un AST
Construction d’un automate à pile à partir d’une grammaire
pour (guess) pour (check)
Cet automate est déterministe ssi
i.e la classe
- soit les singletons sur
- soit le vide
NB : problème : on ne peut donc reconnaître qu’un programme au plus, il nous faut donc étendre un peu la définition
- Automate à
-fenêtres : -
- où
- NB : on peut, sans perte de généralité, supposer
quitte à compléter avec des à la fin du fichier est notre fenêtre de lecture (de lettres) ⟶ on ne touche pas à (à part sa première lettre), le symbole couramment lu (première lettre de ) _____
- où
Sémantique :
On accepte dans une configuration
Syntaxe :
mais
Déterministe si
- soit il existe une seule transitions
- soit il n’y en a pas et alors
, il existe au plus une transition
Soit un automate à pile à
fenêtres. On peut construire un automate équivalent (avec ^k = L(𝒜’) 𝒜$ l’est.
Preuve :
Réciproque :
Premiers et suivants
Pour
Ex :
Ex :
N | Prem_1 | Suiv_1 |
---|---|---|
E | (, i | $, ), + |
T | (, i | *, $, ), + |
F | (, i | *, $, ), + |
- La
-fenêtre de est : -
- Grammaire alg.
fortement : -
si
,
Th : Si
est fortement alors son automate guess/check à -fenêtres est déterministe.
Ex :
Dans l’exemple précédent, la grammaire n’est pas fortement
Comment changer la grammaire pour que ce soit le cas ?
N | Prem_1 | Suiv_1 |
---|---|---|
E | (, i | $, ) |
E’ | 𝜀, + | $, ) |
T | (, i | +, ), $ |
T’ | 𝜀, * | +, ), $ |
F | (, i | *, +, ), $ |
Maintenant :
Analyseur récursif descendant
Exemple :
fonction
w = T(w)
return E'(w)
fonction
w = F(w)
return T'(w)
fonction
if w == (w':
w = E(w')
if w == )w':
return w'
if w == iw':
return w'
fonction
if w == 𝜀 or w == )w':
return w
if w == +w':
w = T(w')
return E'(w)
- Une grammaire est
: -
si
et :
Prop : Si
est fortement , alors elle est
L’inverse est faux : il existe des grammaires
qui ne sont fortement pour aucun .
Prop : Si
est alors elle est fortement
Prop : Si
est , alors elle n’est pas ambiguë
Prop : Si
est , alors elle n’est pas récursive à gauche
Hiérarchies
Langages algébriques
∨
Langages non ambigus
∨
Langages déterministes
∨
∨
∨
∨
∨
Langages rationnels
∨
Grammaires :
Prop : Soit
. On peut construire une grammaire équivalente fortement .
Leave a comment