Vidéo 4
Notes inspirées du cours de JANIN David
Exemple des expressions arithmétiques
Une grammaire reconnaissant les expressions arithmétiques se reconnaît avec les expressions suivantes
- exp -> ID
- exp -> Cste
- exp -> exp + exp
- exp -> exp * exp
- exp -> (exp)
Ces 5 règles sont appelées les règle de grammaire ou règle de production. Dans ces règles on distingue :
- les terminaux ce sont les unités lexicales (aussi appelées tokens) qui sont données en entrée de l'analyseur. C'est un dire, c'est une suite / un mot de terminaux, donc dans
- les non-terminaux , ce sont les ensembles de mots de terminaux qu'on souhaite construire ou définir
- les règles de production sont : qui peuvent être lue comme des inclusion ensemblistes (partie de )
Théorème :
Ce type d'inéquation admet une plus petite solution.
Idée de preuve : Soit
avec le nombre de terminaux. Le constat est que si est croissant c'est à dire si et et si alors . Il est alors facile de vérifier que
et que on a , on dit que exp est un point fixe de et exp est le plus petit de ces point fixes. Si est un point fixe de , on a
mais comme on a, par récurrence, et donc
Exemple d'utilisation de cette grammaire
Analyse syntaxique de , l'analyseur va reconnaître 2 comme une constance, comme , comme un ID, comme + et comme un ID. Comment pouvons nous vérifier que cette expression appartient bien au langage. Vérifions que csteID+ID est bien une entrée syntaxique correcte selon la grammaire.
Suite de dérivations (gauche) de
Remarques
- Dés qu'un terminal est généré ou engendré par une règle, on ne peut plus l'effacer
- il coupe implicitement l'entrée en ce qui se trouve à gauche et ce qui se trouve à droite.
En pendant compilation, on peut avoir l'impression que cette suite de dérivation induit syntaxiquement une "priorité" sur les opérateurs binaires + et *
Est ce satisfaisant ? Presque ... Expliciter la syntaxe, c'est bien. Mais, cette grammaire est ambigüe. Il y a au moins deux syntaxes possibles pour CST * ID + ID.
Cela est toujours une suite de dérivation gauche, mais la structure syntaxique induite est plutôt
Définition :
Une grammaire est dites ambigüe lorsqu'il existe deux suites de
dérivations gauches, distinctes, à partir du start symbol, qui produisent la
même entrée.
En compilation, on ne veut pas ça ! En effet on va faire de la traduction dirigée par la syntaxe. Deux syntaxes possibles donneront deux codes différents. Exemple . En compilation, on n'utilise que des grammaires non ambigüe.
Arbre de dérivations
Sur le même exemple
Ceci est un arbre de dérivation, aussi appelé arbre de syntaxe concret. Autrement, un arbre de dérivations c'est un arbre dont :
- les sommets sont étiquetés sur TON
- les embranchements définis par des règles de productions
- les feuilles étiquetées sur T
- la racine étiquetée par le start symbol
Remarque
Il y a bijection entre arbre de dérivation et suites de dérivations gauches. Les suites de dérivations gauches sont exactement les parcours en profondeur, à gauche d'abord préfixe, des arbres de dérivations.
Essayer de construire un arbre de dérivation pour est impossible
Définition :
Une grammaire est ambigüe lorsque il existe deux arbres de
dérivations pour une même entrée (un même mot de terminaux).
La grammaire ci-dessus quoique ambigüe, a tout de même le mérite de définir correctement les expressions arithmétiques. Cependant, ces expressions peuvent-elle être définies par une grammaire non ambigüe ?
Une première grammaire non ambigüe
Idée : distinguer dans les expressions arithmétiques les termes qui composent les sommes de facteurs qui composent les produits. Autrement dit nous allons utiliser 3 noms terminaux.
exp
Avec comme start symbol. Les règles de cette grammaire :
- exp -> term
- exp -> exp + term
- term -> fact
- term -> term * fact
- fact -> ID
- fact -> CSTE
- fact -> (exp)
Pas d'ambiguité ? Nous voulons toujours dériver ie CSTE * ID + ID.
Cet arbre est le seul arbre de dérivation possible ! Le parenthésage induit par cet arbre est bien . Nous avons donc notre grammaire pour la compilation. La grammaire utilisée s'appelle la grammaire ETF. Autre grammaire ?
- //mot vide
- //mot vide
On peut vérifier que cette grammaire engendre aussi les mêmes expressions arithmétiques et qu'elle n'est pas ambigüe.