Vous êtes sur la page 1sur 86

Machine Translated by Google

Compilateur : Théories,
Techniques et outils
Georges Edouard KOUAMOU
Ecole Nationale Supérieure d'Ingénieurs
Machine Translated by Google

Objectifs

• Initier les élèves aux principes de la compilation.


• Les idées et techniques développées dans ce domaine sont tellement générales et
fondamental qu'un informaticien (et même un non­informaticien) les utilisera très souvent
au cours de sa carrière (informatique, moteurs de recherche, etc.).

• Etudier les algorithmes et les structures de données inhérents au


mise en place de compilateurs : analyse lexicale, analyse syntaxique, analyse
sémantique, génération de code.

• Comprendre comment est écrit un compilateur pour permettre aux étudiants de mieux
comprendre les « contraintes » imposées par les différents langages lors de l'écriture d'un
programme dans un langage de haut niveau.

Conception du compilateur : théorie, outils 2


Machine Translated by Google

Contenu
• Introduction

• Analyse lexicale •
Machine à états finis •
Expressions régulières
• Jetons lexicaux

• Analyse (analyse syntaxique)


• Grammaires
• Analyse
descendante •
Analyse ascendante • Grammaires attribuées (ajoutez une sémantique à une
grammaire sans contexte) • Implémentation avec SableCC

Conception du compilateur : théorie, outils 3


Machine Translated by Google

Les références

• Seth D. Bergmann. Conception du compilateur : théorie, outils et exemples, février


2016, notes de cours
• Andrew W. Appel. Implémentation du compilateur moderne en Java. 2ème
Édition, Cambridge University Press, 2004
•Donald Knuth. Sémantique des langages sans contexte.
THÉORIE DES SYSTÈMES MATHÉMATIQUES, Vol. 2, n° 2, publié par
Springer­Verlag, New York Inc.

Conception du compilateur : théorie, outils 4


Machine Translated by Google

Introduction

Conception du compilateur : théorie, outils 5


Machine Translated by Google

Définition (compilateur)

• Le processeur de l'ordinateur est capable d'exécuter des opérations très simples et


primitives = langage machine (ou assembleur)
1. ajouter deux nombres stockés en mémoire
2. déplacer les numéros d'un emplacement de la mémoire à un autre
3. déplacer les informations entre le CPU et la mémoire
− ± 2−4
• Comment l'ordinateur exécute­t­il une instruction complexe : 2
• Utilisation d'un logiciel de traduction

• Un compilateur accepte les instructions (complexes) et les traduit en


séquences d'opérations en langage machine
• Un interpréteur est un logiciel qui remplit une fonction très similaire à celle d'un compilateur mais il
effectue les calculs spécifiés dans le programme source.

Conception du compilateur : théorie, outils 6


Machine Translated by Google

La structure d'un compilateur

1. Analyse lexicale 2.

Analyse 3.

Analyse sémantique 4.

Optimisation
5. Génération de codes

• Les 3 premiers, au moins, peuvent être compris par analogie avec la façon dont les
humains comprennent les langues naturelles (français, anglais, …)

Conception du compilateur : théorie, outils 7


Machine Translated by Google

Structure d'un compilateur

• saisie : chaîne de caractères •


Analyse lexicale ou Scanner : diviser la chaîne de caractères en mot connu sous le nom de jeton
ou lexème
• Exemples : mots­clés, opérateurs, constantes, identifiants.
• Analyse syntaxique ou analyseur : vérifie la syntaxe appropriée et construit l' arbre syntaxique.
• La structure sous­jacente du programme source •
De nombreux compilateurs incluent également une phase d' analyse sémantique
• Les types de données sont vérifiés et des conversions de types sont effectuées si
nécessaire. • Phase d'ajout : l'optimisation est utilisée pour produire un code objet efficace. •
Génération de code : le compilateur produit • une
forme intermédiaire, appelée byte code. Le cas du compilateur Java ou .Net •
Ou un code natif pour une machine particulière (code binaire exécutable)

Conception du compilateur : théorie, outils 8


Machine Translated by Google

Techniques de mise en œuvre

• Un compilateur est aussi un logiciel


• Il doit être écrit dans un langage
• amorçage
• un petit sous­ensemble du langage source est implémenté et utilisé pour compiler un
compilateur pour le langage source complet, écrit dans le langage source lui­même
• Compilation croisée •
Un compilateur existant peut être utilisé pour implémenter un compilateur pour un nouvel ordinateur.

• Forme intermédiaire pour réduire la charge de travail du rédacteur du compilateur


• un langage quelque part entre le langage source de haut niveau et la machine
langue
• il suffit d'un seul traducteur pour chaque langue de haut niveau vers la forme intermédiaire et
d'un seul traducteur (ou interprète) pour la forme intermédiaire sur chaque ordinateur

Conception du compilateur : théorie, outils 9


Machine Translated by Google

Quelques applications des techniques du compilateur

• L'Internet
• Navigateur Web : traduire du texte HTML en objets graphiques • Interpréteur
PHP • Systèmes de

gestion de bases de données (SGBD)


• Interprétation et exécution d'instructions SQL • Recherche •
Recherche
avancée dans les éditeurs de texte, logiciels bureautiques, etc… • Framework XML/

JSON
• Encodage/décodage du flux de texte dans une structure XML •
Traduire le message SOAP en invocation d'objet • Réseau,

capteurs
• Décoder le flux de données

Conception du compilateur : théorie, outils dix


Machine Translated by Google

Analyse lexicale

diviser l'entrée en mots individuels ou « jetons »


Langage formel et théorie des automates comme outils de conception des scanners

Conception du compilateur : théorie, outils 11


Machine Translated by Google

Analyse lexicale

