La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313.

Présentations similaires


Présentation au sujet: "IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313."— Transcription de la présentation:

1 IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313 Introduction

2 IFT313© Froduald Kabanza2 Aperçu des processeurs de langages Sujets Cest quoi un processeur de langage ? Le modèle analyse-synthèse Pourquoi les processeurs de langages sont faciles à implémenter ? Des grammaires aux arbres syntaxiques Analyse descendante vs analyse ascendante

3 IFT313© Froduald Kabanza3 Cest quoi un processeur de langages ? Processeurs de langage et compilateurs sont synonymes. Un compilateur est un programme qui reçoit le code (texte) dun programme dans un langage (langage source) et produit du code dans un autre langage (le langage cible) messages derreurs compiler code sourcecode cible code machine Pentium code machine SPARC C Examples : fichiers.class code Java JAVA Scheme

4 IFT313© Froduald Kabanza4 Pourquoi compiler ? Les ordinateurs exécutent du code machine différent du code source. Ou le programme est exécuté par une machine virtuelle (Java) dans un code (.class) différent du code source (fichiers.java) Faire linterface entre deux applications différentes: par exemple une application produit des données en format XML, une autre doit les afficher ou les traduire en requêtes pour une base données.

5 IFT313© Froduald Kabanza5 Compilation vs. Conversion de fichiers Fondamentalement cest la même chose ! La différence est dans le degré de complexité: Un langage de programmation a un sens ou une sémantique qui doit être préservée. Mais un convertisseur dimages en formats GIF vers un format JPEG, qui est aussi essentiellement un convertisseur de fichiers, doit aussi préserver les propriétés de limage, mais nest pas un compilateur pour autant! En fait, la différence principale est dans la complexité de la syntaxe et la sémantique du langage source et du langage cible.

6 IFT313© Froduald Kabanza6 Schéma dun compilateur traditionnel Code source avec des macros Préprocesseur cpp Préprocesseur cpp Programme source compilateur cc ou gcc compilateur cc ou gcc Programme assembleur cible Assembleur code machine Chargeur / éditeurs de liens Exécutable Libraires et fichiers objets

7 IFT313© Froduald Kabanza7 De nombreuses cas sont bien plus simples Code source (ex.:.java,.xml) Compilateur / Processeur de langage (e.x.: javac, xml2html) Compilateur / Processeur de langage (e.x.: javac, xml2html) Code cible (ex.:.class,.html)

8 IFT313© Froduald Kabanza8 Modèle analyse-synthèse de la compilation Il y a deux phases principales dun processeur de langage: analyse (front-end) synthèse (back-end) La phase analyse vérifie la syntaxe du code source et produit une représentation intermédiaire du code source (arbre sémantique). Cette phase danalyse comprend trois sous-phases : Analyse lexicale (lexical analysis ou scanning) Analyse syntaxique (syntactic analysis ou parsing) Analyse sémantique (semantic analysis)

9 IFT313© Froduald Kabanza9 Modèle analyse-synthèse de la compilation La phase de synthèse génère le code cible à partir de la représentation intermédiaire. Pour des cas simples, les deux phases analyse/synthèse sont combinées. code source Représentation (sémantique) intermédiaire code cible analyse (front-end) analyse (front-end) synthèse (back-end) synthèse (back-end) compilateur

10 IFT313© Froduald Kabanza10 Modèle analyse-synthèse de la compilation Exemple position = initial + rate * 60 Analyse lexicale (scanner) Analyse syntaxique (parser) id 1 = id 2 + id 3 * 60 positionid 1 rate initialid 2 id 3 = + * id 1 id 2 id 3 60 code source arbre syntaxique table de symboles unités lexicales (token)

11 IFT313© Froduald Kabanza11 Modèle analyse-synthèse de la compilation Exemple (suite) Analyse sémantique Génération de code intermédiaire = + * id 1 id 2 id 3 int2real 60 temp 1 = int2real(60); temp 2 = id 3 *temp 1 ; temp 3 = id 2 + temp 2 ; id1 = temp3

12 IFT313© Froduald Kabanza12 Modèle analyse-synthèse de la compilation Exemple (suite) Optimisation du code temp 1 = id 3 *60.0 id 1 = id 2 *temp 1 Génération du code MOVF id 3, R 2 MULF #60.0, R 2 MOVF id 2, R 1 ADD R 2, R 1 MOVF R 1, id 1 Certaines de ces phases sont parfois combinées Ce cours se limitera à lanalyse lexicale et à lanalyse syntaxique avec génération de code par une méthode simple (actions sémantiques).

