Vue générale Pr ZEGOUR DJAMEL EDDINE

Slides:



Advertisements
Présentations similaires
Structures de données avancées : Principales structures de fichiers
Advertisements

Structures de données avancées : Principales structures de données
Structures de données avancées : Introduction
Traitement sémantique et grammaire dattributs Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI)
Le langage Z Pr ZEGOUR DJAMEL EDDINE
Sémantique des déclarations pour le langage Z minimal
Introduction à l’Algorithmique
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Chap 1 Grammaires et dérivations.
Introduction : Compilation et Traduction
IFT313 Introduction aux langages formels
CPI/BTS 2 Programmation Web Introduction au PHP
Introduction : Compilation et Traduction
Expressions et assignations
Analyse lexicale Généralités Expressions rationnelles Automates finis
IFT313 Introduction aux langages formels
Algorithmique et Programmation
Introduction à la programmation (Java)
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke Automates à pile LR Notion de poignée.
Expressions régulières et hash tables
1 CSI3525: Concepts des Languages de Programmation Notes # 3: Description Syntaxique des Languages.
CSI3525: Concepts des Languages de Programmation
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
IFT 6800 Atelier en Technologies d’information
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
Chapitre 3 Syntaxe et sémantique.
Analyse lexicale et syntaxique
Partie II Sémantique.
Sémantique dénotationnelle
COURS DE PROGRAMMATION ORIENTEE OBJET :
Séance d’introduction
Analyse syntaxique Pr ZEGOUR DJAMEL EDDINE
Analyse lexicale Pr ZEGOUR DJAMEL EDDINE
Table des symboles Pr ZEGOUR DJAMEL EDDINE
Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI) Plate-forme.NET.
Les langages Syntaxe et sémantique Grammaires Sémantique axiomatique.
Description des langages
Programmation logique Le Langage PROLOG
Rappel Modèle analyse-synthèse de la compilation
Les Opérateurs Ils régissent toutes les opérations ou transformations sur les valeurs des variables. Opérateur d'affectation Opérateurs arithmétiques Opérateurs.
Les différents langages de programmation
Expressions régulières et hash tables
Paradigmes des Langages de Programmation
Paradigmes des Langages de Programmation
Procédures et fonctions Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Algorithmes et Programmation
Un survol du language C.
CSI3525: Concepts des Langages de Programmation Notes # 13: Introduction au SmallTalk.
Sémantique des expressions arithmétiques pour le langage Z minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Tables de compilation pour le langage Z minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Arbres binaires et tables de hachage
D.E ZEGOUR Ecole Supérieure d’Informatique. Problèmes de décision Concepts de base Expressions régulières Notation particulière pour exprimer certaines.
Le langage Z minimal Pr ZEGOUR DJAMEL EDDINE
Le langage Racket (Lisp)
L’analyse lexicale Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Sémantique des instructions pour le langage Z minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Structures simples et tableaux Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Interprétation/Génération de code pour le langage Z minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Expressions sur les chaînes de caractères Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
1 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Jean-Jacques Girardot
1 Programmation en C++ Marianne Morris. 2 Intro générale à la programmation On a déjà étudié le langage assembleur Langage de bas niveau Meilleur que.
Une brève présentation de C# Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Chap 1 Grammaires et dérivations.
Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI) C O M P I L Z.
CSI 3525, Grammaires, page 1 Description des langages –Syntaxe et sémantique –Grammaires –Sémantique axiomatique.
COMPIL - Z Compilateur visible
Philippe Gandy - 8 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Organisation de la mémoire pour le langage minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Transcription de la présentation:

Vue générale Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI) www.zegour.uuuq.com email: d_zegour@esi.dz

Vue générale Motivation Structure d‘un compilateur Grammaires Arbres Syntaxiques et Ambiguïté Classification de Chomsky Présentation Z#

Histoire (Construction des compilateurs) Autrefois " un mystère ", aujourd'hui l‘une des branches les plus maîtrisées En informatique. 1957 Fortran Premiers compilateurs (Expressions, instructions, procédures) Algol Première définition formelle d‘un langage (grammaires sous forme de Backus-Naur, bloc, récursivité, ...) 1970 Pascal types, machines virtuelles (P-code) 1985 C++ Orientation objets, exceptions 1995 Java Portabilité Le cours concerne uniquement les langages impératifs (procéduraux) langages fonctionnels (Lisp) et langages logiques ( Prolog) exigent d‘autres techniques.

