Compilation. Introduction à la compilation. Termes Phases d'un compilateur Importance des grammaires Méthodes d'analyse. Termes. Termes.



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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmation assembleur : aperçu

Compilation (INF 564)

Évaluation et implémentation des langages

Les structures de données. Rajae El Ouazzani

Cours 1 : La compilation

Structure d un programme

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Architecture des ordinateurs

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

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


EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

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

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

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

Cours de Programmation 2

Cours d Algorithmique et de Langage C v 3.0

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

Programmation Web. Madalina Croitoru IUT Montpellier

Cours 1 : Qu est-ce que la programmation?

Théorie de la Programmation

Conception de circuits numériques et architecture des ordinateurs

Logiciel de base. Première année ENSIMAG

ACTIVITÉ DE PROGRAMMATION

Logiciel Libre Cours 2 Fondements: Programmation

Formula Negator, Outil de négation de formule.

Représentation d un entier en base b

Théorie des Langages

SSTIC Désobfuscation automatique de binaires. Alexandre Gazet. Yoann Guillot. Et autres idyles bucoliques...

Traduction des Langages : Le Compilateur Micro Java

Utilisation de l analyse statique comme outil d aide au développement. par. Yves Gauthier

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

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

Arbres binaires de recherche

OCL - Object Constraint Language

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

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

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

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

CH.6 Propriétés des langages non contextuels

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

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

Initiation à l algorithmique

Gestion mémoire et Représentation intermédiaire

Machines virtuelles Cours 1 : Introduction

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

Programmer en JAVA. par Tama

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

Conception. Génie Logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 17/04/2007

Architecture des ordinateurs : Programmation des processeurs avec l'environnement «y86» (INF155)

Java Licence Professionnelle CISII,

TP 1. Prise en main du langage Python

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

Recherche dans un tableau

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

Notions fondamentales du langage C# Version 1.0

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

Métriques de performance pour les algorithmes et programmes parallèles

UE C avancé cours 1: introduction et révisions

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Claude Delannoy. 3 e édition C++

Introduction au langage C

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Rappels sur les suites - Algorithme

Éléments de programmation et introduction à Java

programmation S initier à la la Avec des exemples en C, C++, C#, Java et PHP Avec des exemples en C, C++, C#, Java et PHP Claude Delannoy

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

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

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

Cours de Master Recherche

Annexe : La Programmation Informatique

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Chapitre I Notions de base et outils de travail

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

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

Interpréteur d algèbre relationnelle

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Conventions d écriture et outils de mise au point

Algorithmique et Programmation, IMA

DU BINAIRE AU MICROPROCESSEUR - D ANGELIS CIRCUITS CONFIGURABLES NOTION DE PROGRAMMATION

Pourquoi l apprentissage?

Grammaires d unification

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Classes et Objets en Ocaml.

Préparation à l examen EFA en Macro

Rappels d architecture

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

MIS 102 Initiation à l Informatique

ALGORITHMIQUE ET PROGRAMMATION En C

La mémoire. Un ordinateur. L'octet. Le bit

Algorithmique et programmation : les bases (VBA) Corrigé

Chapitre VI- La validation de la composition.

PHP 5.4 Développez un site web dynamique et interactif

Transcription:

Compilation Enseignants : Stéphane Talbot Miguel Tomasena Volume horaire : 10.5 C / 12 TD / 12 TP langage source Traduction langage cible Contenu : Introduction à la compilation Analyse Lexicale Analyse Syntaxique Analyse Sémantique Production de code Optimisation 1 2 Références : Compilers : Principles, Techniques and Tools (dragon book). Alfred V. Aho, Ravi Sethi, Jeffrey. D. Ullman, Addison-Wesley, 2ème édition 2007. Programming Language processors in Java. D. Watt & D. Brown, Prentice-Hall, 2000. Cours de compilation. Luc Maranget. Sur le Web. JFlex - The Fast Scanner Generator for Java. Sur le Web. CUP Parser Generator for Java. Sur le Web. Compilation Introduction à la compilation Phases d'un compilateur Importance des grammaires Méthodes d'analyse 3 4 Compilateur : programme qui traduit d'un langage source vers un langage cible, en signalant d éventuelles erreurs Terminologie : La Syntaxe régit la forme, la structure d'une phrase. Exemple : if (35 ==9) print ("bravo ") Deux niveaux syntaxiques peuvent être cités : Lexique : forme des symboles terminaux (les mots) Syntaxique : forme d une suite de terminaux 5 La compilation concerne : Langages informatiques Architecture de machines Théorie des langages Algorithmique 6 La Sémantique régit la signification. Exemple d erreur sémantique : if (3 == false) print ("bravo ")

