Théorie des langages. compilation. Elise Bonzon http://web.mi.parisdescartes.fr/ bonzon/ elise.bonzon@parisdescartes.fr 1 / 59



Documents pareils
Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Algorithmique et Programmation, IMA

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Évaluation et implémentation des langages

Traduction des Langages : Le Compilateur Micro Java


Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Cours 1 : La compilation

STAGE IREM 0- Premiers pas en Python

Interpréteur d algèbre relationnelle

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Compilation. Algorithmes d'analyse syntaxique

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Programmer en JAVA. par Tama

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Cours de Programmation 2

Initiation à l algorithmique

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Représentation d un entier en base b

Théorie de la Programmation

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

TP 1. Prise en main du langage Python

Les structures de données. Rajae El Ouazzani

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

L informatique en BCPST

OCL - Object Constraint Language

Cours d Algorithmique et de Langage C v 3.0

Note de cours. Introduction à Excel 2007

Théorie des Langages

Cours 1 : Qu est-ce que la programmation?

Chapitre I Notions de base et outils de travail

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Claude Delannoy. 3 e édition C++

Introduction à MATLAB R

LES TYPES DE DONNÉES DU LANGAGE PASCAL

LES OUTILS D ALIMENTATION DU REFERENTIEL DE DB-MAIN

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Java Licence Professionnelle CISII,

Quelques éléments de compilation en C et makefiles

Génie Logiciel avec Ada. 4 février 2013

Le langage SQL Rappels

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Algorithmique et programmation : les bases (VBA) Corrigé

Introduction au langage C

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Ingénierie Dirigée par les Modèles. Editeurs de modèles. (Eclipse Modeling Tools) Jean-Philippe Babau

Optimisation de logiciels de modélisation sur centre de calcul

Aide : publication de décisions VS

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Programmation C. Apprendre à développer des programmes simples dans le langage C

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Présentation du langage et premières fonctions

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Créer le schéma relationnel d une base de données ACCESS

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Bases de programmation. Cours 5. Structurer les données

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Rappels d architecture

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Ecole Technique «Transformation de données documentaires» Poitiers, mars Atelier 1: Sphinx. import, conversion, export de données

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Informatique Théorique : Théorie des Langages, Analyse Lexicale, Analyse Syntaxique Jean-Pierre Jouannaud Professeur

Formula Negator, Outil de négation de formule.

TP : Gestion d une image au format PGM

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Plan du cours Cours théoriques. 29 septembre 2014

Introduction à l algorithmique et à la programmation M1102 CM n 3

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

Générer un analyseur avec Flex&Bison

UE Programmation Impérative Licence 2ème Année

Arbres binaires de recherche

Initiation à la Programmation en Logique avec SISCtus Prolog

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

LE PROCESSUS ( la machine) la fonction f. ( On lit : «fonction f qui à x associe f (x)» )

V- Manipulations de nombres en binaire

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

ALGORITHMIQUE ET PROGRAMMATION En C

Rappels sur les suites - Algorithme

Programmation en langage C

Générer du code à partir d une description de haut niveau

Sage 100 CRM - Guide de la Fusion Avancée Version 8. Mise à jour : 2015 version 8

1 Recherche en table par balayage

Analyse de sécurité de logiciels système par typage statique

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Transcription:

et compilation Elise Bonzon http://web.mi.parisdescartes.fr/ bonzon/ elise.bonzon@parisdescartes.fr 1 / 59

et compilation et compilation Structure d un compilateur Analyse lexicale Analyse syntaxique Analyse sémantique Conclusion 2 / 59

et compilation et compilation Structure d un compilateur Analyse lexicale Analyse syntaxique Analyse sémantique Conclusion 3 / 59

et compilation Un compilateur, c est quoi? Un compilateur est un programme qui prend en entrée une donnée textuelle source (programme, donnée xml, fichier de configuration, etc) la reconnaît (l analyse) pour vérifier sa correction émet éventuellement un message d erreur le traduit dans un langage cible programme source Compilateur programme cible messages d erreur 4 / 59