• Que voulons­nous faire ?


Exemple:
si (je == j)
Z=0;
autre
Z=1;
• L'entrée est juste une chaîne de caractères :
\tif (i == j)\n\t\tz = 0;\n\telse\n\t\tz = 1;
• Objectif : Partitionner la chaîne d'entrée en sous­chaînes –
Où les sous­chaînes sont des jetons
Conception du compilateur : théorie, outils 12
Machine Translated by Google

Jeton (définition et spécification)


• Définition : Une catégorie syntaxique • En
français ou anglais : nom, • Classer les sous­chaînes du programme selon leur
rôle. • Le résultat de l'analyse lexicale est un flux de
• verbe, adjectif, … • • jetons. . . . . . qui est entré dans
Dans un langage de programmation : l'analyseur • L'analyseur s'appuie sur des distinctions de jetons
• Identifiant, Entier, Mot clé, Espace, … – Un identifiant est traité différemment d’un mot­clé

• Spécification : Les jetons correspondent à des ensembles de chaînes.


• Identifiant : chaînes de lettres ou de chiffres, commençant par une
lettre • Entier : une chaîne de chiffres non
vide • Mot clé : « sinon » ou « si » ou «
commencer » ou… • Espaces : une séquence non vide de blancs, nouvelles lignes et onglets

Conception du compilateur : théorie, outils 13


Machine Translated by Google

Conception d'un scanner

• Définir un ensemble fini de jetons


– Les jetons décrivent tous les éléments
d'intérêt – Le choix des jetons dépend du langage et de la

conception
de l'analyseur • Exemple • \tif (i == j)\n\t\tz =
0;\n\ telse\n\t\tz = 1; • Tokens utiles pour cette expression : Entier, Mot clé, Relation, Identifiant,
Espaces, (, ), =, ; •
Remarque : ( ) = ; sont des jetons, pas des caractères,

ici. • Décrivez quelles chaînes appartiennent à chaque jeton.

Conception du compilateur : théorie, outils 14


Machine Translated by Google

Implémentation du scanner

• Une implémentation doit faire deux choses :


1. Reconnaître les sous­chaînes correspondant aux jetons 2. Renvoie la
valeur ou le lexème du jeton Le lexème est la sous­chaîne

• Le lexer rejette généralement les jetons « sans intérêt » qui ne contribuent pas à
analyse. •
Exemples : espaces, commentaires

Nous avons encore besoin Il existe plusieurs formalismes pour spécifier les jetons
Une manière de décrire les lexèmes de chaque jeton Une Les langages réguliers sont les plus populaires
manière de résoudre les ambiguïtés ­Est­ – Théorie simple et utile
ce qu'il y a deux variables i et f ? ­ Facile à comprendre
­Est­ce que == deux signes égaux = = ? – Mises en œuvre efficaces

Conception du compilateur : théorie, outils 15


Machine Translated by Google

Langue formelle Exemples de langage de l'alphabet {0, 1}


L1={0,10,1011}
L2= { } ou
L3 = { , 0,00,000,0000,00000,... }
• Un alphabet est un ensemble de symboles
L4 : L'ensemble de toutes les chaînes de zéros et de uns
• Exemple : alphabet binaire ={0, 1} ayant un nombre pair de un (ensemble infini)

• Une chaîne est une liste de caractères d'un alphabet donné


• l'ordre dans lequel les personnages sont répertoriés est important
• Exemple : « 101 » est différent de « 110 »

désigne la chaîne nulle (chaîne de 0 caractère)

• Un langage (formel) est un ensemble de chaînes d'un alphabet donné

• Problème : Comment pouvons­nous spécifier les chaînes de manière infinie (ou très grande)
langue?

Conception du compilateur : théorie, outils 16


Machine Translated by Google

Langues régulières

• Les langues sont des ensembles de

chaînes. • Besoin d'une notation pour spécifier les ensembles que nous

voulons. • La notation standard pour les langages réguliers est celle des expressions régulières.

Exemple
Alphabet = caractères anglais/français Langue =
phrases anglaises/françaises Toutes les chaînes
de caractères anglais (resp. français) ne sont pas toutes des caractères anglais (resp. français).
français) phrase

Conception du compilateur : théorie, outils 17


Machine Translated by Google

Expressions régulières

• Définition Le régulier
• Expressions régulières atomiques
les expressions supérieures à
• Caractère unique 'c' ={"c"}
sont le plus petit ensemble
• Epsilon ε = {""}
d'expressions comprenant :
• Expressions régulières composées •ε
• Union : + = | • Concaténation : • 'c' où c
=| = • + où A, B sont des expressions sur
*
• Itération : 0≤ •
où A, B sont des rex sur
• *
où A est une expression sur
Sémantique ­ = . = |
"" ­ *
­L= = 0≤ ) )
­L'c' ={"c"}
­L+=
Conception du compilateur : théorie, outils 18
Machine Translated by Google

Exemples

• Entier : une chaîne de chiffres non vide


• ′ '
= 0 ' + ' 1 ' + ' 2 ' + ' 3 ' + ' 4 '+' 5 ' + ' 6 ' + ' 7 ' + ' 8 ' + ' 9
• = *
+ *
• Abréviation : • =+
Identifiant : chaîne de lettres ou de chiffres, commençant par une lettre
. . . + 'Z' + 'a' + . . .
• lettre = 'A' + +'z'
• identifiant = lettre (lettre + chiffre)*
• Est­ce que (lettre* + chiffre*) est identique ?
• Adresses mail
•Σ= .,@
•n= +
• = nom′@′nom′.′nom′.′nom

Conception du compilateur : théorie, outils 19


Machine Translated by Google

Notation
• Il existe des variations dans la notation des expressions régulières