Interpréteur : interpréter c est parcourir un graphe (structure de données) dont les nœuds sont les instructions. Un interprète exécute lui même les instruction du programme. Compilateur : Un compilateur est un traducteur qui permet de transformer un programme écrit dans un langage L1 (source) en un autre programme écrit dans L2 (cible). L1 L2 7 Les langages interprétés sont souvent plus simples et flexibles que les langages compilés. Exemples de langages interprétées : JavaScript, PHP, BASIC, scheme, CaML, LISP, Perl, Python, Prolog. 8 L2 peut être un langage intermédiaire, assembleur ou un langage d une machine abstraite. Exemples de langages compilés : C, C, ADA, Pascal, Java. Le P-code concerne à la fois la compilation et l interprétation Le code source est traduit (compilé) dans une forme binaire compacte (pseudo-code ou p-code) qui n'est pas encore du code machine. Lors de l exécution le P-code est interprété. Objectifs d'un Compilateur Qu attend-on d un compilateur? La correction : le programme compilé doit représenter le même calcul que le programme original. Il est équivalent. Par exemple en Java le source est compilé pour obtenir un fichier (.class) "byte code" qui sera interprété par une machine virtuelle. L efficacité : le compilateur doit produire un code qui s exécutera aussi rapidement que possible. Les interpréteurs de P-code peuvent être relativement petits et rapides, le P-code peut s'exécuter presque aussi rapidement que du binaire. 9 10 Objectifs d'un Compilateur Qu attend-on d un compilateur? La détection des erreurs. Exemples d'erreurs : Identificateurs mal formés, commentaires non fermés Constructions syntaxiques incorrectes Identificateurs non déclarés Expressions mal typées : if 3 then "toto" else 4.5 Références non instanciées Erreurs de Syntaxe. Erreurs détectées à la compilation, de nature statique. Ecriture d'un compilateur : Bootstrap L écriture d un compilateur est une tâche complexe, le programmeur a intérêt à utiliser un langage de haut niveau. La plupart des compilateurs sont écrits en langage de haut niveau et non en assembleur. Si on ne dispose pas d un langage de haut niveau, alors la stratégie de «programme amorce» (bootstrap) peut s appliquer. 11 Erreurs d'exécution. Erreurs détectées à l exécution, de nature dynamiques (division par zéro, dépassement des bornes d'un tableau, etc). 12

Bootstrap Stratégie de bootstrap. Si on veut un compilateur de L, on écrit d abord un compilateur pour le sous-ensemble L avec l assembleur M. Compilation T-diagramme schématisant un traducteur de L vers M réalisé en M : L M M Phases d'un compilateur Le compilateur ainsi réalisé servira à la construction d un compilateur de L. L M L L M M Résultat L M M 13 14 Phases d'un compilateur : langage source Analyse lexicale Structure d un compilateur Analyse syntaxique Analyse sémantique Génération de code langage cible Structure d un compilateur Analyse sémantique : analyse l arbre de syntaxe abstraite pour calculer de nouvelles informations permettant de : Rejeter des programmes incorrects (portée, typage ) Préparer la phase de génération de code (organisation de l environnement, construction de la table de symboles, résolution de la surcharge ) 15 Analyse lexicale : traduit une suite de caractères en suite de mots, tokens, ou unités lexicales. Analyse syntaxique (ou grammaticale) : transforme une suite d'unités lexicales en un arbre représentant la structure de la phrase. Gestion de la table des symboles Arbre de syntaxe abstraite : Structure intermédiaire avant l'analyse sémantique. Représente les dépendances sémantiques. 16 Génération de code : transformation l'arbre syntaxique abstrait enrichi d'informations sémantiques en code machine ou assembleur. Choix des instructions à émettre. Allocation de registres : association entre les idéntifiants et les registres du processeur. Optimisation. Exemple : let p = i v * 60 Analyse lexicale consiste à identifier les tokens ou unités lexicales. Token Unité lexicale let mot clé position identificateur (id1) = affectation initial identificateur (id2) addition vitesse identificateur (id3) produit 60 entier 17 18 Table de symboles. Le compilateur doit garder trace des noms de variables et les information correspondantes : mémoire réservée, type, portée, pour les sous-programmes : nombre et type des paramètres, mode de transmission de chacun, type du résultat. let p = i v * 60 Table de symboles Adresse Symbole Informations id1 p int id2 i int id3 v int

