compilation et th orie des langages n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Compilation et théorie des langages PowerPoint Presentation
Download Presentation
Compilation et théorie des langages

Loading in 2 Seconds...

play fullscreen
1 / 194

Compilation et théorie des langages - PowerPoint PPT Presentation


  • 367 Views
  • Uploaded on

Compilation et théorie des langages. Kaouther Nouira Ferchichi 2007. Chapitre 1. Introduction à la compilation. Quelques définitions. Un traducteur est un programme qui transforme chaque mot d’un langage L1 sur un alphabet A1 en un mot d’un langage L2 sur un alphabet A2.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Compilation et théorie des langages' - sanjiv


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
compilation et th orie des langages

Compilation et théorie des langages

KaoutherNouiraFerchichi

2007

chapitre 1
Chapitre 1

Introduction à la compilation

quelques d finitions
Quelques définitions
  • Un traducteur est un programme qui transforme chaque mot d’un langage L1 sur un alphabet A1 en un mot d’un langage L2 sur un alphabet A2.
  • Un compilateur est un cas particulier de traducteur qui prend en entrée un mot représentant un programme c’est-à-dire la description d’un calcul et qui est chargé de produire le résultat de ce calcul. En pratique, il s’agira de traduire un texte représentant le calcul vers une suite d’instructions exécutables par la machine.
exemples
Exemples
  • D’un langage de haut niveau (Pascal, C++, ML, …) vers un langage d’assembleur.
  • Du langage d’assembleur vers du code binaire.
  • D’un langage de haut niveau vers les instructions d’une machine virtuelle (JVM).
slide5

L1

L2

Ln

L1

L2

Ln

Langage Universel

M1

M1

M2

Mp

M2

Mp

La compilation de n langages pour p

architectures nécessite à priori la

réalisation de n×p compilateurs.

En utilisant un langage universel

intermédiaire on réduit le problème

de construction de n×p compilateurs.

rep res par rapport au langage naturel
Repères par rapport au langage naturel
  • Un langage est un ensemble de phrases, unités linguistiques formées selon des règles précises à l'aide d'un alphabet.
  • Un alphabet est un ensemble des signes élémentaires, par exemple les caractères d'un langage écrit, les phénomènes d'un langage oral, les notes de musique d'une partition…
la lexicographie d un langage
La lexicographie d’un langage
  • L’assemblage linéaire d’unités lexicales ou lexèmes (vocabulaire) formé à partir de l’alphabet du langage.
syntaxe d un langage
Syntaxe d’un langage
  • La syntaxe d'un langage est l'ensemble des règles qui fixent l'organisation des lexèmes au sein d'une phrase.
la s mantique d un langage
La sémantique d'un langage
  • fixe les rapports entre les phrases et le monde réel, de manière à ce que chaque phrase bien formée syntaxiquement ait une signification précise.
  • Une phrase bien formée syntaxiquement peut ne pas avoir de signification.
un compilateur
Un compilateur
  • un compilateur lit un programme source dans un langage source et produit un programme cible qui est le résultat la traduction du programme source dans un autre langage, le langage cible.
  • Le compilateur produit éventuellement des messages d'erreurs.
entr es et sorties d un compilateur

Compilateur

Programme cible

Programme source

Messages

Entrées et sorties d'un compilateur
compilateur

Compilateur

Programme cible

Programme source

Compilateur

Analyse

Synthèse

Messages

figure 1.2 Les deux parties d’un compilateur

partie analyse
Partie Analyse

Partie Synthèse

  • Analyse lexicale
  • Analyse syntaxique
  • Analyse Sémantique
  • Génération du code
  • Optimisation du code
slide14

Source

A. lexicale

E

r

r

e

u

r

s

S

y

m

b

o

l

e

s

A. syntaxique

A. sémantique

G. code

O. de code

Cible

analyse lexicale
Analyse lexicale

£e chat µange la souris.

Erreurs

analyse lexicale1
Analyse lexicale
  • Consiste à récupérer les mots, que l’on appelle « lexèmes » ou « tokens », à partir d’une suite de caractères. Par exemple déterminer, à partir de l’énoncé suivant :

for i : = 1 to vmax do a := a + i;

  • on peut dégager la suite de tokens suivante :

for  : mot clé

i  : identificateur

:=  : affectation

1 : entier

to : mot clé

vmax : identificateur

do : mot clé

a : identificateur

:= : affectation

a : identificateur

+ : opérateur arithmétique

i : identificateur

; : séparateur

slide18

Ensuite, l’énoncé précédent peut s’exprimer ainsi :

  • 10, 1000, 100, 5001, 11, 1002, 12, 1001, 100, 1001, 101, 1000, 13
  • for i := 1 to vmax do a := a + i ;
  • c'est-à-dire comme une suite de référence à la table des symboles.
analyse syntaxique
Analyse syntaxique

Souris la chat le mange.

Erreurs

analyse syntaxique1
Analyse syntaxique
  • Lors de l’analyse syntaxique, on vérifie que l’ordre des tokens correspond à l’ordre définit pour le langage.
  • On dit que l’on vérifie la syntaxe du langage à partir de la définition de sa grammaire. Cette phase produit une représentation sous forme d’arbre de la suite des tokens obtenus lors de la phase précédente.
l arbre syntaxique obtenu apr s analyse syntaxique
L’arbre syntaxique obtenu après analyse syntaxique

Identificateur

Identificateur

Identificateur

Identificateur

analyse s mantique
Analyse sémantique

Le chas mange la souris.

Erreurs

analyse s mantique1
Analyse sémantique
  • Dans cette phase on vérifie que les variables ont un type correct.
  • Par exemple, il faut vérifier que la variable ‘i’ possède bien le type ‘entier’, et que la variable ‘a’ est bien un nombre.
  • Cette opération s’effectue en parcourant l’arbre syntaxique et en vérifiant à chaque niveau que les opérations sont correctes.
g n ration de code
Génération de code

On génère le code pour du langage machine ou un langage d’assemblage. Voici un exemple de code généré pour une (pseudo) machine.

var_a ;les étiquettes des variables

var_i

var_vmax