• Syndicat : A | B • ≡A+B

Option : A + ε • ≡Un ?

Plage : 'a'+'b'+…+'z' • Plage ≡ [az]


exclue :
• complément de [az] ≡ [^az]

Conception du compilateur : théorie, outils 20


Machine Translated by Google

Notation des expressions régulières

• un un personnage ordinaire se défend



la chaîne vide

alternance, au choix entre M ou N
• | ∙ (ou ) concaténation, un M suivi d'un N
• *
répétition zéro ou plusieurs fois
• +
répétition une ou plusieurs fois
?
• facultatif, zéro ou une occurrence de M
• Alternance de jeux de caractères [a­zA­Z]
• .
Un point représente n'importe quel caractère de signe, à l'exception du saut de ligne

Conception du compilateur : théorie, outils 21


Machine Translated by Google

Ambiguïté des expressions régulières

• Ces règles sont un peu ambiguës. • If8


correspond­il comme un identifiant unique ou comme les deux jetons if et 8 ?
• Correspondance la plus longue : la sous­chaîne initiale la plus longue de l'entrée pouvant
correspondre à n'importe quelle expression régulière est considérée comme le jeton suivant.

• Priorité des règles : pour une sous­chaîne initiale particulière la plus longue, la première
expression régulière pouvant correspondre détermine son type de jeton.
• L'ordre d'écriture des règles d'expression régulière a une importance

Conception du compilateur : théorie, outils 22


Machine Translated by Google

Implémentation d'expressions régulières


• Spécification de la structure lexicale à l'aide d'expressions régulières
• Les expressions régulières décrivent de nombreux langages utiles
Étant donné une chaîne s et une rexp R, est
• Les langages réguliers sont une spécification de langage
• Nous avons encore besoin d'une mise en œuvre s L(R) ?
• Implémentation d'expressions régulières = Automates finis
• – Automates finis déterministes (DFA)
• – Automates finis non déterministes (NFA)

Expression régulière
NFA DFAE les tables

Conception du compilateur : théorie, outils 23


Machine Translated by Google

Machines à états finis (FSM)


• L'étude des machines à états finis (théoriques) est appelée théorie des automates.
• Automate n'est qu'un autre mot pour machine
• Un automate = Σ, , , , où
•Σ



• :×Σ→

• une chaîne est acceptée lorsque l'automate atteint un état final après tout le
la chaîne d'entrée a été lue.
• Le langage reconnu par un automate est l'ensemble des chaînes qu'il accepte.
• = Σ *| , * , =

Conception du compilateur : théorie, outils 24


Machine Translated by Google

Graphiques et exemples d'état d'automates finis

Un automate fini qui n'accepte que "1"

Un état 1

L'état de départ Un automate fini acceptant n'importe quel nombre de


1 suivis d'un seul 0 • Alphabet :
{0,1}

1
Un État acceptant

0
un

Une transition

Conception du compilateur : théorie, outils 25


Machine Translated by Google

Représentations

Représentation du diagramme d'état Représentation sous forme de tableau

0 1
q0 q0 q1
q1 q1 q0

• Chaque état de la machine est représenté par un cercle


Exemple : vérificateur de parité paire • La fonction de transition est représentée par des arcs étiquetés par des
symboles d'entrée menant d'un état à un autre.
Cette machine accepte toute chaîne de • Les états acceptants sont des doubles cercles
zéros et de uns contenant un nombre pair de uns • L'état de départ est indiqué par un arc sans état à son extrémité source
(ce qui inclut la chaîne nulle). (queue).

Conception du compilateur : théorie, outils 26


Machine Translated by Google

Des exercices

• Afficher une machine à états finis, sous forme de graphique d'état ou de tableau
pour chacun des langages suivants (dans chaque cas, l'alphabet d'entrée est
{0,1}) :
1. Chaînes contenant un nombre impair de zéros
2. Chaînes contenant trois chaînes consécutives
3. Chaînes contenant exactement trois zéros
4. Chaînes contenant un nombre impair de zéros et un nombre pair de
ceux.

Conception du compilateur : théorie, outils 27


Machine Translated by Google

Solutions

Conception du compilateur : théorie, outils 28


Machine Translated by Google

Automates finis
• Un automate fini non déterministe (NFA) est un automate qui dispose d'un choix d' arêtes –
étiquetées avec le même symbole – à suivre pour sortir d'un état.
• Peut avoir plusieurs transitions pour une entrée dans un état donné
• Peut avoir des mouvements ε

• Dans un automate fini déterministe (DFA), aucune arête sortant du même état n'est étiquetée avec
le même symbole
• Une transition par entrée et par état
• Pas de mouvements ε

• A partir de la représentation du tableau, il est plus facile de s'assurer que la machine est
complètement spécifié et déterministe
• Il doit y avoir exactement une entrée dans chaque cellule du tableau

• Des automates finis sont utilisés pour implémenter le jeton lexical en tant qu'ordinateur
programme

Conception du compilateur : théorie, outils 29


Machine Translated by Google

NFA contre DFA

• Pour une langue donnée, NFA peut être plus simple que DFA. •

Les NFA et DFA reconnaissent le même ensemble de langues (normes).


langues)
• Les DFA sont plus rapides à exécuter
• Il n'y a aucun choix à considérer
Un automate fini acceptant tout nombre binaire
• DFA peut être exponentiellement plus grand que NFA multiple de 4 • Alphabet :
{0,1}
1 1

0
0 0 0 0
UN B C UN B C
1
1
0
NFA DFAE
Conception du compilateur : théorie, outils 30
Machine Translated by Google

Expressions régulières vers des automates finis

