analyse syntaxique 0.1 - dift2035/e2009/cours/analyse_syntaxiq… · title: microsoft powerpoint -...

38
Concepts des langages de programmation Analyse syntaxique

Upload: others

Post on 09-Feb-2021

4 views

Category:

Documents


0 download

TRANSCRIPT

  • 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