et compilation Les différentes étapes de la compilation Programme source Analyseur lexical Analyseur syntaxique Table des symboles Analyseur sémantique Générateur de code intermédiaire Erreurs Optimisateur de code Générateur de code Programme cible 5 / 59

et compilation Les différentes étapes de la compilation Partie analyse: sépare les constituants Programme source du prog. source et produit une représentation intermédiaire Analyseur lexical Analyseur syntaxique Table des symboles Analyseur sémantique Générateur de code intermédiaire Erreurs Optimisateur de code Générateur de code Programme cible 5 / 59

et compilation Les différentes étapes de la compilation Partie analyse: sépare les constituants Programme source du prog. source et produit une représentation intermédiaire Analyseur lexical Analyseur syntaxique Table des symboles Analyseur sémantique Générateur de code intermédiaire Erreurs Optimisateur de code Générateur de code Programme cible Partie synthèse: génère le prog. cible à partir de la représentation intermédiaire 5 / 59

et compilation Analyse lexicale Programme source Analyseur lexical Analyseur syntaxique Table des symboles Analyseur sémantique Générateur de code intermédiaire Erreurs Optimisateur de code Générateur de code Programme cible 6 / 59

et compilation Analyse lexicale Seul module au contact avec le texte source Son but est de reconnaître les unités lexicales ou lexèmes les identificateurs et les mots clefs du langage l affectation et les opérateurs Utilise des expressions régulières : automates finis identificateur ab := y * x + 20 affectation operateur nombre 7 / 59

et compilation Analyse syntaxique Programme source Analyseur lexical Analyseur syntaxique Table des symboles Analyseur sémantique Générateur de code intermédiaire Erreurs Optimisateur de code Générateur de code Programme cible 8 / 59

et compilation Analyse syntaxique Regroupe les unités lexicales en structures grammaticales en suivant les règles figurant dans une grammaire Résultat représenté par un arbre syntaxique La structure hiérarchique d un programme est exprimée à l aide de règles Tout identificateur est une expression Tout nombre est une expression Si expr1 et expr2 sont des expressions alors expr1 expr2 est une expression Grammaires hors contexte : automates à pile := ab + * 20 y x 9 / 59

et compilation Analyse sémantique Programme source Analyseur lexical Analyseur syntaxique Table des symboles Analyseur sémantique Générateur de code intermédiaire Erreurs Optimisateur de code Générateur de code Programme cible 10 / 59

et compilation Analyse sémantique Vérifie la présence d erreurs d ordre sémantique Vérification de typage Vérification des déclarations Par exemple, si x et y sont des réels : := ab + * conversion entier -> réel y x 20 11 / 59

et compilation Partie synthèse Programme source Analyseur lexical Analyseur syntaxique Table des symboles Analyseur sémantique Générateur de code intermédiaire Erreurs Optimisateur de code Générateur de code Programme cible 12 / 59

et compilation Partie synthèse Génération du code intermédiaire Utilisation de variables temporaires Choix de l ordre pour faire un calcul Optimisation du code Amélioration du code intermédiaire Réduction du nombre de variables et d instructions Génération du code Choix des emplacements mémoire pour les variables Assignation de variables aux registres 13 / 59

et compilation Table des symboles Programme source Analyseur lexical Analyseur syntaxique Table des symboles Analyseur sémantique Générateur de code intermédiaire Erreurs Optimisateur de code Générateur de code Programme cible 14 / 59

et compilation Table des symboles Enregistre les identifiants et les attributs (emplacement mémoire, type, portée) Chaque identifiant (variable) a une entrée dans la table des symboles L analyseur lexical crée une entrée dans la table des symboles à chaque fois qu il rencontre un nouvel identificateur Par contre, les attributs seront calculés plus tard L analyseur sémantique se sert de la table des symboles pour vérifier la concordance des types 15 / 59

et compilation Détection des erreurs Programme source Analyseur lexical Analyseur syntaxique Table des symboles Analyseur sémantique Générateur de code intermédiaire Erreurs Optimisateur de code Générateur de code Programme cible 16 / 59

et compilation Détection des erreurs Erreur lexicale : le flot de caractères n est pas reconnu Erreur syntaxique : construction non reconnue par le langage Erreur sémantique : problème de typage,... 17 / 59

