Analyse syntaxique Tout langage de programmation possde des
- Slides: 13
Analyse syntaxique
�Tout langage de programmation possède des règles qui indiquent la structure syntaxique d’un programme bien formé Par exemple en Pascal un programme bien formé est composé de blocs, un bloc est formé d’instructions, une instruction de …. RQ. La syntaxe d’un langage peut être décrite par une grammaire
La problématique �L’analyseur syntaxique reçoit une suite d’unités lexicales de la part de l’analyseur lexical et doit vérifier que cette suite peut être engendrée par la grammaire du langage. �Le problème est donc: Étant donnée une grammaire G Étant donné un mot m (un programme) �La question: est ce que m appartient au langage g en er e par G
Solution �Le principe est d’essayer de construire un arbre de dérivation. Il existe deux méthodes pour cette construction, méthode d’analyse descendante et méthode d’analyse ascendante.
Analyse descendante �Principe: construire l’arbre de dérivation du haut (la racine, c’est à dire l’axiome de départ) vers le bas (les feuilles, c’est à dire les unités lexicales).
Exemple 1 Soit G: S a. Ab A cd | c Les mots acdb et adcb apparient-il à la grammaire G?
Exemple 2 �E E+E | E – E | E * E | E /E | (E) | nb �Essayer le Mot: 3*(3+5)
La table d’analyse LL(1) �Pour construire une table d’analyse on a besoin des ensembles: First et Follow. 1. Calcul de First Pour toute chaîne αcomposée de symbôles terminaux et non terminaux on cherche First(α) l’ensemble de tous les terminaux qui peuvent commencer une chaîne qui se dérive de α.
Algorithme de First 1. Si X est un non terminal et X Y 1 Y 2…Yn est une pro duction de la grammaire (avec Yi symbôle terminal ou non terminal) alors �Ajouter les eléments de First(Y 1) sauf ε dans First(X) �S’il existe j (j ∈{2, …, n} tel que pour tout i =1, …, (j-1) on a First(Yi), alors ajouter les eléments de First(Yj) sauf ε dans First(X) �si pour tout i = 1, …, n First(Yi), alors ajouter ε dans First(X) 2. 3. Si X est un non terminal et X ε est une production, ajouter ε dans First(X) Si X est un terminal First(X) = {X} Recommencer jusqu’à ce qu’on n’ajoute rien de nouveau dans les ensembles First.
Exemple �Soit G: S ABCe A a. A | ε B b. B | c. B | ε C de | da | d. A
Algorithme de Follow 1. Ajouter un marqueur de fin de chaîne à Follow(S) (Exemple #)(où S est l’axiome de départ de la grammaire) 2. Pour chaque production A αBβ où B est un non terminal, alors ajouter le contenu de First(β) à Follow(B) sauf ε 3. Pour chaque production A αB alors, ajouter Follow(A) à Follow(B) Pour chaque production A αBβ avec ε ∈ First( β) alors, ajouter Follow(A) à Follow(B) Recommencer à partir de l’étape 3 jusqu’à ce qu’on n’ajoute rien de nouveau dans les ensembles Follow. 4.
Exemple �E TE’ �E’ + TE’ | ε �T FT’ �T’ *FT’ | /FT’ | ε �F (E) | nb Calculer l’ensemble First et Follow pour chaque non terminal
Construction de la table d’analyse LL �Une table d analyse est un tableau M a deux dimensions qui indique pour chaque symbole non-terminal A et chaque symbole terminal a ou symbole $ la règle de production à appliquer. 1. Pour chaque production A α faire a) Pour tout a ∈ First( α) (où a ≠ ε), rajouter la règle A α dans la case M[A, a] b) Si ε ∈ First( α), alors pour b ∈ Follow(A), ajouter A αdans la case M[A, b] 2. Chaque case vide est une erreur de syntaxe.