13 IFT313© Froduald Kabanza13 Pourquoi les compilateurs sont faciles à implémenter ? Les compilateurs sont faciles à implémenter parce que : Le code source est dans un langage; il a donc une structure bien définie (dans un manuel de référence du langage) Le programme a aussi une sémantique (définie aussi dans un manuel de référence) À cause des ces deux facteurs, on peut définir une grammaire pour le langage, avec des attributs sémantiques et utiliser la théorie des langages de programmation pour construire un compilateur.

14 IFT313© Froduald Kabanza14 Pourquoi les compilateurs sont faciles à implémenter ? Si id est un identificateur et exp est une expression alors id = exp est une instruction. Si exp est une expression et stat est une instruction alors les formes suivantes sont des instructions : while (exp) stat if (exp) stat Un identificateur est une expression. Un nombre est une expression. Si exp1 et exp2 sont des expressions, il en est de même pour : exp1 + exp2, exp1 * exp2 et (exp1) Exemple : Structure simplifiée des instructions =, if et while

15 IFT313© Froduald Kabanza15 Grammaires La structure dun langage de programmation est spécifiée de manière formelle par une grammaire. La théorie des langages de programmation nous donnent des techniques permettant de vérifier si un programme source respecte le langage défini par une grammaire. En dautres mots, si le programme source est syntaxiquement correcte. La conception de compilateurs reposent fortement sur cette théorie et techniques. Presque tous les langages de programmation sont basés sur un type spécial de grammaires, très efficace, appelés grammaires hors-contexte.

16 IFT313© Froduald Kabanza16 Grammaire pour lexemple précédent 1 stat id = exp 2 stat if ( exp ) stat 3 stat while ( exp ) stat 4 exp id 5 exp num 6 exp ( exp ) 7 exp exp + exp 8 exp exp * exp Cest une grammaire hors-contexte (aussi connu sous le nom de forme Backus- Naur) Les symboles if, while, num, id, =, (, ), =, + et * sont des symboles terminaux. Les symboles stat et exp sont des non-terminaux. Le programme source contient seulement des symboles terminaux.

17 IFT313© Froduald Kabanza17 Arbre danalyse Plus précisément, le flux de tokens générés par lanalyseur lexical est une séquence de terminaux. Lanalyseur syntaxique vérifie que la séquence est effectivement dérivable de la grammaire en construisant un arbre danalyse. Si la séquence nest pas dérivable de la grammaire, ceci signifie quil y a une erreur (syntaxique) dans le code source.

18 IFT313© Froduald Kabanza18 Arbre danalyse Le scanner le convertit en Le parser lit les tokens un à un et produit un arbre danalyse: Exemple : code source position = initial + rate * 60 id 1 = id 2 + id 3 * num stat id=exp + * id 2 id 3 num

19 IFT313© Froduald Kabanza19 Dérivation Une règle de la grammaire est appelée une production. Intuitivement, le parser applique les règles de production pour générer larbre danalyse : le symbole de gauche de la règle est remplacé par les symboles de la partie droite. Pour id 1 = id 2 + id 3 * num, on a: 1 stat id = exp 2 stat if ( exp ) stat 3 stat while ( exp ) stat 4 exp id 5 exp num 6 exp ( exp ) 7 exp exp + exp 8 exp exp * exp stat => id = exp => id = exp + exp => id = id + exp => id = id + exp * exp => id = id + id * exp => id = id + id * num stat = exp + * id 1 id 2 id 3 num

20 IFT313© Froduald Kabanza20 Dérivation Lapplication dune production pour générer une nouvelle chaine de symboles est appelée une dérivation. Ainsi un arbre danalyse est juste une réécriture de la séquence de dérivation. Dans lexemple précédent, à chaque étape, on a chaque fois remplacé le symbole le plus à gauche. Ça sappelle la dérivation la plus à gauche (leftmost derivation).

