View
4
Download
0
Category
Preview:
Citation preview
Concepts des langages de
programmationprogrammation
Analyse syntaxique
Dérivations
� Dérivation simple � Si x � w une règle d’une grammaire, en remplaçant x par w dans un mot on
obtient une dérivation.� Exemple
� Soient le mot E*(E), et la règle E� E+E alors :
� E*(E) � E*(E+E) est une dérivation
� Enchaînement de dérivations� Si u0 � u1 ... � un on écrit :
� u0 � un
� Langage engendré par des dérivations� On s'intéresse aux dérivations qui vont de S (axiome de départ) à des mots
de A*
� L = {u ∈A* | S � u}
� Exemple : E � nombre * ( nombre + nombre )
*
*
14
Arbre d’une règle
� On représente les règles sous forme d'arbres
E
E ���� ( E ) :
)( E
E ���� ( E ) :
15
Arbres de dérivation
E ���� E * E ���� E * ( E ) ���� E * ( E + E )
� En enchaînant plusieurs dérivations, on obtient un arbre de hauteur supérieure à 1
16
E
)(E
E
E
E*
+ E
Arbres de dérivation (suite)
E
E
E*
� On s'intéresse aux arbres dont la racine est l'axiome et dont toutes les feuilles sont des symboles terminaux
17
)( E
E
*
+
E
nombre
nombre nombre
� Langage engendré par une grammaire = phrasescomposées seulement de symboles terminaux dérivant de l’axiome
Arbres de dérivation (suite)
� Une phrase appartient à un langage s’il existe (au moins) un arbre de dérivation dont les feuilles représentent exactement la phrase en question
18
Exemple complet
� Grammaire pour les expressions arithmétiques simples
1. E � nombre
2. E � ( E )
3. E � E + E
4. E � E - E
5. E � E * E
E
E / E
( E ) nombre2
5. E � E * E
6. E � E / E
19
(2 + 5 – 1) / 2 nombre
E – E
E + E
nombrenombre2 5
1
� Remarques
� Les valeurs explicites sont des attributs des unités lexicales
� L’association de valeurs explicites aux unités lexicales est effectuée par l’analyseur lexical
Ambiguïté
E
E / E
E
E + E
7 + 5 / 2
� S’il existe au moins une phrase qui peut être générée par plusieurs arbres de dérivation => grammaire ambiguë
20
nombreE + E
nombrenombre7 5
2nombre E / E
nombrenombre5 2
7
Ambiguïté (suite)
� Un compilateur ne peut pas se baser sur une grammaire ambiguë � Suivant l’arbre utilisé, le résultat d'une même expression peut différer
� 7 + 5 / 2 :
(7 + 5) / 2 = 6
21
� (7 + 5) / 2 = 6
� 7 + (5 / 2) = 9,5
� Besoin de lever l’ambiguïté de la grammaire� Transformer la grammaire ambiguë en une grammaire non ambiguë
Ambiguïté (suite) : exemple
� Grammaire pour les expressions arithmétiques aubiguë
1. E � nombre
2. E � ( E )
3. E � E + E
4. E � E - E
5. E � E * E
6. E � E / E6. E � E / E
� Autre grammaire pour les expressions arithmétiques non aubiguë
1. E � nombre
2. E � ( E )
3. E � (E + E)
4. E � (E – E)
5. E � (E * E)
6. E � (E / E)
22
Ambiguïté (suite)
E
((7 + 5) / 2)
7 + 5 / 2
23
E
( E / E )
nombre( E + E )
nombrenombre7 5
2
Mise en oeuvre d’un analyseur syntaxique
� L’analyseur syntaxique � reçoit une suite d’unités lexicales de l’analyseur lexical
� doit dire si cette phrase (suite de mots) est syntaxiquement correcte
� essaie de construire l’arbre de dérivation associé� essaie de construire l’arbre de dérivation associé� Si l'arbre est construit : phrase syntaxiquement correcte
� Si non : phrase syntaxiquement incorrecte
� À partir de la grammaire d'un langage, on peut générer un algorithme qui permet de (tenter de) construire automatiquement des arbres de dérivation� Comment fonctionne un tel algorithme ?
24
� Deux approches pour construire l’arbre de dérivation
� Approche ascendante
Mise en oeuvre d’un analyseur syntaxique
(suite)
25
� Partir de la grammaire pour retrouver la phrase en question � De la racine aux feuilles
� Approche descendante
� Partir de la phrase et remonter pour arriver aux règles de la grammaire� Des feuilles à la racine
Plan
� Rôle de l’analyse syntaxique
� Grammaires
� Analyse descendante
� Analyse ascendante
� Résumé
26
Analyse descendante
� Objectif � En commençant du symbole de départ (axiome), retrouver la suite de règles nécessaires pour la construction de l’arbre de dérivation
� Principe de fonctionnement � Partir de l’axiome
� À chaque pas : remplacer un non terminal A par une expression α si
A �α est une règle dans la grammaire du langage
� Arrêter lorsqu’on a plus de non terminal
27
Analyse descendante (suite)
� Les non terminaux nous permettent de décider quelle dérivation appliquer
Exemple :� Exemple :� On a trois règles, et pour choisir quelle règle appliquer, on regarde le terminal courant dans la phrase
� aab� A� aA �aaA�aabA�aabε = aab
A � aA | bA | ε
28
Analyse descendante (suite)
� Exemple
� On démarre de S et on veut retrouver le mot w
29
� La lecture de la première lettre du mot w (a) nous permet de choisir la règle S� aSbT
Analyse descendante (suite)
� Exemple
� La lecture de la deuxième lettre (c) nous indique de choisir la règle
30
� La lecture de la deuxième lettre (c) nous indique de choisir la règle S� cT
Analyse descendante (suite)
� Exemple
� La lecture de la troisème lettre (c) nous indique de choisir la règle T�
31
� La lecture de la troisème lettre (c) nous indique de choisir la règle T�c
w=accbbadbc
Analyse descendante (suite)
� Exemple
� La lecture de la quatrième lettre (b) n’exige pas l’application d’une
32
� La lecture de la quatrième lettre (b) n’exige pas l’application d’une dérivation (elle est déjà présente dans l’arbre)
� On avance
w=accbbadbc
Analyse descendante (suite)
� Exemple
� La lecture de la cinquième lettre (b) nous indique de choisir la règle
33
� La lecture de la cinquième lettre (b) nous indique de choisir la règle T� bS
w=accbbadbc
Analyse descendante (suite)
� Exemple
� La lecture de la sixième lettre (a) nous indique de choisir la règle
34
� La lecture de la sixième lettre (a) nous indique de choisir la règle S� aSbT
w=accbbadbc
Analyse descendante (suite)
� Exemple
� La lecture de la septième lettre (d) nous indique de choisir la règle S� d
35
w=accbbadbc
Analyse descendante (suite)
� Exemple
� La lecture de la huitième lettre (b) n’exige pas l’application d’une règle particulière
36
w=accbbadbc
Analyse descendante (suite)
� Exemple
� La lecture de la dernière lettre (c) nous indique d’appliquer la règle T� c
37
w=accbbadbc
Analyse descendante (suite)
� Exemple
� Un arbre de dérivation a été retrouvé => Le mot w=accbbadbc appartient au langage décrit par la grammaire
38
w=accbbadbc
Déterminer si un mot est accepté par une grammaire
� S’il existe un arbre de dérivation de l’axiome de départ au mot, alors le mot est accepté de départ au mot, alors le mot est accepté (mot fait partie du langage => instruction bien formée)
39
Plan
� Rôle de l’analyse syntaxique
� Grammaires
� Analyse descendante
� Analyse ascendante
� Résumé
40
Analyse ascendante
� Objectif � Construire l’arbre de dérivation en démarrant des unités lexicales (bas) jusqu’à
arriver à la racine (axiome de départ)
� Exemple 1S � A B | S A B.
A � a | a a b. m=abbaab
41
a b b a a b
A B A B
S
S
a b b a a b
A B A B
S
a b b a a b
A B A
S
a b b a a b
A B
S
a b b a a b
A B
A � a | a a b.
B � b | b b a.
a b b a a b
A
m=abbaab
Plan
� Rôle de l’analyse syntaxique
� Grammaires
� Analyse descendante
� Analyse ascendante
� Résumé
42
Résumé
� Les grammaires sont un outil plus puissant que les expressions régulières pour vérifier la syntaxe des phrases d’un langage
� L'arbre de dérivation permet de vérifier si une phrase est syntaxiquement correctesyntaxiquement correcte
� Deux approche de dérivation � Approche descendante
� Descendre de l'axiome au programme source
� Approche ascendante� Remonter du programme source à l'axiome
43
Un langage maison
� Programme écrit en langage :� Debut
� Entier chiffre1 = 10, chiffre2 = 45.
� Entier resultat.
� Réel Fonction:Somme( paramètres : Entier:i , Entier: j) commencer
retourner: i plus j.retourner: i plus j.
� Fin
� ProgPrincipal
resultat = Somme(chiffre1, chiffre2).
Afficher(resultat).
� FinProgPrincipal
� Fin
44
Un langage maison (suite)
� Debut� Entier chiffre1 = 10, chiffre2 = 45.
� Entier resultat.
� Réel Fonction:Somme( paramètres : Entier:i , Entier: j) commencer
retourner: i plus j.retourner: i plus j.
� Fin
� ProgPrincipal
resultat = Somme(chiffre1, chiffre2).
Afficher(resultat).
� FinProgPrincipal
� Fin
45
PROGRAMME
Un langage maison (suite)
� Debut� Entier chiffre1 = 10, chiffre2 = 45.
� Entier resultat.
� Réel Fonction:Somme( paramètres : Entier:i , Entier: j) commencer
retourner: i plus j.
PROGRAMME
DECLARATION
retourner: i plus j.
� Fin
� ProgPrincipal
resultat = Somme(chiffre1, chiffre2).
Afficher(resultat).
� FinProgPrincipal
� Fin
46
Un langage maison (suite)
� Debut� Entier chiffre1 = 10, chiffre2 = 45.
� Entier resultat.
� Réel Fonction:Somme( paramètres : Entier:i , Entier: j) commencer
retourner: i plus j.
PROGRAMME
DECLARATIONS
retourner: i plus j.
� Fin
� ProgPrincipal
resultat = Somme(chiffre1, chiffre2).
Afficher(resultat).
� FinProgPrincipal
� Fin
47
PROGRAMME_PRINCIPAL
Un langage maison (suite)
� Debut� Entier chiffre1 = 10, chiffre2 = 45.
� Entier resultat.
� Réel Fonction:Somme( paramètres : Entier: i , Entier: j) commencer
retourner: i plus j.
PROGRAMME
DECLARATIONS
retourner: i plus j.
� Fin
� ProgPrincipal
resultat = Somme(chiffre1, chiffre2).
Afficher(resultat).
� FinProgPrincipal
� Fin
48
PROGRAMME_PRINCIPAL INSTRUCTIONS
Un langage maison (suite)
� Grammaire : � PROGRAMME � Debut DECLARATIONS PROGRAMME_PRINCIPAL Fin
� DECLARATIONS � DECLARATIONS_VARIABLES
| DECLARATIONS_CONSTANTES
| DECLARATIONS_METHODES
� PROGRAMME_PRINCIPAL� ProgPrincipal INSTRUCTIONS FinProgPrincipal
� DECLARATIONS_VARIABLES�TYPE nom_variable. � DECLARATIONS_VARIABLES�TYPE nom_variable.
| TYPE nom_variable =VALEUR.
� DECLARATIONS_CONSTANTES� nom_constante =VALEUR.
� TYPE � Entier | Réel | Chaîne | …
� VALEUR � nombre | chaîne_de_caractères | …
� DECLARATIONS_METHODES�TYPE nom_fonction (paramètres : PARAMETRES) commencer INSTRUCTIONS Fin
� PARAMETRES � PARAMETRE
� PARAMETRE �TYPE: nom_variable | PARAMETRES ,
� INSTRUCTIONS � … 49
Un langage maison (suite)
� Utilisation des expressions régulières pour définir les nombres, les chaînes de caractères et les noms des fonctions :
� nombre : [0-9]+(\. [0-9]+)? � nombre : [0-9]+(\. [0-9]+)?
� chaîne_de_caractères : \"[a-zA-Z]*\"
� Noms de fonctions : Fonction:[A-Z][a-zA-Z]*
50
Recommended