Vous êtes sur la page 1sur 4

Cours de compilation, Analyse syntaxique Mr HAMMOUDA Mohamed

USDB, 3ème année licence, SI


Remarque: les exemples sont développés en cours

Chapitre II Analyse syntaxique

Première partie: Analyse descendante

Introduction

Tout langage de programmation possède une grammaire qui permet de décrire sa structure syntaxique.

Le problème est donc:

- (L) un langage engendré par une grammaire (G)


- Un programme (P)

Question: P ϵ L(G) ?

Principe général

Recevoir une suite d'unités lexicales de la part de l'analyseur lexical et essayer de construire un arbre de dérivation
en suivant les productions de la grammaire.

Deux cas:

- Succès: le programme est syntaxiquement correct

- Echec: syntaxiquement erroné

Deux méthodes

- Méthode descendante: LL (Left to right Left most derivation)

- Méthode ascendante: SLR, LR, LALR

Rappel

Grammaire: G=(T, N, S, P) où

1. T ensemble non vide de symboles terminaux


2. N ensemble de symboles non terminaux, avec T et N disjoints
3. S ϵ N axiome
4. P ensemble de règles de productions

Langage généré L(G): L(G) = {ω ϵ N* / S … ω}


Cours de compilation, Analyse syntaxique Mr HAMMOUDA Mohamed
USDB, 3ème année licence, SI

Arbre de dérivation ou arbre syntaxique (AS)

1. Une racine l'axiome

2. les feuilles: les symboles terminaux

3. les nœuds: les symboles non terminaux

4. les fils d'un nœud X sont β1, β2, , βn si et seulement si on a une production X  β1, β2, , βn

Analyseur LL(1)

But: construire un arbre syntaxique descendant efficace sans rebroussement appelé analyseur prédictif non récursif

Principe: construire d'une manière descendante l'arbre syntaxique de la racine (axiome) vers les feuilles (les
symboles terminaux)

Exemple

{S  aSbT|cT|d, T  aT|bS|c}

Mot = "accbbd"

a S b T

c T b S

c d

Le problème de l'analyseur descendant est de prédire la production à appliquer pour développer un non terminal.
Pour ce faire, l'analyseur utilise une table d'analyse dont la construction s'appuie sur deux ensembles: PREMIER et
SUIVANT.

L'ensemble PREMIER

L'ensemble PREMIER d'une production αβ, noté Prem(α), est l'ensemble de tous les symboles terminaux, y
compris ε, qui peuvent commencer toute chaîne qui se dérive de la production α.

εPrem(α) si et seulement α …ε


Cours de compilation, Analyse syntaxique Mr HAMMOUDA Mohamed
USDB, 3ème année licence, SI
Algorithme de calcul de l'ensemble PREMIER
Debut
Une grammaire G=(T,N,S,P)
Pour tout X de la forme:
Si xT Alors Prem(x)={x}
Si Xε une production de P Alors Prem(X)={ε}
Si X12 … n une production de P avec iT ou N
{
Prem(X)=Prem(1) -{ε};
i=2;
Tantque i≤n et εPrem(i-1)
{
Prem(X)=Prem(X)Prem(i)-{ε};
i=i+1;
}
Si i>n et εPrem(n) Alors Prem(X)=Prem(X){ε};
Fin
L'ensemble SUIVANT
L'ensemble suivant d'un non terminal X, noté Suiv(X), est l'ensemble de tous les symboles terminaux qui peuvent
apparaître immédiatement à droite de X.
Algorithme de calcul de Suiv(X)
Début
Une grammaire G=(T, N, S, P)
Si X=S Alors Suiv(X)={$} Sinon X={}
Pour toute production A contenant X à droite:
{

1. (AαX)P, Suiv(X)=Suiv(X)Suiv(A)
2. (AαX)P et εPrem(), Suiv(X)=Suiv(X)Prem()
3. (AαX)P et εPrem(), Suiv(X)=Suiv(X)Prem()Suiv(A)

}
Fin

Table d'analyse LL(1)


C'est une table a deux dimensions, en lignes les productions et en colonnes les symboles terminaux y compris le $.

Algorithme de construction de la table d'analyse

Debut
Une grammaire G=(T,N,S,P)
n nombre de productions
m nombre de symboles terminaux
P={P1, P2, …, Pn} ensemble des productions
TableLL1[n,m] table d'analyse
Pour toute production (Piα)P
{

1. aPrem(α), aε, TableLL1[Pi,a] = (Piα)


2. si εPrem(α), bSuiv(A) TableLL1[Pi,b] = (Piα)

}
Chaque case vide est un cas d'erreur.
Fin
Cours de compilation, Analyse syntaxique Mr HAMMOUDA Mohamed
USDB, 3ème année licence, SI
Propriétés d'une grammaire LL(1)
Une grammaire ambiguë, récursive à gauche ou non factorisée à gauche ne peut être LL(1).

Conditions d'une grammaire LL(1)


Une grammaire est dite LL(1) si sa table d'analyse ne présente aucun conflit, et elle ne peut être LL(1) que si les
conditions suivantes sont vérifiées:

- Pour toute production de la forme A  1 2 on a Prem(1) ∩ Prem(2) = {}


- Pour toute production de la forme A    ε on a Prem() ∩ Suiv(A) = {}
- Pour toute production de la forme A  1 2 on n'a pas 1  ε et 2  ε

Vous aimerez peut-être aussi