• Aucun résultat trouvé

Langages de programmation et compilation

N/A
N/A
Protected

Academic year: 2022

Partager "Langages de programmation et compilation"

Copied!
4
0
0

Texte intégral

(1)

Ecole Normale Sup´erieure´

Langages de programmation et compilation

Jean-Christophe Filliˆatre

analyse syntaxique (2/2)

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 1

r´esum´e de l’´episode pr´ec´edent

• notion de grammaire

• d´erivation

• grammaire ambigu¨e

• null,first,follow

calcul de point fixe

• analyse ascendante

• une table nous permet de choisir entre lecture et r´eduction

• grammaires LR(0),SLR(1),LALR(1),LR(1)

• outils de typeyacc

E → E+E

| E*E

| (E )

| int

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 2

analyse descendante

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 3

id´ee g´en´erale

id´ee : proc´eder par expansions successives du non terminal le plus `a gauche (on construit donc une d´erivation gauche) en partant deSet en se servant d’unetableindiquant, pour un non terminalX `a expanser et lesk premiers caract`eres de l’entr´ee, l’expansionX→β`a effectuer (en anglais on parle detop-down parsing)

supposonsk= 1 par la suite et notonsT(X,c) cette table

en pratique on suppose qu’un symbole terminal # d´enote la fin de l’entr´ee, et la table indique donc ´egalement l’expansion deX lorsque l’on atteint la fin de l’entr´ee

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 4

fonctionnement de l’analyse

on utilise une pile qui est un mot de (N∪T)?; initialement la pile est r´eduite au symbole de d´epart

`a chaque instant, on examine le sommet de la pile et le premier caract`ere cde l’entr´ee

• si la pile est vide, on s’arrˆete ; il y a succ`es si et seulement sicest #

• si le sommet de la pile est un terminala, alorsadoit ˆetre ´egal `ac, on d´epileaet on consommec; sinon on ´echoue

• si le sommet de la pile est un non terminalX, alors on remplaceX par le motβ=T(X,c) en sommet de pile, le cas ´ech´eant, en empilant les caract`eres deβen partant du dernier ;

sinon, on ´echoue

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 5

exemple

prenons cette grammaire des expressions arithm´etiques et consid´erons la table d’expansion suivante

E → T E0 E0 → +T E0

| T → F T0 T0 → *F T0

| F → (E)

| int

+ * ( ) int #

E TE0 TE0

E0 +TE0

T FT0 FT0

T0 *FT0

F (E) int

(on verra plus loin comment construire cette table)

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 6

exemple

illustrons l’analyse descendante du mot int + int * int

+ * ( ) int #

E TE0 TE0

E0 +TE0

T FT0 FT0

T0 *FT0

F (E) int

pile entr´ee E int+int*int#

E0T int+int*int#

E0T0F int+int*int#

E0T0int int+int*int#

E0T0 +int*int#

E0 +int*int#

E0T+ +int*int#

E0T int*int#

E0T0F int*int#

E0T0int int*int#

E0T0 *int#

E0T0F* *int#

E0T0F int#

E0T0int int#

E0T0 #

E0 #

#

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 7

programmation d’un analyseur descendant

un analyseur descendant se programme tr`es facilement en introduisant une fonction pour chaque non terminal de la grammaire

chaque fonction examine l’entr´ee et, selon le cas, la consomme ou appelle r´ecursivement les fonctions correspondant `a d’autres non terminaux, selon la table d’expansion

(c’est ce que nous avons fait au d´ebut du cours)

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 8

(2)

programmation d’un analyseur descendant

faisons le choix d’une programmation purement applicative, pour changer, o`u l’entr´ee est une liste de lex`emes du type

type token = Tplus | Tmult | Tleft | Tright | Tint | Teof on va donc construire cinq fonctions quiconsommentla liste d’entr´ee

val e : token list -> token list val e’: token list -> token list val t : token list -> token list val t’: token list -> token list val f : token list -> token list

et la reconnaissance d’une entr´ee pourra alors se faire ainsi let recognize l =

e l = [Teof]

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 9

programmation d’un analyseur descendant

les fonctions proc`edent par filtrage sur l’entr´ee et suivent la table

+ * ( ) int #

E TE0 TE0

let rec e = function

| (Tleft | Tint) :: _ as m -> e’ (t m)

| _ -> error ()

+ * ( ) int #

E0 +TE0

and e’ = function

| Tplus :: m -> e’ (t m)

| (Tright | Teof) :: _ as m -> m

| _ -> error ()

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 10

programmation d’un analyseur descendant

+ * ( ) int #

T FT0 FT0

and t = function

| (Tleft | Tint) :: _ as m -> t’ (f m)

| _ -> error ()

+ * ( ) int #

T0 *FT0

and t’ = function

| (Tplus | Tright | Teof) :: _ as m -> m

| Tmult :: m -> t’ (f m)

| _ -> error ()

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 11

programmation d’un analyseur descendant

+ * ( ) int #