Comment est écrit le premier compilateur? Programmation degré 0 : en binaire (suite de 0 et de 1) Programmation degré 1 : langage d‘assemblage (LW, JUMP,.) Programmation degré 2 : langage de programmation (CALL, SINUS,.) Le premier assembleur est écrit en binaire Le premier compilateur est écrit en langage d‘assemblage Aujourd'hui un compilateur pour le langage U est écrit avec un langage V doté d‘un compilateur écrit dans un langage W.

Pourquoi apprendre la compilation? Constitue une base pour un ingénieur en informatique Comment les compilateurs fonctionnent? Comment les ordinateurs fonctionnent? (instructions, registres, addressage, déroulement d‘une instruction, ...) Code machine généré (efficacité) C‘est quoi une bonne conception de langage ? Utile dans d‘autres domaines Lecture des requêtes de bases de données () Lecture des données structurées du type XML, fichier image, ...) Interprétation des lignes de commande ...

Vue générale Motivation Structure d‘un compilateur Grammaires Arbres Syntaxiques et Ambiguïté Classification de Chomsky Présentation Z#

Structure d‘un compilateur Programme source v a l = 1 * v a l + i Analyse lexicale Unités lexicales 1 (ident) "val" 3 (assign) - 2 (number) 10 4 (times) 5 (plus) "i" Code de l‘unité Valeur de l‘unité Analyse syntaxique Arbre syntaxique ident = number * ident + ident Term Expression Statement

Structure d‘un compilateur Statement Arbre syntaxique Expression Term ident = number * ident + ident Analyse sémantique Représentation intermédiaire Arbre syntaxique, table des symboles, ... Optimisation Génération de code 00101110000 01101101101 00011111010 ... Code machine

Compilateurs à une passe Fonctionnement simultané des phases Scanne une unité Analyse une unité Vérifie une unité Génère le code pour une unité n eof? y Le programme objet est généré en même temps que le programme source est lu.

Compilateurs à plusieurs passes Les phases sont des programmes séparés qui s‘exécutent séquentiellement Lexique Syntaxe Sémantique ... Source Unités lexicales Arbre Code Chaque phase lit à partir d‘un fichier et écrit sur un nouveau fichier Pourquoi plusieurs passes? Mémoire insuffisante (Aujourd'hui, ce n‘est plus un motif) Langage complexe Portabilité importante

En général: Compilateurs à deux passes Lexique Syntaxe Sémantique Génération code Représentation intermédiaire Dépendant du language Java C Pascal Dépendant de la machine Pentium PowerPC SPARC Toute combinaison possible Avantages Meilleure portabilité Combiner les techniques entre les deux passes Optimisations plus simples sur la représentation intermédiaire que sur le code source Inconvénients Lenteur Plus de mémoire

Différence entre Compilateur et Interpréteur Traduit vers le code machine scanner parser ... code generator loader code source code machine Interpréteur exécute le code source "directement" scanner parser code source interprétation Les instructions d‘une boucle sont scannées et analysées à chaque itération Variante: interprétation du code intermédiaire ... compilateur ... code source Code intermédiaire (Langage pivot)) VM Le code source est traduit dans le code d‘une machine virtuelle (VM) VM interprète le code simulant la machine physique

Fonctionnement d‘un compilateur "Programme principal" Dirige toute la compilation Analyse Syntaxique Sémantique Flots de données scanner Génération de code Fournit les unités lexicales à partir du code source génère le code machine Table des symboles Maintient des informations sur les variables et types déclarés Utilise

Vue générale Motivation Structure d‘un compilateur Grammaires Arbres Syntaxiques et Ambiguïté Classification de Chomsky Présentation Z#

C‘est quoi une grammaire? Exemple Statement = "if" "(" Condition ")" Statement ["else" Statement]. Quatre composantes Symboles terminaux Sont atomiques "if", ">=", ident, number, ... Symboles non terminaux Sont dérivés en unités Statement, Expr, Type, ... productions Règles donnant la décom- position des non terminaux Statement = Designator "=" Expr ";". Designator = ident ["." ident]. ... Symbole de départ Non terminal axiome CSharp