NFA
Pour chaque type de rex, définissez un NFA
– Notation : NFA pour reexp M
DFAE

Expression régulière

Piloté par table


Spécification lexicale Mise en œuvre de DFA M

Conception du compilateur : théorie, outils 31


Machine Translated by Google

Expressions régulières vers NFA (1)


Pour saisir un Pour l'entrée A+B

un UN

B
Pour

ou

Pour l'entrée A*

Pour l'entrée AB

UN
UN B

Conception du compilateur : théorie, outils 32


Machine Translated by Google

Exemple de conversion RegExp ­> NFA

Considérons l'expression régulière (1+0)*1

(1+0)*1

(1+0)*

1
(1+0) Conception du compilateur : théorie, outils 33
Machine Translated by Google

Conversion d'un NFA en DFA


• Définition ( ­fermeture)
• Soit S un ensemble d'états. la fermeture ( S ) est l'ensemble des états qui peuvent être atteints à partir d'un état dans S
sans consommer aucune entrée, c'est­à­dire en passant uniquement par les bords
• est le plus petit ensemble T tel que = ,
• Calcul de T
•←

'←
• = ' ' ,
• = '

• Algorithme pour convertir NFA en DFA


• Etat initial : close({d}) où d est l'état initial du NFA
• La transition de S avec un symbole c : δ = , • S ) ,(
est un état final si S ∩ ≠

Conception du compilateur : théorie, outils 34


Machine Translated by Google

Exemple de conversion NFA ­> DFA


Considérons l'expression régulière (1+0)*1

1
1
0 1
ABCDHI FGHIABCD EGHIABCDJ

0
0

Conception du compilateur : théorie, outils 35


Machine Translated by Google

Exemple
• IDENTIFIANT

• NUM (entier ou décimal)


• RÉEL

• SI

Écrivez l'expression régulière


pour chaque jeton, puis dessinez
le NFA correspondant

Conception du compilateur : théorie, outils 36


Machine Translated by Google

Des exercices

• Dans le livre From Appel pages 34­35 •


Exercice 2.1 : écrire une expression régulière
• De DFA à l'expression régulière
• Exercice 2.4 : convertir une expression régulière en NFA
• Exercice 2.5 : convertir NFA en DFA

• Exercice 2.6 : algorithme pour minimiser un DFA

Conception du compilateur : théorie, outils 37


Machine Translated by Google

Analyse syntaxique/analyse syntaxique

Syntaxe : la manière dont les mots sont assemblés pour former des expressions, des clauses ou
des phrases

Pour l'analyse, les chaînes sont des programmes sources, les symboles sont des jetons lexicaux et
l'alphabet est l'ensemble des types de jetons renvoyés par l'analyseur lexical.

Conception du compilateur : théorie, outils 38


Machine Translated by Google

Grammaires sans contexte

• Nous avons déjà vu deux manières de spécifier formellement un langage : régulier


expressions et machines à états finis.
• Nous allons maintenant définir une troisième manière de spécifier les langues en utilisant une grammaire
• Une grammaire est une liste de règles qui peuvent être utilisées pour produire ou
générer toutes les chaînes d'un langage, et qui ne génèrent aucune chaîne qui ne
soit pas dans le langage.
• Définition formelle : Une grammaire hors contexte = Σ, , , où
• est l'alphabet d'entrée, un ensemble fini de caractères, les symboles d'entrée.
• V est un ensemble fini de symboles, distincts des symboles terminaux, dits non terminaux
symboles
• est le non­terminal
*
ou Axiome de départ.
• ×Σ Une liste finie de règles de réécriture, également appelées productions, qui
définissent la manière dont les chaînes du langage
* peuvent être générées. Chacune de ces règles de
, la forme → où ,
réécriture est de Σ .

Conception du compilateur : théorie, outils 39


Machine Translated by Google

Dérivations et arbres d'analyse

• Une dérivation est la substitution d'un non­terminal par le côté droit (RHS) d'un
production
• Une dérivation la plus à gauche est une dérivation dans laquelle le symbole non terminal le plus à gauche est
toujours celui développé.

• une dérivation la plus à droite est une dérivation dans laquelle le non­terminal le plus à droite est toujours le
prochain à être élargi
• La langue spécifiée par la grammaire G est L(G) définie comme :
• *
= Σ | •
Un arbre d'analyse est créé en connectant chaque symbole dans une dérivation à celui de
dont il est dérivé

• Une grammaire est ambiguë si elle peut dériver une phrase avec deux arbres d'analyse différents
• L'ambiguïté peut généralement être éliminée en transformant la grammaire.

Conception du compilateur : théorie, outils 40


Machine Translated by Google S

0 S 0

Exemples
0S0
Grammaire Exemple de dérivation 1S1
→ 0 0 1 1 0|1 00 00 00 001 100 0010100 0010100 ()
0

→ ( 2)
→ 2= ,

Compte tenu de la grammaire

→+
1. Montrer que le mot 1­2­3 est dans la langue générée par cette grammaire
→−
2. Dessinez deux arbres d'analyse différents pour le mot donné. Conclure que cette grammaire est ambiguë

3. Faites le même exercice avec le mot 1+2*3
→/

Conception du compilateur : théorie, outils 41


Machine Translated by Google

→+
Dérivation gauche
→−
E=> EE=> num­E=> num­EE=> num­num­E=> num­num­num

→/
Dérivation droite
→→
E=> EE=> E­num=> EE­num=> E­num­num=> num­num­num

E E

E ­ E E ­ E

Numéro E ­ E E ­ E Numéro
(1) (3)
Numéro Numéro Numéro Numéro
(2) (3) (1) (2)
Machine Translated by Google

Cours de grammaires

• La classification de Noam Chomsky (linguiste, en 1959) proposait des classes de grammaires selon
à la complexité
0. Sans restriction : une grammaire sans restriction est une grammaire dans laquelle il n'y a aucune restriction sur les règles de
réécriture.

1. Contexte : une grammaire contextuelle est une grammaire dans laquelle chaque règle doit être de la forme

où chaque α, β, γ est une chaîne de terminaux et de non­terminaux,
et A représente un non­terminal
2. Sans contexte : Une grammaire sans contexte est une grammaire dans laquelle chaque règle doit être de la forme : A → α
3. Linéaire à droite : Une grammaire linéaire à droite est une grammaire dans laquelle chaque
règle est de la forme : → | où A et B représentent des non­terminaux et a représente un terminal
Avis
• Les grammaires linéaires droites peuvent être utilisées pour définir des éléments lexicaux tels que des identifiants, des constantes et des mots­clés.
• (3) (2) (1) (0)

Conception du compilateur : théorie, outils 43


Machine Translated by Google

Des exercices

• Ecrire une grammaire non ambiguë qui engendre les langues


suivants :
• (un). Parenthèses et crochets équilibrés. Exemple : ([[](()[()][])])
• (b). les palindromes sur l'alphabet {a,b}
• Montrer que l'image miroir d'un langage algébrique est algébrique.
• Montrer que la famille des langages algébriques est proche par les opérations
rationnelles (union, concaténation et itération).
• Remarque : Elle n'est par contre pas close par intersection, ni par passage au
complémentaire.
• Montrer que la grammaire SSS + aSb→ + 1 est ambiguë, et construire une grammaire
non ambiguë qui reconnaît le même langage.

Conception du compilateur : théorie, outils 44


Machine Translated by Google

Des exercices

• Écrivez une grammaire sans ambiguïté pour chacune des langues suivantes. un.

Palindromes sur l'alphabet {a, b} (chaînes identiques en arrière et en avant).

b. Chaînes qui correspondent à l'expression régulière a b

c. Chaînes qui correspondent à l'expression régulière a b et ont plus de a


que les b.

d. Parenthèses équilibrées et crochets. Exemple: ([[](()[()][])])

• Montrer que la grammaire → | grammaire | c'est ambigu. Construisez ensuite un


non ambiguë qui reconnaît la même langue.

Conception du compilateur : théorie, outils 45


Machine Translated by Google

Des exercices

• Objectif : convertir un automate non fini (DFA) en un automate sans contexte


grammaire

• Donner une grammaire linéaire correcte pour chacune des langues de Sample
Problème

1. Chaînes contenant un nombre impair de zéros


2. Chaînes contenant trois chaînes consécutives
3. Chaînes contenant exactement trois zéros
4. Chaînes contenant un nombre impair de zéros et un nombre pair de
ceux.

Conception du compilateur : théorie, outils 46


Machine Translated by Google

Réponse : algorithme général

• Algorithme pour convertir un DFA en une grammaire linéaire correcte


1. Associer une variable à chaque état i

2. Pour chaque transition → , ajouter une nouvelle production → au set


des règles

3. Pour chaque état final k, ajouter → à l'ensemble des règles de production


4. le non terminal associé à l'état initial est le symbole de départ
(axiome)

Conception du compilateur : théorie, outils 47


Machine Translated by Google

Problème d'analyse

• Étant donné une grammaire et une chaîne d'entrée, déterminer si la chaîne est dans le langage de la
grammaire et, si c'est le cas, déterminer sa structure.

• Classification des algorithmes d'analyse


• fait référence à la séquence dans laquelle un arbre de dérivation est construit ou parcouru
• Deux approches : soit descendante, soit ascendante

• algorithme d'analyse descendante, les règles de grammaire sont appliquées de manière


séquence qui correspond à une direction générale descendante dans l'arbre de dérivation

• L'algorithme d'analyse ascendant part du bas de l'arbre de dérivation et applique les règles de
grammaire (à l'envers).

Conception du compilateur : théorie, outils 48


Machine Translated by Google

Analyse descendante

Conception du compilateur : théorie, outils 49


Machine Translated by Google

Présentation

• Marqueur de fin de fichier

• Les analyseurs doivent lire non seulement les symboles du terminal mais également le marqueur de fin de

fichier. • Le symbole $ est généralement utilisé pour représenter la fin du fichier.

• La grammaire donnée est augmentée d'un nouveau symbole de début S' et d'un nouveau → $
'
production

• Calculez les ensembles PREMIER et SUIVANT pour chaque non­terminal


• FIRST (γ ) est l'ensemble des terminaux qui peuvent commencer les chaînes dérivées de γ
• FOLLOW ( X ) est l'ensemble des terminaux qui peuvent suivre immédiatement X

• Construire la table d'analyse

Conception du compilateur : théorie, outils 50


Machine Translated by Google

Calcul itératif de FIRST

• si X est un symbole terminal, FIRST(X)={X}

• Si → est une production, {}


• Si → 1 2 3 … est une production,
• = 1

2 1

3 2
• ….

−1

• trouver l'union des ensembles Premier(x) pour chaque symbole du côté droit d'une règle,
mais arrêtez­vous lorsque vous atteignez un symbole non nullable

Conception du compilateur : théorie, outils 51


Machine Translated by Google

Calcul des ensembles FOLLOW

• Ajoutez le marqueur EOF $ dans FOLLOW(S) où S est l'axiome


• → est une production où ( Σ) , ,
alors −

• → est une production où , ( Σ) alors

• → et alors

Conception du compilateur : théorie, outils 52


Machine Translated by Google

Construire la table d'analyse

• La table d'analyse prédictive est une table bidimensionnelle où


• Les lignes sont indexées par les non­terminaux
• Les colonnes sont indexées par les terminaux • Et
les cellules contiennent des règles de production
• Les tables d'analyse codent les informations nécessaires à la mise en œuvre d'un analyseur prédictif •
Algorithme (Comment
remplir la table)
• Entrez la production X → dans la ligne X, colonne T du tableau pour chaque T FIRST( )
• si est nullable, entrez la production dans la ligne X, colonne T pour chaque T FOLLOW(X) .
• Une grammaire est LL(1) si sa table d'analyse prédictive ne contient aucun doublon.
entrées •
LL(1) signifie analyse de gauche à droite, dérivation la plus à gauche, anticipation à 1 symbole

Conception du compilateur : théorie, outils 53


Machine Translated by Google

Exemple

S → ABc 1. First(ABc) = First(A) U First(B) = {b,c} (car A est


nullable )
UNE → bUNE
2. Premier(bA) = {b}
UNE → 3. Premier( )={ }

B→c 4. Premier(c) = {c}

Premier(S) = {b,c } 1. Suivre(S)={$}


Premier(A) = {b, } 2. Suivre(A) =Premier(B)={c}
Premier(B) = {c} 3. Suivre(B)=Premier(c) ={c}
Premier(b) = {b} b c $
Premier(c) = {c} SS → ABc S → ABc
AA → bA A →
2
={ , ≥1} B B→c

Conception du compilateur : théorie, outils 54


Machine Translated by Google

Exercice : construire la table d'analyse LL(1)

S Ab a AA →
A Sa Ac B →
B Sd

Conception du compilateur : théorie, outils 55


Machine Translated by Google

Récursion gauche

• Considérons les deux productions E → E + T et E → T


• La 1ère règle est sous la forme : A → Aa
• Cette propriété est connue sous le nom de récursivité gauche.

• Théorème : les grammaires avec récursion à gauche ne peuvent pas être LL(1)
• Élimine la récursion gauche


• La règle incriminée peut être sous la forme : →
• dans lequel on suppose que β est une suite de terminaux et de non­terminaux qui ne commence pas par
un A
• Éliminez la récursion gauche en introduisant un nouveau non­terminal, R, et en réécrivant le

règles comme : →→|


• Théorème : les règles résultantes dérivent les mêmes chaînes que l'original.
productions

Conception du compilateur : théorie, outils 56


Machine Translated by Google

Récursion gauche

• Définition : Une grammaire est récursive à gauche si elle contient un A non terminal
tel qu'il existe une dérivation →+ où est une chaîne

• Exemple →→
| | |
• Le non terminal S est laissé récursif puisque → → • Élimination de la
récursion gauche

Commandez les non terminaux 1, 2,… ,


Pour i=1 à n
pour j=1 à i­1
remplacer chaque production → → 1| … | par → 1|…|
fin pour
éliminer la récursion immédiate à gauche sur les productions
Fin pour
Conception du compilateur : théorie, outils 57
Machine Translated by Google

Exemple

• Commande S, A • La grammaire résultante est


• i=1 pas de récursion gauche immédiate dans →
→ ' '
|
'→ ' '
| • i=2 et j=1 remplacer →| | |
→ ,
on obtient → |
• Élimine la récursion immédiate à gauche
' '
|
'→ ' '
→ | |

Conception du compilateur : théorie, outils 58


Machine Translated by Google

Affacturage à gauche

• Une grammaire n'est pas laissée de côté lorsque le même non­terminal commence par
les mêmes symboles

• Théorème : une grammaire qui n'est pas facteur de gauche ne peut pas être LL(1)

• Facteur de gauche une grammaire


• Prenez les terminaisons autorisées et créez un nouveau non­terminal pour les représenter.
• Remplacer la production → ne 1… 1 … | où avec
≠ démarre pas , les deux règles :
•→ '
1…|
• ' →
1…

• Exemple

Conception du compilateur : théorie, outils 59


Machine Translated by Google

Des exercices

• Montrer comment éliminer la récursion gauche de chacune des grammaires


indiqué ci­dessous:
• A → Abc|ab
• ParmList → ParmList, Parm|Parm

Conception du compilateur : théorie, outils 60


Machine Translated by Google

Analyse ascendante

Conception du compilateur : théorie, outils 61


Machine Translated by Google

Motivation et présentation

• La faiblesse des techniques d'analyse LL(k) • Prédiction quelle


production utiliser, après avoir vu seulement les k premiers jetons du membre de droite • Les situations dans lesquelles
il n'est pas facile d'utiliser une grammaire LL(k)
• Grammaires récursives •
Grammaire à facteur non gauche

• Les techniques d'analyse ascendante LR(k) sont plus puissantes. • Reporter la


décision jusqu'à ce qu'elle ait vu les jetons d'entrée correspondant à tout le côté droit d'une production.

• Les règles de grammaire sont appliquées à


l'envers. • Les arbres de dérivation sont construits ou parcourus de bas en haut.

• LR(k) signifie analyse de gauche à droite, dérivation la plus à droite, anticipation de k­token.
• L indique que nous lisons l'entrée depuis la gauche. • R
indique que nous trouvons une dérivation la plus à droite.

Conception du compilateur : théorie, outils 62


Machine Translated by Google

Moteur d'analyse LR

• L'analyseur LR effectue deux types d'actions


• Shift : déplacez le jeton d'entrée vers le haut de la pile.
• Réduire : choisissez une règle de grammaire 12…;
• → en haut de la pile
pop , … 1 •
pousser X sur la pile.
• L'analyseur LR utilise un DFA (automate fini déterministe)
• Le DFA est appliqué à la pile
• Les bords du DFA sont étiquetés par les symboles (terminaux et non­terminaux).
• Quatre types d'actions étiquettent la table de transition
• sn Passage à l'état n ;

gn Aller à l'état n ;
• rk Réduire par la règle k;
• un Accepter;

Conception du compilateur : théorie, outils 63


Machine Translated by Google

Construire un DFA
'
• Augmentez la grammaire avec • S' →$
est une nouvelle variable avec dériver le symbole de départ
• Explication : l'entrée sera une phrase S complète suivie de $
• $ est le marqueur EOF

• Un élément est une règle de grammaire, combinée au point qui indique une position
dans son côté droit.
• Exemple : • ' →. $
Un état est un ensemble d'éléments

• Les opérations de base que nous avons effectuées sur les états considèrent que I
est un ensemble d'éléments et X est un symbole de grammaire (terminal ou variable)

( ) ajoute plus d'éléments à un ensemble d'éléments lorsqu'il y a un point à gauche
d'un non­terminal

( , ) déplace le point au­delà du symbole X dans tous les éléments

Conception du compilateur : théorie, outils 64


Machine Translated by Google

Calcul de la fermeture ' →$


()= →


→ .
→ → ,

← → . Exemples de fermeture

→ . →.
→.
→. ,
→.
→.
Conception du compilateur : théorie, outils 65
Machine Translated by Google

Exécution de Goto
Exemples de goto
(,)=
X →
→. .
→ .
→ .
S → .
→ .
→.
L → .
→. ,
→ .,
→.
→.

66
Conception du compilateur : théorie, outils
Machine Translated by Google

DFA de construction d'articles

'
1. Augmentez la grammaire avec un début de production auxiliaire 2. →$
Soit T l'ensemble des états vus jusqu'à présent,
3. Soit E l'ensemble des arêtes (shift ou goto) trouvées jusqu'à présent

' →
{ ({ . $ })}

→ .
,

← →

Conception du compilateur : théorie, outils 67


Machine Translated by Google

Construire la table d'analyse

• La table d'analyse LR est une table bidimensionnelle où


• Les lignes sont indexées par les états du DFA
• Les colonnes sont indexées par les terminaux et les non­terminaux
• Et les cellules contiennent l'action (shift, réduire, accepter, aller à)

• Pour chaque bord →


• Si X est un terminal, placez le décalage d'action J à la position (I,X) du tableau
• si X est un non­terminal, on met goto J en position (I,X)
'
• Pour chaque état I contenant un élément • → .$
Mettre une action d'acceptation à ( , $)
• Pour un état contenant un élément → • Cas de . (production n avec le point à la fin)
LR(0) : mettre une action de réduction de n en ( , ) pour chaque jeton Y
• Cas de SLR(1) : mettre une action de réduction de n en ( , ) pour chaque jeton Y dans FOLLOW(A)

Conception du compilateur : théorie, outils 68


Machine Translated by Google

Exemple

'
0. →$

1. →
Analyse SLR(1)
2. → Tableau

3. →

4. → ( )X , $ S L
, ( )X , $ SL
1 S3 S2 g4 1 S3 S2 g4
2 r2 r2 r2 r2 r2
2 r2 r2 r2
3 s3 s2 g7 g5 3S3 S2 g7 g5
4 Acc
Suivre(S)={$ ) ,} 4 Acc
Analyse LR(0) 5 s6 s8 Suivre(L)={) ,} 5 s6 s8
Tableau
6 r1 r1 r1 r1 r1
6 r1 r1 r1
7 r3 r3 r3 r3 r3
7 r3 r3
8 s3 s2 g9 8S3 S2 g9
9 r4 r4 r4 r4 r4 Conception du compilateur : théorie, outils 9 r4 r4 69
Machine Translated by Google

