Vous êtes sur la page 1sur 13

Chapitre 3

Analyse syntaxique : notions de base

1. Principe de l’analyse syntaxique :


• Tout langage de programmation possède des règles qui indiquent la structure
syntaxique d’un programme bien formé.
• La syntaxe d’un langage peut être décrite par une grammaire.
• L’analyseur syntaxique reçoit une suite d’unités lexicales de la part de l’analyseur
lexical et doit vérifier si cette suite peut être engendrée par la grammaire du langage.
 Le problème de l’analyse syntaxique est :
Etant donné : une grammaire G et un mot ‘m’ (programme ou
séquence d’unités lexicales) est ce que ‘m’ appartient au langage
généré par G ?
 La solution à ce problème est :
La solution consiste à déterminer si un arbre de dérivation pour
le flux des unités lexicales en entrée existe ou n’existe pas.

Grammaire
non
contextuelle

Le mot ‘m’

Suite d’unités lexicales


renvoyée par l’analyseur
Analyseur Arbre
syntaxique
lexical syntaxique abstrait
(suite à des appels
successifs à la fonction
ProchaineUnitéLexicale())

Erreurs
syntaxiques
2. Grammaire non contextuelle (de type 2): (Voir cours de THL)
3. Dérivation :On appelle dérivation, l’application d’une ou plusieurs règles à partir d’une
chaîne de (T ∪ N) + . On note → une dérivation obtenue par l’application d’une seule règle de
production et on note →* une dérivation obtenue par l’application de plusieurs règles de
production.

Soit les règles :


S→A
A → bB
B→c
La chaîne bc peut être dérivée par l’application de ces règles comme suit :
S → A → bB → bc
On peut noter ces dérivations par une expression plus condensée S →* bc.
D’une manière générale, si G est une grammaire définie par (T, N, S, P) alors le
langage généré peut être noté par : L(G) = {w ∈ T* tel que S →* w }.
On distingue deux façons d’effectuer une dérivation :
a. Dérivation gauche ( leftmost) : consiste à remplacer le symbole non terminal le
plus à gauche.
b. Dérivation droite ( rightmost ) : consiste à remplacer le symbole non terminal le
plus à droite.

4. Arbre de dérivation : On appelle arbre de dérivation (ou arbre syntaxique) tout


arbre tel que :
• La racineestl’axiome
• Les feuilles sont des unités lexicales ou Ɛ.
• Les nœuds sont des symboles non-terminaux.
• Les fils d’un nœud ‘α’ sont β0, β1, ……..,βn si et seulement si
αβ0 β1, ……..,βn est une règle de production.
• Le mot w, dont on fait l’analyse, est constitué des étiquettes des feuilles, lues de
gauche à droite
Exemple :Soit G = ({a, b, c}, {S, T},
S, P)

P est défini par :

S → aTb | c
T → cSS | S

L’arbre de dérivation de accacbb est :

5. Arbre abstrait

On appelle arbre abstrait une forme condensée d’arbre syntaxique qui est utilisée
dans les compilateurs. L’arbre abstrait est obtenu par des transformations simples de
l’arbre de dérivation. L’arbre syntaxique abstrait est plus compact que l’arbre
syntaxique concret et contient des informations sur la suite des actions effectuées
par un programme.

Dans un arbre abstrait, les opérateurs apparaissent comme des nœuds intérieurs et
les opérandes apparaissent comme des feuilles.

Exemple :

Si on considère, la grammaire G = ({a, +, (, )}, {E, T, F}, E, P)

P étant défini par :

E→T|E+T
T→F|T*F
F → a | (E)
Les arbres syntaxiques (concret et abstrait) pour la chaîne a + a * a sont :

6. Grammaire ambiguë :Une grammaire est dite ambiguë s’il existe une chaine qui
admet plusieurs arbres de dérivation différents.
Exemple : Soit la grammaire G : E E + E | E * E | ( E ) | - E | id
La grammaire G est ambiguë car la chaine id + id *id admet deux arbres de
dérivations qui sont :
7. Récursivité à gauche :

• Un symbole non terminal A d’une grammaire est dit récursif à gauche si A→*Aβ avec
β ∈ (X ∪V )∗ .
• Une grammaire comportant au moins un symbole non terminal récursif à gauche est
dite récursive gauche.
• La récursivité gauche pose divers problèmes en analyse syntaxique. C’est la raison
pour laquelle on cherche à éliminer cette récursivité, ce qui est toujours possible, car
on dispose d’un théorème : Tout langage algébrique peut être généré par une
grammaire algébrique non récursive gauche.

 Il existe deux types de récursivité à gauche : directe et indirecte :

