Académique Documents
Professionnel Documents
Culture Documents
Compilateur : Théories,
Techniques et outils
Georges Edouard KOUAMOU
Ecole Nationale Supérieure d'Ingénieurs
Machine Translated by Google
Objectifs
• 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.
Contenu
• Introduction
• Analyse lexicale •
Machine à états finis •
Expressions régulières
• Jetons lexicaux
Les références
Introduction
Définition (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, …)
• L'Internet
• Navigateur Web : traduire du texte HTML en objets graphiques • Interpréteur
PHP • Systèmes de
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
Analyse lexicale
Analyse lexicale
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,
Implémentation du scanner
• 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
Estce que == deux signes égaux = = ? – Mises en œuvre efficaces
• Problème : Comment pouvonsnous spécifier les chaînes de manière infinie (ou très grande)
langue?
Langues régulières
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
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
Notation
• Il existe des variations dans la notation des expressions régulières
• Syndicat : A | B • ≡A+B
Option : A + ε • ≡Un ?
• Priorité des règles : pour une souschaî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
Expression régulière
NFA DFAE les tables
• 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.
• = Σ *| , * , =
Un état 1
1
Un État acceptant
0
un
Une transition
Représentations
0 1
q0 q0 q1
q1 q1 q0
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.
Solutions
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
• Pour une langue donnée, NFA peut être plus simple que DFA. •
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
NFA
Pour chaque type de rex, définissez un NFA
– Notation : NFA pour reexp M
DFAE
Expression régulière
un UN
B
Pour
ou
Pour l'entrée A*
Pour l'entrée AB
UN
UN B
(1+0)*1
(1+0)*
1
(1+0) Conception du compilateur : théorie, outils 33
Machine Translated by Google
1
1
0 1
ABCDHI FGHIABCD EGHIABCDJ
0
0
Exemple
• IDENTIFIANT
• SI
Des exercices
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.
• Une dérivation est la substitution d'un nonterminal 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 nonterminal 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.
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= ,
→
→+
1. Montrer que le mot 123 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
→/
→
→
→+
Dérivation gauche
→−
E=> EE=> numE=> numEE=> numnumE=> numnumnum
→
→/
Dérivation droite
→→
E=> EE=> Enum=> EEnum=> Enumnum=> numnumnum
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 nonterminaux,
et A représente un nonterminal
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 nonterminaux 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 motsclés.
• (3) (2) (1) (0)
Des exercices
Des exercices
• Écrivez une grammaire sans ambiguïté pour chacune des langues suivantes. un.
Des exercices
• Donner une grammaire linéaire correcte pour chacune des langues de Sample
Problème
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.
• L'algorithme d'analyse ascendant part du bas de l'arbre de dérivation et applique les règles de
grammaire (à l'envers).
Analyse descendante
Présentation
• Les analyseurs doivent lire non seulement les symboles du terminal mais également le marqueur de fin de
• La grammaire donnée est augmentée d'un nouveau symbole de début S' et d'un nouveau → $
'
production
• trouver l'union des ensembles Premier(x) pour chaque symbole du côté droit d'une règle,
mais arrêtezvous lorsque vous atteignez un symbole non nullable
• → et alors
Exemple
S Ab a AA →
A Sa Ac B →
B Sd
→
Récursion 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 nonterminaux qui ne commence pas par
un A
• Éliminez la récursion gauche en introduisant un nouveau nonterminal, R, et en réécrivant le
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
Exemple
Affacturage à gauche
• Une grammaire n'est pas laissée de côté lorsque le même nonterminal commence par
les mêmes symboles
• Théorème : une grammaire qui n'est pas facteur de gauche ne peut pas être LL(1)
• Exemple
Des exercices
Analyse ascendante
Motivation et présentation
• LR(k) signifie analyse de gauche à droite, dérivation la plus à droite, anticipation de ktoken.
• L indique que nous lisons l'entrée depuis la gauche. • R
indique que nous trouvons une dérivation la plus à droite.
Moteur d'analyse LR
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 nonterminal
•
( , ) déplace le point audelà du symbole X dans tous les éléments
← → . 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
'
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
' →
{ ({ . $ })}
→ .
,
←
← →
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
• 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 passeraitil si nous voulions générer du code assembleur pour le programme donné ?
Grammaires attribuées
Sémantique des langages sans contexte
Ajouter du contexte à la grammaire sans contexte
Aperçu
• Les grammaires d'attributs ont été développées pour la première fois par Donald Knuth en 1968.
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 nonterminaux 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
• Une définition dirigée par la syntaxe (SDD) connecte un ensemble de règles sémantiques à
production
• Les terminaux et les nonterminaux ont des attributs • Formellement,
• Xa désigne l'attribut a attaché au symbole X (terminal ou non terminal) • Si X apparaît plusieurs fois dans
une
Exemple
Catégories d'attributs
Attributs hérités
exemple
calculer le niveau d'imbrication de) dans un système de
parenthèses bien formé
Exercice
• 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
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
Exemple 1
Exemple 2