Notation EBNF Extended Backus-Naur form Conventions Symboles Sens John Backus: a développé le premier compilateur Fortran Peter Naur: définition de Algol60 Symboles Sens exemples Chaîne Nom = . Dénote une chaîne de caractères Dénote un symbole T ou NT Sépare les membres d‘une production Termine une production "=", "while" ident, Statement A = b c d . | (...) [...] {...} Choix Choix de groupes Partie optionnelle Partie répétitive a | b | c a or b or c a ( b | c ) ab | ac [ a ] b ab | b { a } b b | ab | aab | aaab | ... Conventions Symboles terminaux : commencent par des lettres minuscules (ex. ident) Symboles non terminaux : commencent par des lettres majuscules (ex. Statement)

Exemple: Grammaire pour les expressions arithmétiques Productions Expr = [ "+" | "-" ] Term { ( "+" | "-" ) Term }. Term = Factor { ( "*" | "/" ) Factor }. Factor = ident | number | "(" Expr ")". Expr Symboles Terminaux "+", "-", "*", "/", "(", ")" ( 1 instance) ident, number (plusieurs instances) Term Factor Symboles non terminaux Expr, Term, Factor Symbole de départ Expr

Priorité des opérateurs Des grammaires peuvent être utilisées pour définir la priorité des opérateurs Expr = [ "+" | "-" ] Term { ( "+" | "-" ) Term }. Term = Factor { ( "*" | "/" ) Factor }. Factor = ident | number | "(" Expr ")". Entrée: - a * 3 + b / 4 - c - ident * number + ident / number - ident = - Factor * Factor + Factor / Factor - Factor = - = Term + "*" et "/" ont des priorités supérieures à "+" et "-" = Expr "-" ne porte pas sur a, mais sur a*3 Comment transformer la grammaire pour que "-" porte sur a? Expr = Term { ( "+" | "-" ) Term }. Term = Factor { ( "*" | "/" ) Factor }. Factor = [ "+" | "-" ] ( ident | number | "(" Expr ")" ).

Premiers d‘un non terminal Avec quels symboles terminaux un non terminal peut commencer? Expr = ["+" | "-"] Term {("+" | "-") Term}. Term = Factor {("*" | "/") Factor}. Factor = ident | number | "(" Expr ")". First(Factor) = ident, number, "(" First(Term) = First(Factor) = ident, number, "(" First(Expr) = "+", "-", First(Term) = "+", "-", ident, number, "("

Suivants d‘un non terminal Quels symboles terminaux peuvent suivre un non terminal ? Expr = [ "+" | "-" ] Term { ( "+" | "-" ) Term }. Term = Factor { ( "*" | "/" ) Factor }. Factor = ident | number | "(" Expr ")". Voir où Expr apparaît dans le coté droit d‘une production? Quels sont les symboles terminaux qui le suivent? Follow(Expr) = ")", eof Follow(Term) = "+", "-", Follow(Expr) = "+", "-", ")", eof Follow(Factor) = "*", "/", Follow(Term) = "*", "/", "+", "-", ")", eof

Terminologie Alphabet Chaîne Chaîne vide L‘ensemble des symboles terminaux et non terminaux d‘une grammaire Chaîne Une séquence finie de symboles d‘un alphabet. Dénotées par les lettres grecques (a, b, g, ...) Ex.: a = ident + number b = - Term + Factor * number Chaîne vide Dénotée par e

Dérivations et Réductions b a => b (dérivation directe) Term + Factor * Factor => Term + ident * Factor Non terminal NT Partie droite d‘une production de NT a =>* b (dérivation indirecte) a => g1 => g2 => ... => gn => b a =>L b (dérivation canonique gauche ) Le non terminal le plus à gauche dans a est dérivé en premier a =>R b (dérivation canonique droite) Le non terminal le plus à droite dans a est dérivé en premier Réduction C‘est l‘inverse d‘une dérivation. Si le coté droit d‘une production figure dans b il est remplacé par le non terminal correspondant

Dérivation de la chaîne vide( Annulabilité ) Une chaîne a peut dériver la chaîne vide. a =>* e Exemple A = B C. B = [ b ]. C = c | d | e. B peut dériver la chaîne vide : B => e C peut dériver la chaîne vide : C => e A peut dériver la chaîne vide : A => B C => C => e