... ; le code du programme

movvar_i,1

loop:

mov A0, (var_i) ; comparaisoni >= vmax

jge A0, (var_vmax), finFor ; si vrai aller en finFor

mov A0, (var_a) ; calcul de a+i

add A0, A0, (var_i)

mov var_a,A0 ; a := a+i

mov A0, (var_i) ; on incrémentei

add A0, A0, 1

movvar_i, Ao

jmploop ; et on continue la boucle

finFor:

...

chapitre 2
Chapitre 2

Langage et grammaire

les langages r guliers
Les langages réguliers
  • Dans le cadre d'une classe particulière de langages, les langages réguliers, nous montrons comment décrire la syntaxe dans un formalisme adapté.
le m ta langage des expressions r guli res
Le méta-langage des expressions régulières

nous définissons par récurrence l'ensemble des expressions régulières permettant de définir la syntaxe d'un langage défini sur un alphabet donné :

  • expressions de base :

(1) si a est un symbole de l'alphabet alors a est une expression régulière.

(2) en peut utiliser le symbole  pour décrire la chaîne vide.

slide28

juxtaposition :

(3) si e1et e2sont des expressions régulières alors e1e2est une expression régulière.

  • alternative :

(4) si e1et e2sont des expressions régulières alors e1 | e2 est une expression régulière.

  • répétition :
  • (5) si eest une expression régulière alors e* est une expression régulière.
slide29

On peut noter quelques propriétés algébriques du langage des expressions régulières (e, e1, e2, e3 désignaient des expressions régulières) :

  • e = e = e
  • e | e = e
  • e1 | e2 = e2 | e1
  • e1 ( e2 | e3 ) = e1 e2 | e1 e3

et ( e1 | e2 ) e3 = e1 e3 | e2 e3

algorithme de reconnaissance syntaxique
Algorithme de reconnaissance syntaxique
  • le problème est d'écrire un algorithme qui pour un langage réguliers donné détermine si une séquence de symboles, pris dans l'alphabet du langage, est valide syntaxiquement.
  • Nous pouvons donc décrire l'algorithme par un automate, appelé automate reconnaisseur.
exemple e2 1
Exemple E2.1
  • on considère un langage construit sur l'alphabet {a,b,c} est dont la syntaxe est décrite par l'expression régulière (ab|c)*. Les chaînes ababcabcc, ab, c sont des exemples de chaînes correctes syntaxiquement. on veut écrire un algorithme qui détermine si une phrase formée sur {a,b,c} vérifie la syntaxe du langage.
algorithme
Algorithme

Etat : un entier sur [1..3]

EtatInitial : l'entier 1

Algorithme

Démarrer

Etat EtatInitial

Lire (EC)

Tant que EC != " "

Selon Etat :

Etat = 1 : selon EC