F (E) int

and f = function

| Tint :: m -> m

| Tleft :: m -> begin match e m with

| Tright :: m -> m

| _ -> error () end

| _ -> error ()

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 12

programmation d’un analyseur descendant

remarques

• la table d’expansion n’est pas explicite : elle est dans le code de chaque fonction

• la pile non plus n’est pas explicite : elle est r´ealis´ee par la pile d’appels

• on aurait pu les rendre explicites

• en pratique, il faut aussi construire l’arbre de syntaxe abstraite

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 13

construire la table d’expansion

reste une question d’importance : comment construire la table ?

l’id´ee est simple : pour d´ecider si on r´ealise l’expansionX→βlorsque le premier caract`ere de l’entr´ee estc, on va chercher `a d´eterminer sicfait partie despremierscaract`eres des mots reconnus parβ

une difficult´e se pose pour une production telle queX→, et il faut alors consid´erer aussi l’ensemble des caract`eres qui peuventsuivreX

on a justement vu la semaine derni`ere comment calculerfirstetfollow

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 14

construire la table d’expansion

`a l’aide des premiers et des suivants, on construit la table d’expansion T(X,a) de la mani`ere suivante

pour chaque productionX→β,

• on poseT(X,a) =βpour touta∈first(β)

• sinull(β), on pose aussiT(X,a) =βpour touta∈follow(X)

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 15

exemple

E → T E0 E0 → +T E0

| T → F T0 T0 → *F T0

| F → (E)

| int

first

E E0 T T0 F

{(,int} {+} {(,int} {*} {(,int} follow

E E0 T T0 F

{#,)} {#,)} {+,#,)} {+,#,)} {*,+,#,)}

+ * ( ) int #

E TE0 TE0

E0 +TE0

T FT0 FT0

T0 *FT0

F (E) int

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 16

(3)

grammaire LL(1)

D´efinition (grammaire LL(1))

Une grammaire est dite LL(1) si, dans la table pr´ec´edente, il y a au plus une production dans chaque case.

LL signifieLeft to right scanning,Leftmost derivation

exemple : la grammaire du transparent pr´ec´edent est LL(1)

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 17

contre-exemple

E → E+T

| T T → T*F

| F F → (E)

| int

first

E T F

{(,int} {(,int} {(,int}

+ * ( ) int #

E E+T/T E+T/T

T T*F/F T*F/F

F (E) int

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 18

de mani`ere g´en´erale

une grammairer´ecursive gauche,i.e.contenant des productions de la forme

X → Xα

| β ne sera jamais LL(1)

en effet, lesfirstseront les mˆemes pour ces deux productions (quel que soit le motβ)

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 19

solution

il faut supprimer la r´ecursion gauche, par exemple comme ceci X → βX0

X0 → αX0

|

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 20

de mˆeme

si une grammaire contient

X → aα

| aβ elle ne sera pas LL(1)

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 21

solution

il faut factoriser les productions qui commencent par le mˆeme terminal (factorisation gauche)

X → aX0 X0 → α

| β

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 22

exercice

la grammaire de LISP

S → E # E → sym

| (L)

L →

| E L est-elle LL(1) ?

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 23

hi´erarchies

grammaires

grammaires non contextuelles grammaires non ambigu¨es

LR(1)

LALR(1) SLR(1) LR(0)

LL(1)

langages

SLR(1) = LALR(1) = LR(1)

LR(0) LL(1)

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 24

(4)

conclusion

les analyseurs LL(1) sont relativement simples `a ´ecrire (cf TD de cette semaine)

mais ils n´ecessitent d’´ecrire des grammaires peu naturelles

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 25

la suite

• TD 6

• analyseur LL(1)

• prochain cours

• typage

Jean-Christophe Filliˆatre Langages de programmation et compilation analyse syntaxique (2/2) 26

Références

Documents relatifs

– concepts g´ en´ eraux : organisation g´ en´ erale d’un ordinateur, codage d’informations (caract` eres et nombres), langages de programmation (styles de

dans ce cours, nous allons effectivement nous int´eresser `a la compilation vers de l’assembleur, mais ce n’est qu’un aspect de la compilation un certain nombre de techniques mises

Jean-Christophe Filliˆ atre Langages de programmation et compilation expressions r´ eguli` eres

certains langages sont typ´ es dynamiquement : les types sont associ´es aux valeurs et utilis´es pendant l’ex´ ecution du programme. exemples : Lisp, PHP,

Jean-Christophe Filliˆ atre Langages de programmation et compilation typage 6... un langage peut utiliser ` a la fois des notions de typage statique et de

Jean-Christophe Filliˆ atre Langages de programmation et compilation allocation m´ emoire

Un programme est une suite d’instructions enregistrées dans la mémoire d'un ordinateur lui permettant d'exécuter des tâches données.. 2- Langages

HELMo Saint - Laurent Louis SWINNEN Mars 2008 COBOL Langage COBOL Langages et Compilation [email protected] Une introduction