21 IFT313© Froduald Kabanza21 Dérivation En faisant linverse, on a la dérivation la plus à droite (rightmost derivation). stat => id = exp => id = exp + exp => id = exp + exp * exp => id = exp + exp * num => id = exp + id * num => id = id + id * num Les analyseurs syntaxiques utilisent soit la dérivation la plus à gauche, soit la dérivation la plus à droite. Chacune des deux approches a ses propres forces et faiblesses. 1stat id = exp 2stat if ( exp ) stat 3 stat while ( exp ) stat 4 exp id 5 exp num 6 exp ( exp ) 7 exp exp + exp 8 exp exp * exp

22 IFT313© Froduald Kabanza22 Analyses syntaxiques LL et LR Les analyseurs syntaxiques qui utilisent la dérivation la plus à droite sont en principe plus efficaces, mais plus difficiles à implémenter. Dans les deux cas, le parser lit le code source de gauche à droite et, en fonction du ou des tokens suivants, décide de la production à appliquer pour la prochaine étape de dérivation. Les parsers qui utilisent une lecture de gauche à droite (Left-to-right) avec une dérivation la plus à gauche (Leftmost) sont appelés Left-to-right scanning Leftmost derivation ou LL tout court.

23 IFT313© Froduald Kabanza23 LL and LR parsing Si on veut mettre en emphase le nombre de tokens lus dun coup enfin de déterminer la production à utiliser, on dit LL(k), où k désigne le nombre de tokens lus (look ahead). De manière analogue, les parsers qui utilisent la dérivation la plus à droite sont appelés Left to right scanning, Rightmost derivation, k character look ahead or LR(k) tout court.

24 IFT313© Froduald Kabanza24 La question fondamentale dans lanalyse syntaxique Ainsi la question fondamentale dans lanalyse syntaxique est de déterminer la production de la grammaire à utiliser pour la prochaine dérivation. Les méthodes LL et LR donnent les solutions pour des grammaires hors- contexte. Le nombre k de tokens lus en avance pose des restrictions supplémentaires sur la grammaire et, conséquemment, sur le langage quon peut compiler. Plus k est élevé, plus la grammaire est puissante et plus efficace la méthode danalyse devient. k=1 est suffisant pour la plupart des langages de programmation, moyennant quelques raccourcis.

25 IFT313© Froduald Kabanza25 Règles sémantiques En générant du code, un compilateur doit préserver la sémantique du code source. La sémantique est spécifiée en associant des règles sémantiques aux productions de la grammaires, c-à-d., en utilisant des grammaires attribués. Exemple : de la notation infixée vers la notation préfixée ProductionRègle sémantique exp num exp id exp exp1 + exp2 exp exp1 * exp2 exp.t =num.val exp.t =id.val exp.t =+ || exp1.t || exp2.t exp.t =* || exp1.t || exp2.t t est lattribut;|| désigne le symbole de concaténation

26 IFT313© Froduald Kabanza26 Résumé Lanalyse lexicale est possible parce que les « mots » ou « unités lexicales » (tokens) dun langage de programmation sont spécifiées par des expressions régulières sur un alphabet (ASCII, Unicode, etc.) La compilation est possible parce que les langages ont une syntaxe (que nous spécifierons par des grammaires) et une sémantique (que nous spécifierons par des règles sémantiques). Les processeurs de langages sont fondamentaux en informatique. Un compilateur erroné peut causer des pertes énormes voire des dangers, dépendamment de lapplication ciblée par le code compilé. Il est important de concevoir les compilateurs en se basant sur une théorie et des techniques fiables. Les analyseurs lexicaux reposent sur la théorie des expressions régulières et des automates finis. Les analyseurs syntaxiques reposent sur la théorie des grammaires, des automates à piles et des automates finis.

27 IFT313© Froduald Kabanza27 Résumé À la fin, la question fondamentale dans lanalyse syntaxique demeure quelle production appliquer pour la prochaine dérivation? Les théories et les techniques que nous verrons dans une optique de processeurs de langages sont très utiles pour dautres domaines et important pour la culture générale dun informaticien. Elles sont la base de biens de méthodes en intelligence artificielle (traitement du langage naturelle) et en génie logiciel (outils de validation et de vérification automatique de programmes sources).

28 IFT313© Froduald Kabanza28 Prochain cours Langages réguliers Automates finis Analyse lexicale par un automate fini Voir le plan de cours pour les lectures à faire


Télécharger ppt "IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke planiart.usherbrooke.ca/kabanza/cours/ift313."

Présentations similaires


Annonces Google