Plus de terminologie Forme sententielle Phrase du langage Toute chaîne qui peut être dérivée à partir de l‘axiome d‘une grammaire. Ex1: Expr // Ex2 : Term + Term + Term; Ex3:Term + Factor * ident + Term ... Phrase du langage Une forme sententielle uniquement avec des symboles terminaux. Ex.: ident * number + ident Phrase pour un non terminal U xUy forme sentientielle et U=>+u Si U=>u : phrase simple Handle Phrase simple la plus à gauche Langage (langage formel) C‘est l‘ensemble de toutes les phrases d‘une grammaire (en général infini). Ex.: le langage C est l‘ensemble de tous les programmes C corrects syntaxiquement.

Récursion Une production est récursive si Récursion directe A => * w1 A w2 Utilisée pour représenter des répétitions et des structures emboîtées Récursion directe A => w1 A w2 Récursion gauche A = b | A a. A => A a => A a a => A a a a => b a a a a a ... Récursion droite A = b | a A. A => a A => a a A => a a a A => ... a a a a a b Récursion centrale A = b | "(" A ")". A => (A) => ((A)) => (((A))) => (((... (b)...))) Récursion indirecte A => * w1 A w2 Exemple Expr = Term { "+" Term }. Term = Factor { "*" Factor }. Factor = id | "(" Expr ")". Expr => Term => Factor => "(" Expr ")"

Comment éliminer la récursion à gauche? La récursion à gauche constitue un handicap pour les analyseurs syntaxiques TopDown Les deux alternatives commencent avec b. L‘analyseur ne peut décider quoi choisir A = b | A a. La récursion à gauche peut être transformée en une itération E = T | E "+" T. Quelles formes sententielles peuvent être dérivées? T T + T T + T + T ... Ce qui donne la règle itérative EBNF : E = T { "+" T }.

Vue générale Motivation Structure d‘un compilateur Grammaires Arbres Syntaxiques et Ambiguité Classification de Chomsky Présentation Z#

Notation BNF ordinaire Symboles terminaux Sont écrits sans quottes (Ex. : ident, +, -) Symboles non terminaux sont écrits entre < et > (Ex. : <Expr>, <Term>) Membres d‘une production sont séparés par ::= Grammaire BNF pour les expressions arithmétiques <Expr> ::= <Sign> <Term> <Expr> ::= <Expr> <Addop> <Term> <Sign> ::= + <Sign> ::= - <Sign> ::= <Addop> ::= + <Addop> ::= - <Term> ::= <Factor> <Term> ::= <Term> <Mulop> <Factor> <Mulop> ::= * <Mulop> ::= / <Factor> ::= ident <Factor> ::= number <Factor> ::= ( <Expr> ) Alternatives sont transformées en productions séparées Répétition doivent être exprimée par récursion Avantages Sans méta symboles ( |, (), [], {}) Plus facile à construire un arbre syntaxique Inconvénient Lourdeur

Arbre syntaxique Montre la structure d‘une phrase particulière Ex. pour 10 + 3 * i Arbre syntaxique concret (Arbre de l‘analyseur) Expr Expr Addop Term Sign Term Term Mulop Factor Reflète les priorités des opérateurs : de bas en haut dans l‘arbre. Factor Factor e number + number * ident Arbre syntaxique abstrait (feuilles = opérandes, nœuds internes = opérateurs) number ident * + Souvent utilisé comme une représentation interne d‘un programme; Utilisé pour les optimisations.

Ambiguïté Une grammaire est ambiguë, si plus d‘un arbre syntaxique peuvent être construits pour une phrase donnée. Exemple T = F | T "*" T. F = id. phrase: id * id * id 2 arbres syntaxiques existent pour cette phrase id F T * Les grammaires ambiguës causent des problèmes dans l‘analyse syntaxique!

Éviter l‘ambiguïté Exemple La grammaire peut être transformée : T = F | T "*" T. F = id. Remarque : seule la grammaire est ambiguë, pas le langage. La grammaire peut être transformée : T = F | T "*" F. F = id. T cad. T a la priorité sur F T Un seul arbre syntaxique est possible T F F F id * id * id Encore mieux : transformation vers EBNF T = F { "*" F }. F = id.