et compilation et compilation Structure d un compilateur Analyse lexicale Analyse syntaxique Analyse sémantique Conclusion 18 / 59

et compilation Analyseur lexical et analyseur syntaxique L analyse lexicale produit des lexèmes En général à la volée à la demande de l analyseur syntaxique L analyseur syntaxique demande le prochain lexème à l analyseur lexical, qui le reconnaît et retourne un code identifiant ce lexème On pourrait imaginer que l analyse lexicale travaille indépendamment et fournisse une suite de lexèmes mais on n a pas besoin, en général, d avoir reconnu tous les lexèmes pour faire l analyse syntaxique : la connaissance du lexème courant suffit pour la plupart des méthodes utilisées et malheureusement, pour certains langages (C notamment), la reconnaissance d un lexème dépend du contexte grammatical dans lequel il se trouve 19 / 59

et compilation Analyse lexicale Chaque lexème est un mot d un langage Dans la plupart des cas, langage qui peut être représenté par une expression régulière, par exemple ((A Z) + (a z))((a Z) + (a z) + (0 9)) pour reconnaître des identificateurs du genre X, Compteur, i3, R2D2,... Langage fini pour de nombreux lexèmes : +, ==, for,... L analyseur lexical est donc un (gros) automate fini déterministe qui reconnaît l union des langages des lexèmes un état terminal correspond à la reconnaissance d un mot d un des langages des lexèmes 20 / 59

et compilation Fragment d automate lexical q 2 f a-z q 1 a-z sauf f q 3 a-z i a-z sauf i 0-9 q 0 0-9 q. 4 q 0-9 5 q 6 = 0-9 q = 7 q 8 21 / 59

et compilation Analyse lexicale Analyseur lexical : En général pas tout à fait un automate déterministe Certains lexèmes sont préfixes d un autre +, +=, ++ ; = et == mots-clés et identificateurs (for et forme) entiers et réels (3 et 3.14) Le principe est de reconnaître le mot le plus long Un état terminal n implique donc pas toujours l arrêt de l automate : il peut continuer, et éventuellement revenir en arrière au dernier état final rencontré 22 / 59

et compilation Reconnaissance contextuelle Il existe des langages où une forme lexicale peut correspondre à différents lexèmes selon le contexte selon le contexte gauche : par exemple, if reconnu comme mot-clé uniquement s il est au début d une instruction selon le contexte droit : par exemple if reconnu comme mot-clé uniquement s il est suivi d une parenthèse Combinaison des deux 23 / 59

et compilation Problèmes de la reconnaissance contextuelle Dans des langages mal définis Pour les langages de programmation, dans des langages anciens (Fortran, partiellement C,...) Ils ne peuvent en général pas être résolus par le seul analyseur lexical : les contextes sont le plus souvent des langages non-contextuels reconnus par l analyseur syntaxique Donc forte interaction entre les deux analyseurs Entraine des problèmes de lisibilité, de fiabilité et des difficultés à la maintenance et aux extensions C est pourquoi les langages modernes de programmation évitent ces questions de reconnaissance contextuelle Mais pas les langages de script, de description,... conçus la plupart du temps par des non spécialistes des langages 24 / 59

et compilation Exemple de problème de la reconnaissance contextuelle en Fortran, les espaces sont non significatifs DO12I = 1.25 : identificateur DO12I, opérateur d affectation =, réel 1.25 DO12I = 1,25 : mot-clé DO, etiquette 12, variable I : boucle qui se termine à l énoncé étiqueté 12 pour i allant de 1 à 25 d après la légende, on aurait perdu une fusée du projet Mercury à cause d un. à la place d une, (à moins que ce ne soit l inverse...) Dans la plupart des langages de programmation actuels, les espaces sont significatifs, et les mots-clés sont réservés 25 / 59

et compilation Générateurs d analyseurs lexicaux Langage C : lex ou flex Langage Ada : Alex Langage Java : Jflex Langage OCaml : OCamllex 26 / 59

et compilation Construire un analyseur lexical avec lex programme source (f)lex nom.l compilateur (f)lex lex nom.l flex nom.l nom.yy.c nom.yy.c compilateur C gcc nom.yy.c -ll gcc nom.yy.c -lfl a.out 27 / 59