Analyser un mot

On considère le mot u= (x,x)

Conception du compilateur : théorie, outils 70


Machine Translated by Google

Limites des grammaires sans contexte

• Ne peut pas représenter la sémantique

• par exemple « chaque variable utilisée dans une instruction doit être déclarée plus tôt dans le
code"; ou "l'utilisation d'une variable doit être conforme à son type" (vérification de type)
• Nécessité d'autoriser uniquement les programmes qui satisfont à certaines conditions contextuelles

• Ne peut pas être utilisé pour générer des éléments autres que des arbres d'analyse.

par exemple, que se passerait­il si nous voulions générer du code assembleur pour le programme donné ?

Conception du compilateur : théorie, outils 71


Machine Translated by Google

Grammaires attribuées
Sémantique des langages sans contexte
Ajouter du contexte à la grammaire sans contexte

Conception du compilateur : théorie, outils 72


Machine Translated by Google

Aperçu

• Les grammaires d'attributs ont été développées pour la première fois par Donald Knuth en 1968.

• Un moyen de formaliser la sémantique d'un langage hors contexte.


• Leur application principale a été l'écriture de compilateurs. Il s'agit principalement d'un outil
utilisé par les implémenteurs de langages de programmation

• Les grammaires d'attributs peuvent remplir plusieurs fonctions utiles en spécifiant