On va procéder en deux temps : d’une part, on va éliminer la récursivité directe (ou


immédiate), puis éliminer la récursivité indirecte. On présente ici la méthode de
transformation en commençant par un cas simple, qu’on généralise avant
d’´eliminerfinalement les récursivités indirectes

Récursivité directe :
Cas simple : c’est qu’on a une règle de la forme suivante : A→ Aα / β
Comment la transformer en une règle équivalente mais pas récursive à gauche ?
A→ Aα / β devient
A→ β A’
A’→ α A’ /Ɛ

• La règle A → Aα permet de générer un nombre quelconque de chaîne(s) α, mais pour


que la dérivation soit effectivement productive, il est nécessaire que la récursion
s’arrête, c’est-`a-dire que A donne β.
• On charge alors une règle de commencer par ce β, et ensuite on a une règle récursive
(mais pas gauche), pour engendrer autant de fois que nécessaire les α.

Devient

La grammaire avant et après la transformation produisent des arbres


de dérivation différents mais génères le même langage.
Généralisation : Pour chaque non terminal r´ecursif, on propose :

Devient

Exemple:

Transformée

Transformée

Conservée

devient

Récursivité indirecte : Une grammaire est dite récursive à gauche, de façon indirecte, s’il
existe des règles de la forme suivante :

Exemple :
A → B 0/ 1
B→ A 2B/ 3
 Comment éliminer la récursivité indirecte ?
Deux étapes :
1) Faire apparaître la récursivité directe par substitution (remplacement).
2) Eliminer la récursivité directe comme vu précédemment.

Exemple :

A → B 0/ 1
B→ A 2B/ 3
La grammaire après substitution :
A→ A2B0
2B0 / 30/ 1 // En substituant B dans A
B→ A 2B/ 3
On aura une grammaire récursive à gauche directe, après transformation on obtient :
A→ 30 A’ / 1A’
A ′ → 2B0 A ′ / ε

B → A2B / 3

8. Factorisation à gauche:
La factorisation gauche est la réécriture d'une grammaire formelle pour éliminer des
productions commençant avec le même token.

Une grammaire G= T,N,S,Pn’est


T,N,S,P pas factorisée s’il existe dans P une règle de la
forme suivante :

 Comment factoriser ?
Exemple :

‫ →ܣ‬Abܾ
Ab / ܽAb‫ܣ‬
Ab / ܿ → AbA’
AbA’ / ܿ
devient
A’ →ܾ
ܾ/‫ܣ‬

En résumé :

9. Quelles sont les méthodes d’analyse syntaxiques ?


Ces méthodes ont pour objectif de répondre à la question suivante :Comment construire
un arbre de dérivation syntaxique étant donnée une chaine d’unités
lexicales et d’une grammaire décrivant la syntaxe du langage?

Les méthodes d’analyse syntaxiques peuvent être :


a. Descendantes ou ascendante
b. Déterministes ou non déterministes

Qu'est-ce que l'analyse descendante?


Chaque langage de programmation a un ensemble de règles pour représenter le langage.
L'analyseur de syntaxe ou l'analyse prend la chaîne d'entrée et vérifie si elle correspond aux
productions grammaticales. En d'autres termes, la grammaire devrait produire cette chaîne en
utilisant un arbre d'analyse.

Dans l'analyse top down, l'analyse se fait à partir du symbole de départ (l’axiome de la
grammaire) et atteindra la chaîne d'entrée donnée.
Exemple1 :

Considérez les règles de production L'arbre d'analyse de la chaine cad


de la grammaire suivante.

S
dérivation

c A d

a
Exemple2 :

Considérez les règles de production de la grammaire suivante.

L'arbre d'analyse de la chaine abde est construite en suivant les étapes suivantes :

S S S

a A B e a A B e a A B e

A b d

Etape 1 Etape 2 Etape 3


Pour construitre l’arbre de la chaine abde

Etape 1 : S ->aABe

Etape 2 : S ->abBe (en remplaçant A -> b)

Etape3 : S ->abde (en remplaçant B -> d)

Résultat : S ->abde

La substitution commence par la variable la plus à gauche en premier, puis vers la prochaine
position à droite, etc. Par conséquent, il suit une méthode de dérivation la plus à gauche. De
plus, il est important de décider quelle règle de production choisir quand il y a une variable.

Qu'est-ce que l'analyse ascendante?

L'analyse ascendante se fait dans l'autre sens de bas en haut. L'analyse se déroule de la chaîne
d'entrée au symbole de départ qui l’axiome de la grammaire. Considérez les règles de
production de la grammaire suivantes et laissez la chaîne d'entrée w ɛ cad

Considérez les règles de production de la L'arbre d'analyse de la chaine cadaprès


grammaire suivante : l’analyse ascendante est le suivant :

Réduction

c a d

La chaîne donnée est cad.

Le symbole a est généré par A. Les c, A et d se combinent pour obtenir S.


Exemple2 :

Considérez les règles de production de la grammaire suivante.

L'arbre d'analyse de la chaine abde est construite suivant l’analyse ascendante en


suivant les étapes suivantes :

A A B A B

a b d e a b d e a b d e

Etape 1 Etape 2 Etape 3

S ->aABe (en substituant S ->aABe)

B ->abBe (en remplaçant B -> d) La dérivation la plus à droite d’abord

S ->aABe (Substituer A -> b) Puis la derivation la plus à gauche

S ->abbcde

La substitution commence par la variable la plus à droite en premier, puis passe à la position
de gauche suivante et ainsi de suite. Par conséquent, il suit une méthode de dérivation mot
gauche pour obtenir le symbole de départ S.
Quelle est la différence entre l'analyse syntaxique descendante et ascendante?

Analyse descendante Analyse ascendante


L'analyse top-down est une stratégie L'analyse ascendante est une stratégie
d'analyse qui commence par examiner le d'analyse qui commence par examiner le
niveau le plus élevé de l'arbre d'analyse puis niveau le plus bas de l'arborescence d'analyse
par l'analyse en utilisant les règles d'une et la structure en utilisant les règles d'une
grammaire formelle. grammaire formelle. L’analyse se produit de
la chaîne d’entrée au symbole de départ, en
analysant de bas en haut.
la décision principale dans l’analyse la décision principale dans l’analyse
descendante consiste à sélectionner la règle descendante consiste à sélectionner le
de production à utiliser pour construire la moment où une règle de production doit être
chaîne utilisée pour réduire la chaîne afin d’obtenir
le symbole de départ
utilise la dérivation la plus à gauche utilise la dérivation la plus à droite

Les méthodes d’analyse descendantes et ascendantes peuvent être déterministes ou bien non
déterministes.

Qu'est-ce que l'analyse déterministes??

Un analyseur syntaxique est déterministe si une seule règle de production est applicable dans
chaque configuration de l'analyseur. Par extension, il ne peut alors y avoir qu'une seule
séquence de règles permettant d'analyser le texte dans sa totalité, et donc celui-ci ne peut être
syntaxiquement ambigu. Toutefois, il peut être fait usage de techniques telles que la pré-
vision pour déterminer quelle règle il faut appliquer à un point donné de l'analyse. Les
analyseurs LL et LR sont des exemples de méthodes d’analyse déterministes.

On ne peut cependant pas construire un analyseur déterministe pour n'importe quelle


grammaire non contextuelle et plus précisément les grammaires ambiguës. Dans ce cas, et si
l'on souhaite n'avoir qu'une seule analyse en sortie, on est contraint de lui adjoindre des
mécanismes supplémentaires, comme des règles de désambiguïsation.

Une méthode d’analyse descendante et déterministe est dite prédictive.

Qu'est-ce que l'analyse non déterministes??

Le choix de la règle susceptible de correspondre n’est pas connu à l’avance, il faut donc
explorer les différentes possibilités. Les analyseurs basés sur les méthodes prédictives
avec retour arrière et les méthodes descendantes parallèles sont des exemples de ce type
d’analyseurs.

 Dans la suite de ce cours nous allons nous intéresser aux méthodes suivantes :

Méthodesd’analysesyntaxiqu
es

Méthodesascendantes Méthodedescendantes

Méthodes déterministes Méthodes Méthodes non déterministes


déterministes
(LR(0), LR(1), SLR(1), (Descendante parallèle,
LALR(1), LR((k)) (LL(1), LL(k)) desendante avec retour arrière)

Vous aimerez peut-être aussi