et compilation Spécifications en lex déclarations %% règles de traduction %% procédures auxiliaires 28 / 59

et compilation Déclarations La section des déclarations comprend des déclarations de variables, constantes littérales définitions régulières Une constante littérale est un identificateur qui est déclaré pour représenter une constante Une définition régulière permet d associer un nom à une expression régulière 29 / 59

et compilation Règles de traduction Les règles de traduction sont des instructions de la forme : exp 1 action 1 exp 2 action 2... exp n action n chaque exp i est une expression régulière chaque action i est une suite d instruction en C qui décrit quelle action l analyseur lexical devrait réaliser quand un lexème concorde avec le modèle exp i Les procédures auxilliaires sont les fonctions facultatives qui pourraient être utiles dans les actions. 30 / 59

et compilation Analyseur lexical Analyseur lexical activé par l analyseur syntaxique : Lit le texte d entrée, caractère par caractère Cherche le plus long préfixe du texte d entrée qui corresponde à l une des expressions régulières exp i Exécute alors l action action i Action : rend le contrôle à l analyseur syntaxique Sinon, l analyseur lexical continue à chercher d autres lexèmes jusqu à ce qu une action rende le contrôle à l analyseur syntaxique La recherche répétée de lexèmes jusqu à un retour explicite permet à l analyseur lexical de traiter les espaces et les commentaires de manière simple Seule information retournée à l analyseur syntaxique : l unité lexicale Pour passer une valeur d attribut donnant des informations sur le lexème, on peut l affecter à une variable globale appelée yylval. 31 / 59

et compilation Tableau des expressions régulières (1/2) expression reconnaît exemple c tout caractère c qui n est pas un opérateur a \c caractère littéral c \+ s la chaîne de caractère s abc* r 1 r 2 r 1 suivie de r 2 ab. tout caractère sauf fin de ligne a.b ˆ début de ligne ^abc $ fin de ligne abc$ [s] tout caractère appartenant à s [s] [^s] tout caractère n appartenant pas à s [^abc] r 0 ou plusieurs occurences de r a r + 1 ou plusieurs occurences de r a + r? 0 ou 1 occurence de r a? 32 / 59

et compilation Tableau des expressions régulières (2/2) expression reconnaît exemple r{m} m occurences de r a{3} r{m,n} entre m et n occurences de r a{3,8} r 1 r 2 r 1 ou r 2 a b r 1 /r 2 r 1 si elle est suivie de r 2 abc/123 (r) r (a b) \n retour à la ligne \t tabulation 33 / 59

et compilation Exemple déclarations %{ %} /* définitions des constantes littérales */ PPQ, PPE, EGA, DIF, PGQ, PGE, SI, ALORS, SINON, ID, NB, OPREL /* définitions régulières */ delim [ \n\t] bl {delim} + lettre [A-Za-z] chiffre [0-9] id {lettre} + ({lettre} {chiffre}) nombre {chiffre} + (\.{chiffre} + )? (E[+\-]? {chiffre} + )? %% 34 / 59

et compilation Exemple règles de traduction {bl} {/* pas d action et pas de retour */} si {return(si);} alors {return(alors);} sinon {return(sinon);} {id} {yylval = RangerId(); return(id);} {nombre} {yylval = RangerNb(); return(nb);} < {yylval = PPQ; return(oprel);} <= {yylval = PPE; return(oprel);} = {yylval = EGA; return(oprel);} <> {yylval = DIF; return(oprel);} > {yylval = PGQ; return(oprel);} >= {yylval = PGE; return(oprel);} %% 35 / 59

et compilation Exemple procédures auxiliaires RangerId() { /* Procédure pour ranger dans la table des symboles le lexème dont le premier caractère est pointé par yytext et dont la longueur est yyleng et retourner un pointeur sur son entrée */ } RangerNb() { \begin{block} /* procédure similaire pour ranger un lexème qui est un nombre */ } 36 / 59

et compilation et compilation Structure d un compilateur Analyse lexicale Analyse syntaxique Analyse sémantique Conclusion 37 / 59