Ambiguïté inhérente Il existe des langages avec des ambiguïtés inévitables. Exemple: Problème des Else Statement = Assignment | "if" Condition Statement | "if" Condition Statement "else" Statement | ... . Condition Statement Il n‘existe pas de grammaire non ambiguë pour ce langage! Solution dans les langages : le dernier Else se rapporte au dernier If if (a < b) if (b < c) x = c; else x = b; Condition Statement

Vue générale Motivation Structure d‘un compilateur Grammaires Arbres Syntaxiques et Ambiguïté Classification de Chomsky Présentation Z#

Classification des grammaires Due à Noam Chomsky (1956) Les grammaires sont des ensembles de productions de la forme a = b. class 0 Grammaires non restritives (a et b arbitraires) Ex.: A = a A b | B c B. aBc = d. dB = bb. A => aAb => aBcBb => dBb => bbb Reconnues par les machines de Turing class 1 Grammaires à contexte sensitif (a =xUy et b=xuy) ,U=NT Ex: a A = a b c. Reconnues par les automates linéaires finis class 2 Grammaires à contexte-libre (a = NT, b # e) Ex: A = a b c. Reconnues par les automates à piles Seules ces deux classes sont exploitées dans la construction des compilateurs. class 3 Grammaires régulières (a = NT, b = T | T NT) Ex: A = b | b B. Reconnues par les automates finis

Vue générale Motivation Structure d‘un compilateur Grammaires Arbres Syntaxiques et Ambiguïté Classification de Chomsky Présentation Z#

Un prototype de langage objet simple : z # Un programme est composé d‘une seule classe avec des variables globales et méthodes. Il n’y a pas de classes externes mais seulement des classes internes. Les classes internes sont utilisées comme des types de données. La méthode principale est toujours appelée Main(). Quand le programme est appelé, cette méthode est exécutée en premier

Un prototype de langage objet simple : z # Éléments : - constantes de type int (Ex: 123) et char (Ex. 'a') .Pas de constantes chaîne de caractères. variables: toutes les variables structurées contiennent des références (pointeurs); les variables dans la classe principale sont statiques (globales). Types de base : int, char (Unicode, 2 octets) Types structurés: tableau à une dimension et classes internes avec des champs mais sans méthodes. les méthodes sont définies dans la classe principale. procédures prédéfinies : ord, chr, len.  

Exemple de programme z # class P const int size = 10; class Table { int pos[]; int neg[]; } Table val; { void Main () int x, i; //---------- Initialize val ---------- val = new Table;val.pos = new int[size]; val.neg = new int[size]; i = 0; while (i < size) { val.pos[i] = 0; val.neg[i] = 0; i++; }   //---------- Read values ---------- read(x); while (-size < x && x < size) { if (0 <= x) val.pos[x]++; else val.neg[-x]++; }

Syntaxe complète de z # Program = "class" ident { ConstDecl | VarDecl | ClassDecl } "{" { MethodDecl } "}". ConstDecl = "const" Type ident "=" ( number | charConst ) ";". VarDecl = Type ident { "," ident } ";". ClassDecl = "class" ident "{" { VarDecl } "}". MethodDecl = ( Type | "void" ) ident "(" [ FormPars ] ")" { VarDecl } Block. FormPars = Type ident { "," Type ident }. Type = ident [ "[" "]" ]. Statement = Designator ( "=" Expr | "(" [ ActPars ] ")" | "++" | "--" ) ";" | "if" "(" Condition ")" Statement [ "else" Statement ] | "while" "(" Condition ")" Statement | "break" ";" | "return" [ Expr ] ";" | "read" "(" Designator ")" ";" | "write" "(" Expr [ "," number ] ")" ";" | Block | ";". Block = "{" { Statement } "}". ActPars = Expr { "," Expr }.

Syntaxe complète de z# (suite) Condition = CondTerm { "||" CondTerm }. CondTerm = CondFact { "&&" CondFact }. CondFact = Expr Relop Expr. Expr = [ "-" ] Term { Addop Term }. Term = Factor { Mulop Factor }. Factor = Designator [ "(" [ ActPars ] ")" ] | number | charConst | "new" ident [ "[" Expr "]" ] | "(" Expr ")". Designator = ident { "." ident | "[" Expr "]" }. Relop = "==" | "!=" | ">" | ">=" | "<" | "<=". Addop = "+" | "-". Mulop = "*" | "/" | "%".