la syntaxe et la sémantique d'un langage de programmation.
• Une grammaire d'attributs peut être utilisée pour spécifier les aspects
contextuels de la syntaxe d'un langage, comme vérifier qu'un élément a été
déclaré et que l'utilisation de l'élément est cohérente avec sa déclaration.

Conception du compilateur : théorie, outils 73


Machine Translated by Google

Actions sémantiques

• Un compilateur doit faire plus que reconnaître si une phrase appartient au langage d'une grammaire. • Il
doit faire quelque chose d'utile avec
cette phrase.
• Les actions sémantiques d'un analyseur peuvent faire des choses utiles avec les phrases qui sont
analysé.
• Les actions sémantiques sont des fragments de code de programme, écrits dans un langage de programmation
langage (Java, C, …), attaché aux productions grammaticales
• Les grammaires sont encore étendues en introduisant des grammaires attribuées
• Chacun des terminaux et non­terminaux peut avoir zéro ou plusieurs attributs.
• zéro ou plusieurs règles de calcul d'attributs sont associées à chaque règle de grammaire
• Exemples •
l'attribut d'un symbole d'entrée (un jeton lexical) pourrait être la partie valeur du jeton
• Gérer le type de chaque identifiant

Conception du compilateur : théorie, outils 74


Machine Translated by Google