et compilation Qu est ce que l analyse syntaxique? L analyse syntaxique a pour but : de vérifier que le texte d entrée est conforme à la grammaire d indiquer les erreurs de syntaxe de construire une représentation intermédiaire pour les autres modules du compilateur arbre de syntaxe abstraite, utilisé par la suite de la compilation Ne s occupe pas des aspects contextuels de la syntaxe par exemple détecter l erreur dans int i;...; i = abcd ; c est le rôle de l analyse sémantique, qui travaille sur la représentation intermédiaire Représentation unique du texte source l analyse doit être déterministe, si possible linéaire (éviter notamment les retours en arrière) 38 / 59

et compilation Types d analyseurs syntaxiques Analyseur syntaxique descendant, ou analyseur prédictif Construit l arbre de dérivation à partir de sa racine et en effectuant des dérivations en considérant la tête des règles de production et en faisant des dérivations les plus à gauche Famille des analyseurs LL (left scanning, leftmost derivation) JavaCC, ANTLR, LLGen,... Analyseur syntaxique ascendant ou par décalage-réduction Construit l arbre de dérivation à partir de ses feuilles et en effectuant des dérivations en considérant la partie droite des règles de production et en faisant des dérivations les plus à gauche Famille des analyseurs LR (left scanning, rightmost derivation) YACC/Bison 39 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt act bt 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt accbbadbc 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt accbbadbc Analyse LR : accbbadbc 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt accbbadbc Analyse LR : accbbadbc 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt accbbadbc Analyse LR : accbbadbc act bbadbc 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt accbbadbc Analyse LR : accbbadbc actbbadbc asbbadbc 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt accbbadbc Analyse LR : accbbadbc actbbadbc asbbadbc asbbasbc 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt accbbadbc Analyse LR : accbbadbc actbbadbc asbbadbc asbbasbc asbbasbt 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt accbbadbc Analyse LR : accbbadbc actbbadbc asbbadbc asbbasbc asbbasbt asbbs 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt accbbadbc Analyse LR : accbbadbc actbbadbc asbbadbc asbbasbc asbbasbt asbbs asbt 40 / 59

et compilation Exemple Soit G = V, Σ, P, S avec Σ = {a, b, c, d} V \ Σ = {S, T } 6 règles de production : S asbt ct d T at bs c Soit w = accbbadbc Analyse LL : S asbt actbt accbt accbbs accbbasbt accbbadbt accbbadbc Analyse LR : accbbadbc actbbadbc asbbadbc asbbasbc asbbasbt asbbs asbt S 40 / 59

et compilation Constructeur d analyseur LR yacc/bison yacc : Yet Another Compiler Compiler (Unix) bison en version libre (Linux) 1ère version dans les années 70 par Stephen Curtis Johnson Prend une grammaire hors contexte en entrée, produit l analyseur correspondant Le programme produit est en langage C 41 / 59

et compilation Construire un analyseur syntaxique avec yacc spécification yacc/bison nom.y compilateur yacc/bison yacc nom.y bison nom.y nom.tab.c nom.tab.c compilateur C gcc nom.tab.c -ly a.out 42 / 59

et compilation Spécifications en yacc déclarations %% règles de production et routines sémantiques %% routines C et bloc principal 43 / 59

et compilation Déclarations La section des déclarations contient 2 parties optionnelles 1ère partie : déclarations en C délimitées par %{ et %} déclarations des variables temporaires utilisées par les règles de traduction procédures de la deuxième et troisième section 2nde partie : déclarations d unités lexicales de la grammaire Symboles terminaux : unités lexicales, déclarées par %token %token NOMBRE caractères, entre quotes : a, + Symboles non terminaux : chaînes de caractères non déclarées comme unités lexicales 44 / 59

et compilation Règles de production Une règle de production de la grammaire du type : non-terminal alt 1 alt 2... alt n s écrirait en yacc : non-terminal : alt 1 {action sémantique 1} alt 2 {action sémantique 2}... alt n {action sémantique n} ; La partie gauche de la première règle de production est l axiome de la grammaire 45 / 59