EC = "a" : Etat  2 {attente d'un b}

EC = "b": Etat 3 {erreur}

EC="c" : {on reste dans l'état 1}

FinSelon

Etat = 2 : si EC = "b" alors Etat  1

sinon Etat 3

Etat = 3 : {quelque soit EC, on reste dans l'état 3}

FinSelon

Lire (EC)

FinTanque

Ecrire(si Etat = 1 alors "chaine correcte" sinon "chaine incorrecte")

slide33

EC = "b"

EC = "a"

sinon

EC = "c"

1

2

3

EC = "b"

vrai

Représentation par un automate de l'algorithme de parcours itératif pour la reconnaissance de l'expression régulière (a b | c)*
langage et grammaire
Langage et grammaire
  • La notion de grammaire est à la base de l'étude formelle des propriétés syntaxiques d'un langage.
  • Ceci constitue un fondement autant pour la conception d'un langage que pour l'écriture d'un programme de traduction.
slide35

Nous abordons la notion de grammaire au travers d'exemple simple, tout en présentant divers méta-langages associés : notation BNF (BackusNaurForm) et EBNF (ExtendedBackusNaurForm) et diagrammes syntaxiques.

  • Les grammaires servent notamment de base à la construction systématique (et à la génération automatique) de programmes d'analyse syntaxique.
notion de grammaire
Notion de grammaire

Exemple E2.1 Palindromes

  • On considère l'ensemble des séquences palindromes dont les éléments sont soit le caractère "a", soit le caractère "b".
  • Un palindrome est une séquence égale à son inverse.
  • Par exemple, les séquences "aabbaa", "a", "baaabaaab" sont des palindromes sur {a, b} et les séquences "abbb", "aabbb", "aca" n'en sont pas.
slide37

la séquence vide est un palindrome,

  • une séquence réduite à des caractères "a" ou "b" est un palindrome,
  • si la séquence S est un palindrome alors les séquences "a" S "a" et "b" S "b" sont des palindromes.

enfin on peut s'intéresser à la description du langage Pal dont les phrases sont les palindromes formés sur l'alphabet donné {"a", "b"}. Ici, la lexicographie du langage se réduit à l'alphabet. La syntaxe est décrite en énumérant les règles suivantes :

  • <p> ::= " vide "
  • <p> ::= " a "
  • <p> ::= " b "
  • <p> ::= " a " <p> " a "
  • <p> ::= " b " <p> " b "
slide38

la description donnée ci-dessus utilise la notation BNF.

  • Les symboles en minuscules sont appelés les symboles terminaux : il représente les signes élémentaires que l'on trouve dans une phrase du langage.
  • le symbole <p> est appelé symbole non terminal. Il caractérise ici une phrase du langage.
  • Le symbole videreprésente la chaîne vide.
slide39

<p> ::= " vide "

  • <p> ::= " a "
  • <p> ::= " b "
  • <p> ::= " a " <p> " a "
  • <p> ::= " b " <p> " b "
  • Les règles de la grammaire se lisent de la façon suivante:
  • un palindrome <p> est soit vide (1),
  • soit le symbole a (2),
  • soit le symbole b (3),
  • soit le symbole a suivi d'un palindrome suivi d'un symbole a (4),
  • soit le symbole b suivi d'un palindrome suivi d'un symbole b (5).
  • On retrouve donc la juxtaposition (règles 4 et 5), la récursion (règles 4 et 5) et l'alternative (les règles donnent cinq formes possibles de palindromes).
exemple e2 2 identificateur
Exemple E2.2 Identificateur
  • Un identificateur est une séquence de lettres ou de chiffres commençant par une lettre.
  • Un chiffre est "0", "1", "2", "3", "4", "5", "6", "7", "8" ou "9",
  • une lettre est "a" ou "b" ou "c", …
slide41

Une séquence de caractères alphanumériques est représentée par le symbole <salphanum>,

  • Un caractère alphanumérique est représenté par le symbole <calphanum>,
  • Une lettre ou un chiffre sont respectivement représentés par les symboles <lettre> ou <chiffre>.
slide42

<idf> ::= <lettre> | <lettre> <salphanum>

  • <salphanum> ::= <calphanum> | <calphanum> <salphanum>
  • <calphanum> ::= <lettre> | <chiffre>
  • <lettre> ::= " a "|" b "|…|" z "
  • <chiffre> ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
d finition notation bnf
Définition, notation BNF
  • Une grammaire est composée de quatre éléments nommés Vt, Vnt, A, RP.

G = {Vt, Vnt, A, RP }

  • Vt est l'ensemble des symboles terminaux.
  • Vnt est l'ensemble des symboles non terminaux.
  • A est l'axiome. l'axiome est le symbole non terminal désignant l'unité syntaxique qui caractérise le langage tout entier.
  • RP est l'ensemble des règles dites de production.
slide44

Dans l'exemple E2.2 :

  • Vt = {a, b, …, z, 0, 1, …,9}
  • Vnt = { <idf>, <salphanum>, <calphanum>, <lettre>, <chiffre>}
  • A = <idf>
  • RP =
  • <idf> ::= <lettre> | <lettre> <salphanum>
  • <salphanum> ::= <calphanum> | <calphanum> <salphanum>
  • <calphanum> ::= <lettre> | <chiffre>
  • <lettre> ::= "a" | "b" | "c" | … |"z"
  • <chiffre> ::= "0" | "1" | "2"| "3" | "4" | "5" | "6" | "7" | "8" |"9"
exemple e2 3 blocs en pascal
Exemple E2.3 Blocs en Pascal
  • Vt = {begin, end, ;, :=, if, then, else}
  • Vnt = { <bloc>, <list-inst>, <inst>, <expression>, <idf>, <cst-ent>}
  • A = <bloc>
  • RP =
  • <bloc> ::= “begin” <list-inst> “end”
  • <list-inst> ::= <inst>| <inst>”; “ <list-inst>
  • <inst> ::= <idf > “:=“ <expression> |
  • “if” <expression> “then” <inst>|
  • “if” <expression> “then” <inst> “else” <inst>
  • <expression> ::= <cst-ent> | <idf>
remarque
Remarque
  • en fixant des conventions d'écriture des symboles et en convenant que la première règle définit l'axiome, on peut ne donner que l'ensemble des règles de la grammaire.
  • Vt, Vnt et A s'en déduisant implicitement.
exemple e2 4 phrase en fran ais
Exemple E2.4 Phrase en français
  • <phrase> ::= <gpe-sujet> <gpe-verbal> <gpe-complement>
  • <gpe-sujet> ::= <gpe-nominal>
  • <gpe-complement> ::= <gpe-nominal>
  • <gpe-verbal> ::= <verbe>
  • <gpe-nominal> ::= <article> <nom-commun> | <nom-propre>
remarques
Remarques
  • De manière générale, la lexicographie est la partie de la syntaxe qui fixe les règles d'assemblage linéaire des signes de l'alphabet en lexèmes, comme par exemple les mots dans une langue naturelle.
slide49

Erreurs.

Lexèmes

Source

Arbres

Anal. Lex

Anal. Synt.

requête

Identificateurs

Table

Symbôles.

Grammaire

(Syntaxe)

slide50
EBNF
  • Dans la notation EBNF (BNF étendue), on complète le méta-langage par des symboles exprimant des itérations et des options:
  • [] signifie que la chaîne  est optionnelle (dans la phrase décrite elle apparaît 0 ou 1 fois)
  • {} signifie que la chaîne  apparaît 0,1, ou plusieurs fois.
slide51

Le langage de séquences éventuellement vides de "a" peut être décrit par les grammaires :

  • en notation BNF

<qa> ::= " vide " | " a " <qa>

  • en notation EBNF

<qa> ::= {" a "}

slide52

le langage des séquences non vides de "a" peut être décrit par la grammaire :

  • en notation BNF

<qa’> ::= " a " | " a " <qa’>

  • en notation EBNF

<qa’> ::= " a " {" a "}

  • remarque :

<qa’> ::= " a " <qa>

slide53

par exemple, une grammaire pour décrire la syntaxe d'un bloc d'instructions, éventuellement vide, peut-être :

  • en BNF

<bloc> ::= “begin” <list-inst-opt> “end”

<list-inst-opt> ::= “vide”| <list-inst>

<list-inst> ::= <inst>| <inst> “;” <list-inst>

  • En EBNF

<bloc> ::= “begin” [<inst> {“;” <inst>}]”end”

diagramme syntaxique

qa:

a

(a)

Diagrammesyntaxique
  • une autre notation très utilisée et celle des diagrammes syntaxiques.
  • Il s'agit d'une description graphique : les symboles terminaux sont représentés dans des cadres arrondis, les symboles non terminaux dans des rectangles, les liens entre les sous phrases sont représentés par des flèches qui indiquent le sens de lecture des diagrammes.
slide55

begin

fin

bloc :

inst

;

(d)

qa':

a

a

a

(b)

(c)

d rivation arbre de d rivation
Dérivation, arbre de dérivation

Dérivation d’une phrase

  • Une dérivation d’une phrase à partir d’une grammaire est une suite de ré-ecritures qui, à partir de l’axiome, conduisent à la phrase.
  • De façon générale, une phrase donnée peut être dérivée de plusieurs manières à partir d’une grammaire.
exemple e2 5
Exemple E2.5
  • Soit la grammaire composée de l’expression régulière suivante :
  • L ::= aL|aQB
  • QB ::= b | bQB
  • Vérifions que aabbb est une phrase correcte par rapport à la grammaire
  • Le symbole exprime une ré-ecriture
  • L aL aaQB aabQB aabbQB aabbb
arbre de d rivation
Arbre de dérivation

L ::= aL|aQB

QB ::= b | bQB

L

aabbb

a

L

QB

a

QB

b

QB

b

b

principe de construction d un arbre de d rivation
Principe de construction d’un arbre de dérivation
  • Pour toute règle de la forme :
  • X ::= X1 X2 X3 … X Xn

X

X1

X2

X3

Xn

slide60

Pour toute règle de la forme :

  • X ::= X1 | X2 | X3 |…| Xn

X

X

X

X

Xn

X1

X2

X3

ambigu t d une grammaire
Ambiguïté d’une grammaire
  • Une grammaire est ambiguë si pour au moins une phrase du langage il existe au moins deux arbres de dérivation.
exemple e2 6 au moins un b
Exemple E2.6 au moins un ”b”
  • Soit le langage des phrases formées de caractères ”a” et ”b” contenant au moins un ”b”.
  • La syntaxe de celangagepeutêtredécrite par la grammairesuivante :
  • P ::= S b S
  • S ::= vide | S a|S b
  • Pour la phrase abb, on peut par exempleconstruire les deuxarbres de dérivation :
slide63

P ::= S b S

S ::= vide | S a|S b

abb

P

P

b

b

S

S

S

S

vide

a

b

b

S

S

S

vide

S

S

a

vide

vide

exemple e2 7 addition
Exemple E2.7 Addition
  • Soit un sous-ensemble du langage des expressions arithmétiques dans lequel on peut exprimer que des sommes portant sur des chiffres.
  • La grammaire suivante est ambiguë:
  • S ::= S+S|C
  • C ::= 0|1|2|3|4|5|6|7|8|9
deux arbres de d rivation
Deux arbres de dérivation

S ::= S+S|C

C ::= 0|1|2|3|4|5|6|7|8|9

1 + 2 + 3

S

S

+

+

S

S

S

S

+

+

C

C

S

S

S

S

C

3

1

C

C

C

1

2

2

3

slide66

En revanche la grammaire suivante, alternative pour décrire la syntaxe n’est pas ambiguë

  • S ::= S + C|C
  • C ::= 0|1|2|3|4|5|6|7|8|9

S

+

C

S

+

3

S

S

C

C

1

2

chapitre 3
Chapitre 3

L’analyse lexicale

les bases th oriques
Les bases théoriques
  • L’analyse lexicale set à reconnaître les symboles utilisés « 123, begin, x, … » à les classer (entier, mot-clés, identificateur, commentaire, …) en leur associant une étiquette avant de les transmettre à l’analyseur syntaxique. Et en leur trouvant une représentation machine efficace par l’intermédiaire de la table des symboles.
  • Cette phase doit se faire rapidement on se contentera donc de reconnaître des expressions régulières qui peuvent être identifiées par des automates à états finis.
qu est ce qu un langage r gulier
Qu’est ce qu’un langage régulier?
  • L’ensemble des langages réguliers sur un alphabet A est défini de manière inductive (plus petit ensemble vérifiant les propriétés):
    • , {}, {a}, a  A, sont des langages réguliers,
    • Si L1 et L2 sont des langages réguliers alors il en est de même pour L1  L2 {1 |2 / 1  L1, 2  L2},
    • Si L1 et L2 sont des langages réguliers alors il en est de même pour L1L2 {1 2 / 1  L1, 2  L2},
    • Si L est un langage régulier alors il en est de même pour L* nn{1 2… n | i L}
slide70

L’ensemble des expressions régulières sur un alphabet A est défini de manière inductive par:

    • ,  et a pour a  A sont des expressions régulières.
    • Si r1 et r2 sont des expressions régulières alors il en est de même pour (r1|r2), r1r2.
    • Si r est une expression régulière alors il en est de même pour (r)*.
slide71

Chaque expression régulière r détermine un langage régulier L(r).

      • L() = 
      • L() = {}
      • L(a) = {a}
      • L((r1|r2)) = L(r1) L(r2)
      • L(r1r2) = L(r1)L(r2)
      • L((r)*) = L(r)*
automates tats finis1
Automates à états finis
  • Un reconnaisseur pour un langage est un programme qui prend en entrée une chaîne x et répond "oui" si x est une chaîne du langage et "non" autrement.
  • On compile une expression régulière en un reconnaisseur en construisant un diagramme de transition généralisé appelé automate fini.
  • Un automate fini peut être déterministe ou non déterministe.
qu est ce qu un automate
Qu’est-ce qu’un automate?

Un automate fini non déterministe (AFN) est un modèle mathématique qui consiste :

  • un alphabet A,
  • un ensemble Q d’états dans lequel on distingue un état initial q0,
  • une relation de transition  qui est un sous ensemble de :

Q  A {}  Q,

  • Un sous ensemble d'états F distingué comme états d'acceptation ou états finals.
  • Si {p, , q}  , on écrira p q où   A  {} c. à d. il est soit le mot vide soit une lettre.
repr sentation des automates
Représentation des automates
  • Un automate est souvent représenté par un graphe orienté dont les sommets sont des états et les arêtesétiquetées correspondent aux transitions.
automate fini non d terministe
Automate Fini Non Déterministe

q1

q2

2

1

q0

États d'acceptation

États d'acceptation

3

q4

q3

4

État Initial

exemple1
Exemple1
  • Soit le langage dénoté par l’expression régulière

(a | b)* abb

  • Nous allons représenter l'AFN qui reconnaît ce langage.
exemple 1
Exemple 1

(a | b)* abb

automate fini non d terministe1
Automate Fini Non Déterministe
  • Un AFN accepte une chaîne d’entrée x

si et seulement si

  • il existe un certain chemin dans l'AFN entre l’état de départ et un état d’acceptation,
  • tel que les étiquettes d’arcs le long de ce chemin épellent la chaine x.
automate fini non d terministe2
Automate Fini Non Déterministe

Vérifions que les chaines d'entrées suivantes sont acceptées par l'AFN.

babb

aaabb

abb

aabb

automate fini non d terministe3
Automate Fini Non Déterministe
  • Un chemin peut être représenté par une suite de transitions d’état appelée déplacements. Ce diagramme montre les déplacement réalisées en acceptant la chaîne d’entrée aabb.
automate fini non d terministe4
Automate Fini Non Déterministe
  • En général, il existe plus d’une suite de déplacements pouvant mener à l’état d’acceptation.
  • Bien d’autres suites de déplacements pourrait être faites sur la chaîne d’entrée aabb, mais aucune des autres n’arrive à terminer dans un état d’acceptation.
  • Cette suite stationne dans l’état de non acceptation 0.
exercice
Exercice
  • Construire l'automate pour l'expression a(a|0)*
  • Vérifier que les mots aaoooaooaaaaaoaoao sont vérifiée par l'AFN
  • Donner le chemin de déplacement de chacun de ces mots.
automate fini d terministe
Automate Fini Déterministe
  • L’automate est dit déterministe (AFD) lorsque la relation de transition est une fonction (partielle) de

Q  A dans Q.

  • À chaque état et pour chaque caractère d’entrée, il yaau plus un état vers lequel une relation peut avoir lieu.
automate fini d terministe1
Automate Fini Déterministe
  • Un automate fini déterministe a au plus une transition à partir de chaque état sur n’importe quel symbole.
  • Il est très facile de déterminer si un automate fini déterministe accepte une chaîne d’entrée, puisqu’il existe au plus un chemin depuis l’état de départ étiqueté par cette chaîne.
exemple
Exemple

La figure suivante présente le graphe de transition d’un automate fini déterministe qui accepte la langage (a|b)* abb

Nous vérifions que chacune des chaines ne passe que par un seul chemin

b

babb

aaabb

abb

ababb

aabb

slide87

Il y a conflit temps/ place :

  • Les automates finis déterministes produisent des connaisseurs plus rapides que les automates finis non déterministes.
  • Un automate fini déterministe peut être beaucoup plus volumineux qu’un automate fini non déterministe.
transformation d une expression r guli re en un afd
Transformation d'une expression régulière en un AFD
  • Une façon de construire un reconnaisseur à partir d’une expression régulière consiste à construire un AFN à partir d’une expression régulière ensuite simuler le comportement de l’AFN sur une chaîne d’entrée.
  • Si la vitesse d’exécution est essentielle, on peut convertir le AFN en AFD.
construction d un afn partir d une expression r guli re
Construction d'un AFN à partir d'une expression régulière
  • L'algorithme de construction d'AFN utilise la structure syntaxique de l'expression régulière pour guider le processus de construction.
algorithme de construction d un afn partir d un l r
Algorithme de Construction d'un AFN à partir d'un L(r)
  • On décompose d’abord r en ses sous expressions.
  • On construit des AFN pour chacun des symboles de base (alphabet) de r.
  • Pour , construire l'AFN :
  • Pour a  A construire l'AFN :

i1

f1

i1est un nouvel état de départ et f1un nouvel état d’acceptation.

Il est clair que cet AFN reconnaisse {ε}

i2

a

f2

i2est un nouvel état de départ et f2un nouvel état d’acceptation.

Il est clair que cet AFN reconnaisse {a}

slide91

Supposons que N(s) et N(t) soient les AFN pour les expressions régulières set t.

  • Pour l’expression régulière s|t, construire l’AFN composé suivant N(s|t):
slide92

N(s)

i

f

N(t)

exemple l r r1 r2
Exemple L(r) = r1|r2

i1

f1

r1

i

f

f2

i2

r2

pour l expression r guli re st
Pour l’expression régulière st

N(t)

  • Construire l’AFN composé N(st)
  • L’état de départ de N(s) devient l’état de départ de l’AFN composé.
  • et l’état d’acceptation de N(s) est fusionné avec l’état de départ de N(t).
  • L'état d'acceptation de N(t) devient l'état d'acceptation de l'AFN composé.

f

N(s)

pour l expression r guli re s
Pour l’expression régulière S*
  • construire l’AFN composé N(S*)

N(s)

i

f

Ici, i est un nouvel état de départ et f un nouvel état d’acceptation.

Dans l’AFN composé, on peut aller de i à f directement en suivant un arc étiqueté ε,

ou bien on peut aller de ià f en traversant N(s) une ou plusieurs fois.

Il est clair que l’automate composé reconnaisse (L(s))*.

remarque1
Remarque
  • Chaque fois qu’on construit un nouvel état, on lui donne un nom distinct.
  • Ainsi, il ne peut y avoir deux état dans deux sous-automates qui aient le même nom.
  • Même si le même symbole apparaît plusieurs fois dans r, on crée, pour chaque instance de ce symbole, un AFN séparé avec ses propres états.
exemple2
Exemple
  • soit l’expression régulière r = (a|b)* abb.
  • La figure suivante présente un arbre syntaxique pour r:
pour le composant r1
pour le composant r1
  • le premier a, on construit l’AFN
pour r3 r1 r2
pour r3=r1|r2
  • On peut maintenant combiner N(r1) et N(r2) en utilisant la règle d’union pour obtenir l’AFN
slide104

r = (a|b)* abb

L’AFN pour r4 est le même que celui pour r3

slide108

r = (a|b)* abb

Pour obtenir l’automate pour

r7 =r5r6,

slide116

r = (a|b)* abb

r11= r9r10

exercice1
Exercice
  • Construire l'automate pour l'expression a(a|0)*
m morisation du texte d entr e
Mémorisation du texte d'entrée
  • On utilise un tampon divisé en deux moitiés de N caractères
slide121

On lit N caractères d’entrées dans chacune des entrées du tampon en une seule commande système de lecture, plutôt que d’invoquer une commande de lecture pour chaque caractère d’entrée.

  • S’il reste moins que N caractères en entrée, un caractère spécial fdf est placé dans le tampon après les caractères d’entrée.
slide122

On gère deux pointeurs vers le tampon d’entrées.

  • La chaîne de caractères entre les deux pointeurs constitue le lexème courant.
  • Au départ les deux pointeurs désignent le premier caractère du prochain lexème à trouver.
  • L’un appelé le pointeur Avant , lit en avant jusqu’à trouver un modèle.
slide123

n

b

r

:

=

a

*

*

2

Début

Avant

slide124

Une fois que le prochain lexème est reconnu, le pointeur Avant est positionné sur le caractère à sa droite.

i

n

t

a

=

6

n

b

r

=

a

*

2

Avant

Début

slide125

Après traitement de ce lexème, les deux pointeurs sont positionnés sur le caractère qui suit immédiatement le lexème.

i

n

t

a

=

6

n

b

r

=

a

*

2

Début

Avant

slide126

Si le pointeur Avant est sur le point de dépasser la marque de moitié, la moitié droite est remplie avec N nouveaux caractères d’entrée.

i

n

t

a

=

6

n

b

r

=

a

*

2

Début

Avant

s

i

n

b

r

>

=

6

n

b

r

=

a

*

2

Avant

Début

slide127

Si le pointeur Avant est sur le point de dépasser l’extrémité droite du tampon, la partie gauche est remplie avec N nouveaux caractères d’entrées, et le pointeur Avant poursuit circulairement au début du tampon.

slide128

s

i

n

b

r

>

=

6

n

b

r

=

a

*

2

Avant

Début

s

i

n

b

r

>

=

6

a

l

o

r

s

a

=

b

Avant

Début

exemple3
Exemple
  • Instr → Si expr Alors instr | Si expr Alors instr Sinon instr| ε
  • expr → terme Oprel terme | terme
  • terme → id | nb

Où les terminaux si, alors, sinon, oprel, id et nb(jetons) engendrent les ensembles de chaînes données par les définitions régulières suivantes.

  • Si → si
  • Alors → alors
  • Sinon → sinon
  • Oprel → < |<= | = | <>| > | >=
  • Id → lettre (lettre | chiffre)*
  • Nb → chiffre(Chiffre)*

Lettre et chiffre sont définis comme suit :

  • Lettre → A | B | . | Z | a | b | . |z
  • Chiffre → 0 | 1 | . |9
slide130
AFN
  • On utilise un AFN pour garder trace des informations sur les caractères rencontrés quand le pointeur avant parcourt le texte d’entrée. On procède par des déplacements de position en position dans le diagramme au fur et à mesure de la lecture des caractères.
slide131

L’étiquette autre désigne tous les caractères autresque ceux qui sont indiqués explicitement sur les arcs quittant 0 et 1.

slide132

Si le caractère > et un autre caractère sont lus quand on progresse dans la suite d’arcs depuis l’état initial jusqu’à l’état d’acceptation 8.

Alors, étant donné que le caractère supplémentaire ne fait pas partie de l’opérateur de relation ≥ on doit reculer le pointeur avant d’un caractère. On utilise une * pour signaler les états dans lesquels ce recul dans l’entrée doit être fait.

slide133

En général, il peut y avoir plusieurs diagrammes de transition, chacun d’entre-eux spécifiant un groupe d’unités lexicales.

  • Si un échec se produit quand on parcoure un diagramme de transition, alors on recule le pointeur avant là ou il était à l’état initial de ce diagramme et on active le diagramme de transition suivant (le pointeur avant est reculé à la position du pointeur début).
slide134

Si un échec intervient dans tous les diagrammes de transition, alors une erreur lexicale a été détectée et on appelle une routine de récupération sur erreur.

remarque2
Remarque
  • Comme les mots clés sont des suites de lettres, il y a des exceptions à la règle selon laquelle une suite de lettres ou de chiffres débutant par une lettre est un identificateur.
slide136

Plutôt que de coder les exceptions dans un diagramme de transition, une astuce consiste à traiter les mots clés comme des identificateurs spéciaux ⇒ quand on atteint l’état d’acceptation, on exécute un certain code pour déterminer si le lexème amenant à cet état d’acceptation est un mot clé ou un identificateur.

slide137

Une technique simple pour séparer les mots clé des identificateurs consiste à diviser la table de symboles en deux parties :

  • une partie statique au début de la table de symboles dans laquelle on place les mots clé (si, alors, sinon) avant qu’aucun caractère n’ait été lu
  • et une partie dynamique en bas pour les identificateurs.
slide139

L’instruction de retour qui suit l’état d’acceptation utilise Unilex Id( ) et Ranger Id() pour obtenir l’unité lexicale et la valeur d’attribut respectivement.

slide140

Ranger Id()

travaille comme suit :

  • elle a accès au tampon ou l’unité lexicale identificateur a été trouvée.
  • Elle examine la table des symboles et :
    • Si elle trouve le lexème avec l’indication mot clé, Ranger Id ( ) rend 0.
    • Si elle trouve le lexème comme variable du programme, Ranger Id() rend un pointeur vers l’entrée dans la table des symboles.
    • Si elle ne trouve pas le lexème dans la table des symboles, elle le place en tant que variable et un pointeur vers cette nouvelle entrée est retourné.
la proc dure unilex id
La procédure Unilex Id( )
  • de manière similaire, recherche le lexème dans la table des symboles.
    • Si le lexème est un mot clé, l’unité lexicale correspondante est retournée ;
    • autrement, l’unité lexicale ident est retournée.
chapitre 4

Chapitre 4

L'analyse Syntaxique

introduction
Introduction

L'analyse syntaxique est l’une des opérations majeures d’un compilateur qui consiste à indiquer si un texte est grammaticalement correct et à en tirer une représentation interne, que l’on appelle arbre syntaxique.

d finition
Définition
  • Une grammaire est un ensemble de règles permettant de dire si une phrase, c'est-à-dire une suite de mots ou lexèmes, est correcte ou non.
  • Les règles qui nous intéressent en informatique sont celles qui donnent une description générative du langage, en indiquant comment précisément construire de telles phrase.
exemple4
exemple

Soit la définition d'une règle générative suivante :

  • Une phrase se compose d’une proposition sujet, d’un verbe et d’une proposition complément.

Alors qu’une définition de la forme :

  • La subordonnée relative complète un nom ou un groupe nominal appartenant à la proposition principale

n’est pas générative : elle ne nous dit pas comment effectivement construire une subordonnée relative.

arbres et r gles de grammaire
Arbres et règles de grammaire

La structure d’une phrase est généralement récursive. Par exemple:

  • une phrase contient un groupe nominal et un groupe verbal,
  • Un groupe verbal est composé lui-même d’un groupe nominal.
  • De plus, un groupe nominal peut lui-même contenir des groupes nominaux sous la forme de subordonnées relatives.
slide148

L’expression de la structure d’une phrase s’exprime sous la forme d’un arbre, que l’on appelle arbre syntaxique (ou arbre de dérivation) d’une phrase.

exemple5
Exemple

le chat qui est sur la commode regarde la souris

slide150

GV

les nœuds non-terminaux correspondent

aux catégories grammaticales

Les feuilles de l’arbre correspondent aux mots de la phrase

slide151

Les règles de grammaire peuvent être données sous la forme de règles de réécritures (qu’on appelle aussi parfois règles de productions) qui indiquent comment une catégorie grammaticale peut être transformée en une suite de catégories grammaticales ou de mots du vocabulaire.

exemple6
Exemple
  • <phrase>  <GN> <GV>
  • <GN>  <Article> <Nom> | <Article> <Nom> <Subord>
  • <Subord>  <Pron. relatif> <GV>
  • <GV>  <verbe> <GN> | <Verbe> <GN prep>
  • <GN Prep>  <Prep> <GN>
  • <Article> le | la | les ...
  • <Nom> chat | commode | souris | ...
  • <Verbe> est | regarde
  • <Prep> sur | sous | ...
  • <Pron. relatif> qui | que | dont | ...
quelques l ments grammaticaux de pascal
Quelques éléments grammaticaux de Pascal
  • <programme>  <en-tête de prog.> <block>
  • <en-tête de prog.> program <ident>
  • <block>  <declaration-list> <instruction-list>
  • <instruction-list>  <instruction> | <instruction> ; <instruction-list>
  • <instruction> begin <instruction-list> end ...
d finition d une d rivation
Définition d'une dérivation

A → γ

αAβ.

αγβ

slide155

si α1⇒ α2 ⇒ ..⇒ αn,

on dit que α1 se dérive en αn.

le symbole ⇒ signifie "se dérive en une étape"

slide156

pour dire

"se dérive en zéro, une ou plusieurs étapes"

on peut utiliser le symbole

*⇒

si α *⇒ β et β ⇒ γ, alors α *⇒ γ

slide157

+⇒

Signifie

"se dérive en une ou plusieurs étapes"

slide158

soit une grammaire G et S son axiome;

on peut utiliser la relation+⇒pour définir L(G), le langage engendré par G.

On dit qu’une chaîne de terminaux w appartient à

L(G) ssiS +⇒ w.

La chaîne w est appelée phrase de G.

slide160

siS *⇒ α,

où αpeut contenir certains non terminaux, on dit queαest une proto-phrasedeG.

exemple7
Exemple

Les chaînes E, -E, -(E),., -(id+E) sont toutes des proto-phrases de cette grammaire.

Soit la grammaire G(VT,VN,S,P)

E → E+E|E*E|(E)|-E|id

la chaîne -(id+id) est une phrase de la grammaire G car on a la dérivation:

E ⇒-E ⇒-(E) ⇒-(E+E) ⇒ -(id+E) ⇒ -(id+id)

slide162

On écrit

E *⇒ -(id+id)

pour indiquer que

E se dérive en –(id+id)

slide163

E ⇒-E ⇒-(E) ⇒-(E+E) ⇒ -(id+E) ⇒ -(id+id)

A chaque étape d’une dérivation, on doit faire deux choix

Il faut choisir le non terminal à remplacer

Quelle alternative utiliser pour ce non terminal

d rivation gauche
Dérivation gauche

Seul le non treminal le plus à gauche est remplacé à chaque étape.

On écrit

α ⇒gβ

on peut alors réécrire G

E ⇒g-E ⇒g-(E) ⇒g-(E+E) ⇒g-(id+E) ⇒g-(id+id)

E → E+E|E*E|(E)|-E|id

E → E+E|E*E|(E)|-E|id

E → E+E|E*E|(E)|-E|id

E → E+E|E*E|(E)|-E|id

E → E+E|E*E|(E)|-E|id

slide165

si

S *⇒g α

on dit que α est une proto-phrasegauche de la grammaire considérée.

d rivation droite
Dérivation droite

le terminal la plus à droite est remplacée à chaque étape

On écrit

α ⇒dβ

on peut alors réécrire G

E ⇒d-E ⇒d-(E) ⇒d-(E+E) ⇒d-(E+id) ⇒d-(id+id)

E → E+E|E*E|(E)|-E|id

E → E+E|E*E|(E)|-E|id

E → E+E|E*E|(E)|-E|id

E → E+E|E*E|(E)|-E|id

E → E+E|E*E|(E)|-E|id

d finition arbre d analyse
Définition Arbre d'analyse
  • Un arbre d'analyse ou syntaxique illustre visuellement la manière dont l’axiomed’une grammaire se dérive en une chaîne du langage.
slide170

alors un arbre syntaxique peut posséder un nœud intérieur étiqueté A

A

Z

X

Y

et avoir trois fils étiquetés X,Y et Z, de gauche à droite.

formellement
Formellement

Étant donné une grammaire non contextuelle,

un arbre syntaxique estun arbre possédant les propriétés suivantes:

  • La racine est étiquetée par l’axiome
  • chaque feuille est étiquetée par une unité lexicale
  • chaque nœud intérieur est étiqueté par un non terminal.
  • Si A est le non-terminal étiquetant un nœud intérieur et si les étiquettes des fils de ce nœud sont, de gauche à droite, X1,X2,..,Xn, alors A→ X1X2.Xn est une production,
  • ici X1,X2, .,Xn représentant soit un non terminal, soit un terminal.
exemple8
Exemple
  • liste → liste + chiffre
  • liste → liste - chiffre
  • liste → chiffre
  • chiffre → 0|1|2|3|4|5|6|7|8|9

Dérivons la chaine 9-5+2

ambigu t
Ambiguïté
  • Une grammaire peut avoir plus d’un arbre syntaxique qui engendre une chaîne donnée d’unités lexicales. Une telle grammaire est dite ambiguë.
  • Comme une telle chaîne a habituellement plus d’une signification, on a besoin de travailler avec des grammaires non ambiguës.
exemple9
Exemple
  • <Instr> ::= <Instr-if>| <Instr-aff>|…
  • <Instr-if >::= if <Cond> then <Instr>|if <Cond> then <Instr> else <Instr>
  • <Cond> ::= <Id> <Oprel> <Id>
  • <Id> ::= a | b | c
  • <Oprel>::= >|<|>=|<=|=
  • <Instr-aff> ::= <Id> := <Chiffre>
  • <Chiffre> ::= 0|1|2|3|4|5|6|7|8|9

if a > b then

if a > c then

a:=3

else

a := 9

slide175

<Instr>

<Instr-if>

<Instr>

<Cond>

then

if

<Id>

<Oprel>

<Id>

<Instr-if>

b

a

>

<Instr>

<Instr>

else

<Cond>

if

then

<Instr-aff>

<Oprel>

<Id>

<Id>

c

a

>

<Instr-aff>

<Chiffre>

:=

<Id>

<Chiffre>

a

<Id>

:=

9

a

3

slide176

<Instr>

<Instr-if>

<Instr>

<Cond>

if

then

<Instr>

else

<Id>

<Oprel>

<Id>

<Instr-if>

b

a

>

<Instr>

<Cond>

<Instr-aff>

if

then

<Oprel>

<Id>

<Id>

c

a

>

<Instr-aff>

<Chiffre>

:=

<Id>

<Chiffre>

<Id>

:=

a

9

a

3

probl me
Problème

Construire l’arbre syntaxique d’une phrase à partir d’une grammaire.

  • Il existe essentiellement deux types de processus :
  • l’analyse descendante, dans laquelle on construit l’arbre en descendant de la racine vers les feuilles.
  • l’analyse ascendante construit l’arbre syntaxique en montant des feuilles vers la racine.
analyse descendante
Analyse descendante
  • L’algorithme d’analyse est récursif.
  • Son problème est celui de la terminaison : il ne peut s’arrêter s’il y a une infinité d’appels emboîtés sans lecture.
d finition1
Définition
  • L’analyse descendante peut-être considérée comme une tentative pour déterminer une dérivation gauche associée à une chaîne d’entrée.
  • Elle peut-être aussi vue comme une tentative pour construire un arbre d’analyse de la chaîne d’entrée, en partant de la racine et en créant les nœuds de l’arbre suivant un ordre prédéfini.
exemple10
Exemple
  • S → cAd
  • A → ab|a

Soit la chaîne d’entrée suivant :

w = cad

slide182

w = cad

S → cAd

A → ab|a

S

pointeur d’entrée

A

c

b

a

slide183

w = cad

S → cAd

A → ab|a

S

pointeur d’entrée

A

c

d

a

remarque3
Remarque
  • Une grammaire récursive à gauche peut faire boucler un analyseur par descente récursive même s’il possède un mécanisme de retour arrière.
  • En effet dans le cas de A → Aα|ab|a, en essayant de développer A, on peut éventuellement se retrouver en train de développer A de nouveau, et cela sans avoir
  • consommé de symbole en entrée.
  • ⇒ Nous devons éliminer la récursivité à gauche
suppression de la r cursivit gauche
Suppression de la récursivité gauche
  • Définition:
  • une grammaire est récursive à gauche si elle contient un non-terminal Atel qu’il existe une dérivation A +⇒ Aα, où α est une chaîne quelconque.
suppression de la r cursivit gauche1
Suppression de la récursivité gauche

Quelque soit le nombre de A-productions, il est possible d’éliminer les récursivités à gauche immédiates par la technique suivante:

slide188

A → Aα1

  • A → Aα2
  • A →…
  • A → Aαm
  • A → β1
  • A → β2
  • ..
  • A → βn
slide189

A → Aα1

A → Aα2

A →…

A → Aαm

A → β1

A → β2

..

A → βn

  • Dans un premier temps, on groupe les A-productions comme suit:

A → Aα1| Aα2| ...| Aαm|β1|β2|…|βn

  • où aucune βine commence par un A.
  • Ensuite on remplace les A-productions par:

A → β1A’|β2A’|…| βnA’

A’ → α1A’| α2A’| ...| αm A’|ε

slide190

A → Aα|ab|a

  • A→ abA'|aA'
  • A' → αA'|ε

A

abα

a

A'

b

α

A'

ε

analyse ascendante
Analyse Ascendante
  • nous introduisons un modèle général d’analyse syntaxique ascendante, connu sous le nom d’analyse par décalage-réduction.
  • Nous nous intéressons à une forme d’analyse par décalage-réduction facile à implémenter, appelée analyse par précédence d'opérateurs.
slide192

L’analyse par décalage-réduction a pour but de construire un arbre d’analyse pour une chaîne source en commençant par les feuilles (le bas) et en remontant vers la racine

  • (le haut).
  • Ce processus peut-être considéré comme la "réduction" d’une chaîne w vers l’axiome de la grammaire.
  • A chaque étape de réduction, une sous-chaîne particulière
  • correspondant à la partie droite d’une production est remplacée par le symbole de la partie gauche de cette production.
exemple11
Exemple
  • S → aABe
  • A→ Abc|b
  • B →d
  • La phrase abbcde peut-être réduite vers S par les étapes suivantes:
slide194

S → aABe

A→ Abc|b

B →d

  • abbcde
  • aAbcde production utilisée A→ b
  • aAde production utilisée A→ Abc
  • aABe production utilisée B→ d
  • S production utilisée S → aABe

Ces réductions, élaborent en sens inverse la dérivation droite suivante:

S ⇒daABe ⇒daAde ⇒d aAbcde ⇒dabbcde