let Analyse syntaxique (parser) vérifie que l ordre des unités lexicales correspond au langage (à sa grammaire) et produit un arbre syntaxique (de dérivation). let p = i v * 60 IDENT p = terme IDENT i opbin terme IDENT LET IDENT '=' opbin * nb 60 Arbre de dérivation :vs: arbre abstrait L arbre de dérivation produit par l analyse syntaxique possède de nombreux nœuds superflus. La grammaire peut comporter de règles dont le but est de simplifier l analyse syntaxique. Un arbre abstrait constitue une structure plus naturelle entre l analyse syntaxique et l analyse sémantique, il ne garde que les parties nécessaires. L arbre abstrait peut se construire lors de l analyse syntaxique, en associant à toute règle de la grammaire une action sémantique. Ou bien à partir de l'arbre de dérivation. 19 v 20 Arbre abstrait i, v i, sont v sont des déjà entiers précédemment initialisées (déclarés) affectation p i * let p = i v * 60 Les types sont cohérent v 60 Génération de code intermédiaire. Description d'une machine à registres : 8 registres (eax, ebx, ecx, edx, epb, esp, eflags, eip) : eax, ebx, ecx, edx sont des registres généraux : ebp et esp servent à gérer la pile (base et sommet de la pile). eflags registre d état. eip pointeur d instruction. 21 Analyse sémantique : Résolution des noms. Construction d'une table des symboles en associant des étiquettes aux identifiants. Vérification de la cohérence de types. Vérification des initialisations. Certains compilateurs signalent comme erreur la non-affectation initiale d'une variable locale. 22 Instructions de la forme : op dest,source op dest op Qqs instructions : add, sub, mul, div, mov, push, pop, jmp, jl, etc. 23 Code généré, exemple : DATA SEGMENT p DD i DD i v DD let p = i v * 60 DATA v DD ENDS déclaration Instructions de données précédentes. DATA CODE ENDS SEGMENT On mets i dans la pile * CODE... SEGMENT...,i mov eax,i eax,v mov eax,v eax,60 multiplication mov,60 ebx push eax pop mul ebx eax,ebx pop eax mul eax,ebx pop ebx affectation add eax, ebx mov p, eax CODE ENDS v 60 24 Optimisation. Il existe une grande diversité de types d'optimisation. Par exemple, dans le code précédent, il est inutile d'empiler pour dépiler par la suite : pop ebx add eax, ebx mov p, eax pop ebx add eax, ebx mov p, eax