et compilation Actions sémantiques Une action sémantique est une suite d instructions en C Elles sont exécutées à chaque fois qu il y a réduction par la production associée Syntaxe d une action sémantique : Symbole $$ référence la valeur de l attribut associé au non terminal de la partie gauche de la règle Symbole $i représente la valeur associée au ième symbole (terminal ou non) en partie droite de la règle. Exemple : expr : expr + term {$$ = $1 + $3} ; 46 / 59

et compilation Routines annexes En langage C Un analyseur lexical nommé yylex() doit être fourni D autres procédures comme les routines de récupération d erreur peuvent être ajoutées si nécessaire L analyseur lexical yylex() produit des couples formés d une unité lexicale et de la valeur de l attribut associé Si une unité lexicale est retournée, elle doit être déclarée dans la première section de la spécification yacc La valeur de l attribut associée à une unité lexicale est communiquée à l analyseur syntaxique par l intermédiaire de la variable yylval prédéfinie dans yacc 47 / 59

et compilation Exemple Grammaire des expressions arithmétiques : E E + T T T T F F F (E) chiffre L unité lexicale chiffre désigne un chiffre unique compris entre 0 et 9 48 / 59

et compilation Exemple déclarations et règles de production %{ #include <ctype.h> %} %token CHIFFRES %% ligne : expr \n {printf(%d\n, $1);} ; expr : expr + term {$$ = $1 + $3;} term ; term : term * facteur {$$ = $1 * $3;} facteur ; facteur : ( expr ) {$$ = $2;} CHIFFRE ; %% 49 / 59

et compilation Exemple Routines annexes yylex() { int c; c = getchar(); if (isdigit(c)) { yyval = c - 0 ; return CHIFFRE; } return c } 50 / 59

et compilation Utilisation conjointe de lex et yacc lex a été conçu pour produire des analyseurs lexicaux qui peuvent être utilisés avec des analyseurs syntaxiques faits avec yacc Pour utiliser lex, il faut remplacer la routine yylex() par la clause : #include "lex.yy.c" Spécifier chaque action lex de façon à ce qu elle retourne un terminal connu de yacc 51 / 59

et compilation Utilisation conjointe de lex et yacc Spécification lex : fichier nom.l Spécification yacc : fichier synt.y Compilation : lex nom.l yacc synt.y gcc -ly -ll y.tab.c On obtient un exécutable a.out qui permet de traduire le langage désiré 52 / 59

et compilation et compilation Structure d un compilateur Analyse lexicale Analyse syntaxique Analyse sémantique Conclusion 53 / 59

et compilation Analyse sémantique - pourquoi? Correction syntaxique insuffisante Exemple : 3 + true > 2 syntaxiquement correct Nécessité d une analyse sémantique 54 / 59

et compilation Analyse sémantique - c est quoi? Dans le compilateur d un langage de programmation : Calcul d un arbre abstrait Décoré par des informations qui préparent la génération de code (ex : adresses mémoire) Vérifications sémantiques : de type, des déclarations, etc. Applications de traitement de données textuelles : calculs divers. 55 / 59

et compilation Analyse sémantique - comment? L analyse sémantique calcule des données (ex : types, arbres) Comment exprimer ces calculs? Le plus naturel est de le faire en fonction de sa grammaire : on parle de traduction dirigée par la syntaxe On enrichit les grammaires algébriques par 2 concepts : données calculs et on obtient une grammaire attribuée 56 / 59

et compilation Grammaire attribuée, informellement C est une grammaire algébrique, plus : des attributs (les données) associés aux terminaux et non-terminaux des règles (ou actions sémantiques) associées aux productions (les calculs des données) Exemple : E E + T {E 0.val = E 1.val + T.val} 57 / 59

et compilation et compilation Structure d un compilateur Analyse lexicale Analyse syntaxique Analyse sémantique Conclusion 58 / 59

et compilation Conclusion Partie analyse: sépare les constituants Programme source du prog. source et produit une représentation intermédiaire Analyseur lexical Analyseur syntaxique Table des symboles Analyseur sémantique Générateur de code intermédiaire Erreurs Optimisateur de code Générateur de code Partie synthèse: génère le prog. cible à Programme cible partir de la représentation intermédiaire 59 / 59