Définition dirigée par la syntaxe

• Une définition dirigée par la syntaxe (SDD) connecte un ensemble de règles sémantiques à
production
• Les terminaux et les non­terminaux ont des attributs • Formellement,

un SDD=(G, Attr, R) où • G est une grammaire sans


contexte • Attr est un ensemble
d'attributs • R est un ensemble
de règles sémantiques

• Xa désigne l'attribut a attaché au symbole X (terminal ou non terminal) • Si X apparaît plusieurs fois dans
une

production .a est le LHS


0
•X
1 n
• X ,…, X sont les RHS

Conception du compilateur : théorie, outils 75


Machine Translated by Google

Exemple

• Considérons la grammaire G : Règles sémantiques des productions


→ 0 = 1
| . . +1
→ 0 1
. = .
• Écrivez les règles pour calculer le
0 = 1
nombre de a et c dans un mot . . +1
→ 0 1
. = .
0 = 1 2
. .+1 . +1
• Solution → 0 = 2
. .+ .+2
• Définir deux attributs
• nba qui détient le numéro d'un . =0

. =0
• NBC qui détient le numéro de C

Conception du compilateur : théorie, outils 76


Machine Translated by Google

Construire un arbre décoré

Arbre de dérivation Arbre de dérivation annoté (attribué)