Autre phases de compilation Préprocesseur. Transformations sur un code source, avant la compilation. Prise en compte de macros (#define) et des inclusions de fichiers (#include). Assembleur. Certain compilateurs produisent du code en langage d assembleur. Il faut donc produire du code machine "translatable". Chargeur. Le code "translatable" est modifié à absolu et placé en mémoire aux emplacements appropriés. Relieur (éditeur des liens). Il permet de constituer un programme unique à partir de plusieurs fichiers contenant du code "translatable". Partie frontale ou d Analyse. Phases qui dépendent du langage source : lexicale, syntaxique. Partie finale ou de Synthèse. Phases qui dépendent de la machine cible. langage source Regroupement de phases Partie frontale (analyse) code intermédiaire Partie finale (synthèse) --> On peut être amené a écrire seulement une de ces deux parties. Passes : nombre de lectures du fichier source (une en général). Compromis entre nombre de passes et la mémoire nécessaire. langage cible 25 26 Compilation Importance des grammaires Partie frontale d un compilateur Description d un langage source : Syntaxe : grammaire non contextuelle. Sémantique : descriptions plus ou moins formelles ou des exemples. Une grammaire non contextuelle permet de : Spécifier la syntaxe Guider la traduction : traduction dirigée par la syntaxe. Très utile pour organiser la partie frontale. La traduction dirigée par la syntaxe est une combinaison d un analyseur syntaxique et d un générateur de code intermédiaire. 27 28 Expression suite de caractères 29 Analyse lexicale Grammaire suite d unités lexicales Traduction dirigée par la syntaxe Représentation intermédiaire L ensemble de phrases syntaxiquement correctes d un langage est décrit par une grammaire. Une grammaire est un quadruplet G = (V T,V N, S 0, P) où V T est l ensemble de symboles terminaux (unités lexicales), V N est l ensemble de symboles non terminaux, S 0 V N est l axiome ou symbole de départ, P est l ensemble de productions (règles de grammaire) de la forme 30 Grammaire Une phrase générée par la grammaire G est obtenue en partant du symbole initial et en appliquant des productions P jusqu'à l'obtention des terminaux. Le langage L(G) est l ensemble de toutes les phrases que l on peut générer avec G. Formellement, on écrit : L(G) = { w V t * S 0 * w } Exemple V T = {il, elle, est, boit, vite, beau} V N = {<pronom>, <verbe>, <adj>, <phrase>} S 0 = <phrase> P = { <phrase> <pronom> <verbe> <adj>, <pronom> il elle, <verbe> est boit, <adj> vite beau } Rmq : certaines phrases n ont pas de sens (il boit beau)

31 Grammaire Hiérarchie des grammaires (Chomsky). type nom grammaire 3 régulières ou rationnelle 2 non contextuelle ou algébrique forme des règles A wb A w structures produites exemple typique modèle équivalent peignes a n automate fini A arbres a n b n réseau de transition récursif 1 contextuelle A a n b n c n existe mais compliqué 0 générale quelconque machines de Turing où Voir l'exemple précédant A et B sont des non terminaux Exercice : écrire les grammaires w est un terminal et les automates correspondants, et sont des séquences de terminaux ou non terminaux et ε 32 Exemple de notation : <bloc> begin <liste_opt_instr> end <liste_opt_instr> <liste_instr> Chaîne vide <liste_instr> <liste_instr> ; <intr> <intr> dérivation :- application de plusieurs productions successives Arbre syntaxique (ou de dérivation) Illustre la manière dont l axiome se dérive en une chaîne du langage. Représentation graphique d une suite de dérivations Propriétés d un Arbre syntaxique : 1. La racine est étiquetée par l axiome 2. Chaque feuille est étiquetée par un terminal (u.lexicale) ou par 3. Chaque nœud intérieur est étiqueté par un non-terminal 4. Si A est le non-terminal d un nœud et ses fils sont X1,.., Xn alors A X1,..,Xn est une production 33 Grammaire ambiguë : s'il existe plus d'un arbre pour une même phrase. Dans la compilation on besoin de grammaires non ambigües (ou des règles pour résoudre l ambigüité). On peut être amené à réécrire une grammaire pour éviter les ambigüités. Exemple de grammaire ambiguë : - 0 1 2 9 Arbres pour 9 5 2-9 5 2 9-5 2 34 Règles pour résoudre l ambiguïté : 1. Associativité des opérateurs : convention d'évaluation Associativité à gauche Associativité à droite Ex d'opérateurs :, -, *, / Ex d'opérateurs : =, **, &&, Règle associative à gauche : <> <> <chiffre> <chiffre> <chiffre> 0 1 9 <> <chiffre> 9 <> <> <chiffre> 5 <chiffre> 2 Règle associative à droite : <affect> <lettre> = <affect> <lettre> <lettre> a b c z <affect> <lettre> = a <lettre> b <affect> = <affect> <lettre> c 35 Règles pour résoudre l ambiguïté : 2. Priorité des opérateurs : convention d'évaluation. 9 5 * 2 s'évalue 9 (5 * 2) On dit que * a une priorité supérieure à car il 'applique avant. 36 Démarche de la construction d'une grammaire non ambiguë des essions arithmétiques : 1. On définit une table synthétisant l'associativité et la priorité des opérateurs : l'ordre correspond associativité à gauche : - à la priorité associativité à gauche : * / 2. On introduit deux non-terminaux <> et <terme> correspondant aux deux niveaux de priorité. 3. On introduit un autre non-terminal <factor> pour les unités de base (impossible à éclater) : chiffres et essions parenthèses. Résultat : <> <> <terme> <> - <terme> <terme> <terme> <terme> * <factor> <terme> / <factor> <facteur> <factor> <chiffre> (<>) Arbre syntaxique 9 5 * 2??

Exercice à faire en cours Exercice écrire une grammaire pour un sous-ensemble des instructions Java : et <instrs>. Remarques : Considérez 7 types de : affectation, deux conditionnels, while, do while, bloc d'instructions et instruction vide ( ). La définition de repose sur :, <instrs>,<bool> et <> Terminaux : id if else while do = ; ( ) { } Le point-virgule doit apparaître à la fin des productions qui ne finissent pas par. La définition de <instrs> (liste de instructions) repose sur : <instrs> et if La grammaire précédente est ambiguë à cause du conditionnel. if (<bool>) else if (<bool>) autres instructions L'instruction if (estx) if (esty) a=x; else a=y; admet deux arbres syntaxiques : ( <bool> ) estx else if ( <bool> ) esty estx if ( <bool> ) if ( <bool>) else esty 37 38 39 Ré-écriture de la grammaire pour enlever l'ambiguïté : <instr_close> <instr_non_close> <instr_non_close> if (<bool>) if (<bool>) <instr_close> else <instr_non_close> <instr_close> if (<bool>) <instr_close> else <instr_close> autres instructions L'instruction if (estx) if (esty) a=x; else a=y; admet un arbre syntaxique : <instr_non_close> if ( <bool> ) estx <instr_close> if ( <bool> ) <instr_close> else <instr_close> esty 40 La traduction dirigée par la syntaxe est réalisée en attachant des règles (ou programmes) à des productions. Exemple : <> <1> <terme> traduire <> peut se faire avec le pseudo-code suivant : traduire 1; reconnaître "" traduire terme; traiter addition; Le pseudo-code peut servir à construire un arbre abstrait pour, ou bien pour un traitement plus simple comme par exemple la traduction en postfix. Un Attribut : information associée aux unités (nœuds) syntaxiques. Par exemple : chaîne de caractères; valeur, adresse mémoire, etc. Une production peut avoir un ensemble de règles ou actions sémantiques pour calculer la valeur des attributs. X.a dénote la valeur de l'attribut a du nœud X. Deux manières d'associer les règles ou actions sémantiques à la grammaire : 1. Définition dirigée par la syntaxe : chaque production est accompagné d'une règle sémantique. 2. Schémas de traduction : on insère des instruction (programmes) à l'intérieur des productions. On parle d'actions sémantiques. On dit que l'attribut est synthétisé quand la valeur remonte (est calculée) à partir des attributs fils. On parle d'attribut hérité dans le cas contraire, quand la valeur provienne des nœuds ancêtres. 41 42

43 1. Définition dirigée par la syntaxe. Chaque production est accompagné d'une règle sémantique. Exemple traduire une ession en postfixe : concaténation Production Règle sémantique <> <1> <terme>.t = 1.t terme.t "" <> <1> - <terme>.t = 1.t terme.t "-" <> <terme>.t = terme.t <terme> <terme1> * <factor> terme.t = terme1.t facteur.t "*" <terme> <terme1> / <factor> terme.t = terme1.t facteur.t "/" <terme> <factor> terme.t = facteur.t <factor> (<>) facteur.t =.t <factor> 0 facteur.t = "0" <factor> 1 facteur.t = "1" 44 L'arbre "décoré" est l'arbre syntaxique représentant explicitement les valeurs des attributs pour chaque nœud. L'arbre "décoré" correspondant à l'analyse de 9 2 * 4 facteur.t = "9".t = "9" terme.t = "9" facteur.t = "9" 9.t = "9 2 4 * " terme.t = "2" * facteur.t = "2" terme.t = "2 4 *" Les règles sémantiques ont été évaluées en faisant un parcours en profondeur d'abord. On évalue après avoir visité tous les fils. Les attributs sont synthétisés 2 terme.t = terme1.t facteur.t "*" facteur.t = "4" 4 2. Schémas de traduction. On insère des programmes (actions sémantiques) à l'intérieur des productions. 45 Similaire à une définition dirigée par la syntaxe, excepté que l'ordre d'évaluation des actions sémantiques est donné explicitement. Par la suite on utilisera des schémas de traduction. Exemple : <reste> --> <terme> {print("")} <reste1> Arbre syntaxique correspondant au schéma de traduction : reste terme {print("")} reste1 action sémantique Schémas de traduction pour traduire vers postfixe : 46 Production <> <1> <terme> {print("")} <> <1> - <terme> {print("-")} <> <terme> <terme> <terme1> * <factor> {print("*")} <terme> <terme1> / <factor> {print("/")} <terme> <factor> <factor> (<>) <factor> 0 {print("0")} <factor> 1 {print("1")} Appliquez le schéma de traduction à l'ession : 9 2 * 4 Compilation Méthodes d'analyse Analyse syntaxique descendante Deux méthodes d'analyse : Descendante : programmation facile, on part de l'axiome (racine) Ascendante : s'applique à des grammaires plus générales. Des outils logiciels tendent à utiliser des méthodes ascendantes. Analyse descendante. On commence par l'axiome, en réalisant de manière répétitive les deux étapes suivantes : 1. Au nœud n, étiqueté par un non-terminal A, choisir une production de A et construire les fils de n avec les symboles de la partie droite de la production. Choisir selon le symbole de prévision 2. Choisir le prochain nœud où un sous-arbre doit être construit. 47 48 Choisir le nœud le plus à gauche : dérivation gauche

49 Analyse syntaxique descendante Exemple d'application de l'analyse descendante : Sous-ensemble d'instructions de Java. id = <> ; if (<>) while (<bool>) Pour certaines grammaires, les étapes peuvent être appliquées sans avoir besoin de faire des retour-arrière (de manière déterministe). Au cours de l'analyse, le terminal d'entrée courant est appelé symbole de pré-vision. 50 Entrée while (i<=6) a=a1; Arbre Analyse syntaxique descendante Exemple de chaîne d'entrée : while (i<=6) a=a1; Au départ, le terminal while est le symbole de pré-vision. <inst> <inst> while ( <bool> ) <intr> while <bool> while (<bool>) Si le symbole de pré-vision nous signale une seule production possible, alors on peut appliquer une analyse syntaxique prédictive sans besoin de retour-arrière. ou Analyse Descendante Déterministe 51 } Analyse syntaxique prédictive Une procédure est associée à chaque non terminal. Le symbole de pré-vision (previs) permet de sélectionner de manière définitive la production à appliquer. Pseudo-code : public void instr() { switch (previs){ case ID : id = <> ; if (<>) while (<bool>) <> ; accepter(id); accepter(affect); ( ); accepter(pv); break; case IF : accepter(if); accepter(pg); (); accepter(pd); instr(); break; case WHILE : accepter(while); accepter(pg); bool(); accepter(pd); instr(); break; case : break; // autres instructions case default : print("erreur syntaxe"); ID, AFFECT, PV, IF, PG, PD, WHILE } sont des terminaux, des unités lexicales Analyse syntaxique prédictive Suite pseudo-code : 52 public void accepter(terminal t) { if (previs == t) previs = unitesuivante(); // appel analyse lexical else print("erreur syntaxe"); } Définition PREMIER( ) = ensemble des terminaux pouvant apparaître au début d une dérivation de. Exemples : PREMIER(instr) = {id, if, while, } PREMIER() = {id, chiffre,...} Analyse syntaxique prédictive S'il existe plus d'une production pour un nœud A, par exemple A et A. On choisi d'appliquer A si : 1. a PREMIER( ) où a est le symbole de pré-vision et 2. PREMIER( ) PREMIER( ) = Associativité gauche Récursivité à gauche. Notez la production suivante <> <> <terme> Une analyse syntaxique prédictive ne peut pas s'appliquer à une telle production. Dans ce cas il faut ré-écrire la production pour éliminer la récursivité à gauche. L'analyse syntaxique prédictive sera abordée plus en détail dans le chapitre Analyse Syntaxique 53