Conception du compilateur : théorie, outils 77


Machine Translated by Google

Catégories d'attributs

• Laisser 0 → 1… être une production

• Si la règle de calcul de l'attribut de 0 est de la forme ( 0) =


1,…, )
( • Attribut synthétisé

• Si la règle de calcul de l'attribut de est de la forme ( ) =


( 0,…, , …)
• Attribut hérité
• Les terminaux ont des attributs intrinsèques
• Valeurs lexicales fournies par l'analyseur lexical

Conception du compilateur : théorie, outils 78


Machine Translated by Google

Attributs hérités

exemple
calculer le niveau d'imbrication de) dans un système de
parenthèses bien formé

Règles sémantiques des productions


' →
. =0
1
. = 0
. +1
→ 2
. = 0
.
→ .
Conception du compilateur : théorie, outils 79
Machine Translated by Google

Exercice

• Concevoir une grammaire attribuée pour évaluer les expressions arithmétiques

Productions Règles sémantiques


1. Implémentez votre solution dans
→+ 0
. = 1
.+. SableCC
→− 0
. = 1
. − . 2. Exigences supplémentaires
→ . = . Ajoutez le jeton d'identification (ID) à

→ 0 = 1 * votre grammaire pour que votre calculatrice


. . .
pourrait accepter l'expression avec
→/
0
. = 1
. /.
contient une variable comme : 3+xy/(6*z)
→ . = . Lorsque l'évaluateur rencontre un
→ . = . ID, il demande à l'utilisateur de saisir la
→() . = . valeur.

Conception du compilateur : théorie, outils 80


Machine Translated by Google

Attributs synthétisés ou hérités

• attributs synthétisés
• Les attributs prennent leurs valeurs à partir des attributs des nœuds inférieurs de l'arborescence.
• Ce type d'attributs peut être renseigné lors d'une analyse ascendante
• Attributs hérités
• Les attributs prennent leurs valeurs à partir des attributs des nœuds supérieurs de l'arborescence.
et les frères et sœurs
• L'analyse descendante est indiquée pour remplir ces attributs si et seulement si les valeurs
proviennent des nœuds supérieurs.

• Dans le cas où une grammaire contient des attributs synthétisés et hérités, le processus de
remplissage des valeurs d'attribut n'est pas simple.
• Graphiques de dépendance

Conception du compilateur : théorie, outils 81


Machine Translated by Google

Graphiques de dépendance

• Les règles sémantiques établissent des dépendances entre attributs qui peuvent être
représenté par un graphe de dépendance

• Ce graphique de dépendance détermine la manière dont les attributs peuvent être évalués.
dans les arbres d'analyse

• Pour chaque symbole X, le graphe de dépendances a un nœud pour chaque


attribut associé à X

• Une arête du nœud A au nœud B signifie que l'attribut de A est


nécessaire pour calculer l'attribut de B
• Comment différencier les attributs synthétisés des attributs hérités

Conception du compilateur : théorie, outils 82


Machine Translated by Google

Exemple 1

Productions Règles sémantiques


D → TL L.Type = T.val
L → L,id
L → identifiant

T → entier T.val = entier


T → réel T.Val = réel

Conception du compilateur : théorie, outils 83


Machine Translated by Google

Exemple 2

production action sémantique


Eh:=2*E.s+1
Sr:=Et
E(0).s:=E(1).s+E(2).s
E(0).t:=3*E(1).tE(2).t
E(1).h:=E(0).h
E(2).h:=E(0).h+4
E →nombre Es:= nombre
Et:=Eh +1
Conception du compilateur : théorie, outils 84
Machine Translated by Google

Graphique de dépendance pour les productions

Conception du compilateur : théorie, outils 85


Machine Translated by Google

Graphique de dépendances pour un arbre syntaxique

Conception du compilateur : théorie, outils 86

Vous aimerez peut-être aussi