• Aucun résultat trouvé

IFT313Introduction aux langages formels

N/A
N/A
Protected

Academic year: 2022

Partager "IFT313Introduction aux langages formels"

Copied!
6
0
0

Texte intégral

(1)

Département d’informatique

IFT313

Introduction aux langages formels

Plan de cours Été 2013

Enseignant : Froduald Kabanza

Courriel : kabanza@usherbrooke.ca Local : D4-1022-2

Téléphone : (819) 821-8000 poste 62865

Site : planiart.usherbrooke.ca/kabanza/cours/ift313 Disponibilité : mardi de 11h à 12h ou sur rendez-vous Auxiliaire : Cody Stoutenburg

Courriel : cody.stoutenburg@usherbrooke.ca

Horaire : Lundi 13h30 à 15h20 salle D3-2037 Mardi 8h30 à 10h20 salle D3-2037

Description officielle de l’activité pédagogiquei

Objectifs S’initier aux fondements théoriques des langages de programmation, en particulier aux langages formels, à la théorie des automates ainsi qu’`a l’analyse lexicale et syntaxique.

Contenu Langages réguliers et expressions régulières. Automates finis et analyseurs lexicaux. Langages et grammaires hors contexte. Arbre syntaxique et grammaire ambiguë. Automates à pile de mémoire, analyseurs syntaxiques descendants et analyseurs syntaxiques ascendants. Machines caractéristiques. Classes de grammaires hors contexte : LL, SLR, LALR et LR. Applications aux langages de programmation. Générateurs d’analyseurs lexicaux et syntaxiques.

Crédits 3

Organisation 3 heures d’exposé magistral par semaine 1 heure d’exercices par semaine

5 heures de travail personnel par semaine

Préalable MATT 115

i http ://www.usherbrooke.ca/fiches-cours/ift313

(2)

1 Présentation

1.1 Mise en contexte

Des langages de programmation telles que Java, C++, C# nécessitent un compilateur pour traduire du code source en un code exécutable. Les langages pour le Web tels que HTML ou XML ont aussi besoin d’être interprétés et traduits en différents formats, pour permettre par exemple la manipulation de données spécifiées dans ces langages par diverses applications. De tels compilateurs, interpréteurs ou traducteurs de langages sont en principe structurés en plusieurs phases, chacune opérant à un niveau d’abstraction particulier du langage source. Par exemple, la traduction d’un programme source en Java (fichier de type « .java ») en code exécutable sur une machine virtuelle java (fichier

« .class ») implique au moins une phase d’analyse lexicale, une phase d’analyse syntaxique et une phase d’analyse sémantique. L’analyse lexicale reconnaît et isole les différentes mots du code source constituant une unité lexicale (les variables, les accolades, les mots-clés du langage tels que « if », « while », etc.). La séquence de mots reconnus est ensuite passée à un analyseur syntaxique, qui vérifie que la syntaxe du programme source est correcte.

Finalement la phase sémantique effectue la traduction en code exécutable.

Chacune de ces phases repose sur des principes, des concepts et des techniques bien établis. L’analyse lexicale repose le plus souvent sur les concepts d’expressions régulières et d’automates finis alors que l’analyse syntaxique repose sur les concepts de grammaires hors-contextes et d’automates à piles. En outre, il existe des outils efficaces de génération automatique d’analyseurs lexicaux et d’analyseurs syntaxiques.

Ce cours enseigne les principes fondamentaux, les concepts, les structures de données, les techniques ainsi que les algorithmes pour l’analyse lexicale et l’analyse syntaxique des langages de programmation. Néanmoins, bien que nous voyions cette matière dans une optique de langages de programmation, elle s’avère fondamentale pour d’autres domaines de l’informatique. En particulier, certains concepts et principes que nous verrons constituent une bonne base théorique pour des techniques et outils de traitement du langage naturel dans le domaine de l’intelligence artificielle. Les mêmes concepts et principes sont utiles pour comprendre des techniques avancées de vérification et de validation automatique des programmes en génie logiciel.

1.2 Objectifs généraux

S'initier aux fondements théoriques des langages de programmation, en particulier aux langages formels, à la théorie des automates ainsi qu'à l'analyse lexicale et syntaxique.

1.3 Objectifs spécifiques

À la fin de cette activité pédagogique, l’étudiante ou l’étudiant sera capable :

1.de comprendre et d’expliquer les principales notions et méthodes liées à l’analyse lexicale des langages de programmation;

2. d’utiliser des outils d’écriture automatique d’analyseurs lexicaux

3.de comprendre et d’expliquer les principales notions et méthodes liées à l’analyse syntaxique des langages de programmation;

4. d’utiliser des outils d’écriture automatique d’analyseurs syntaxicaux 5. d’appliquer les notions et méthodes précédentes à des exemples concrets ; 1.4 Thèmes couverts

Thème Contenu Heures Objectifsii

1 Introduction au fonctionnement des compilateurs et des traducteurs de langages de programmation : qu’est-ce que l’analyse lexicale, syntaxique et sémantique.

2 1-2

2 Analyse lexicale :

langages réguliers, expressions régulières, automates fini déterministes (AFD), automates finis non-déterministes (AFN).

6 1

3 JFlex : outil de génération d’analyseurs lexicaux. 3 2

4 Analyse syntaxique (introduction) : 5 3

(3)

types de grammaires, relation entre langages et grammaires, automates à pile, grammaires hors-contextes et grammaire ambiguë.

5 Analyse syntaxique descendante :

automates à pile LL, notions d’ensemble First et Follow pour les grammaires LL, génération de tables

d’analyses LL(1), analyse récursive

6 3

6 JavaCC : outil de génération d’analyseur syntaxique LL(1). 3 4 7 Analyse syntaxique ascendante :

Automates à pile LR, notions préfixes viables, d’éléments LR(0), AFD pour reconnaître des préfixes viables. Construction d’analyseurs LR(0), SLR(1), LR(1) et LALR(1).

16 3

8 JavaCUP : outil de génération d’analyseurs syntaxiques LR 4 4

(4)

2 Organisation

2.1 Méthode pédagogique

Le cours comprend trois heures d’exposé magistral, une heure d’exercices dirigés et cinq heures de travail personnel par semaine, durant 12 semaines. Si la situation l’exige, selon l’appréciation du professeur, il pourrait y avoir quatre heures d’exposé magistraux durant une semaine, suivi de deux heures d’exposé magistral et deux heures d’exercices la semaine suivante.

2.2 Calendrier du cours

Date Thème Contenu Lecture *

1

29/4 1

Plan de cours et introduction.

Langages réguliers Expressions régulières.

[1] :1, 2.3, 5.1-5.6 [2] : 2.1-2.4

30/4 1 Automates fini (AF)

Analyse lexicale par un automate fini déterministe (AFD).

2

6/5 2

Convertir une expression régulière en un automate fini non déterministe (AFN).

Convertir un AFN en un AFD.

[1] :5.7, 6.1-6.6

7/5 2

Minimiser un AFD.

Théorème du gonflement (pumping theorem).

Exercices sur les expressions régulières, AFN, AFD Devoir #1 : Analyseur lexical avec un AFD. Reconaître des unités lexicales avec et sans Regex en Java. Regex en Java

3

13/5 3

Générateurs d’analyseur lexicaux : JFlex.

Grammaires. Langages générés par une grammaire.

Dérivation. Arbre d’analyse.

[2] :2.5 [3] : Doc JFlex

14/5 3

Exercices sur JFLEX

Devoir #2 : Programmer un analyseur lexical avec JFLEX.

4

20/5 Congé

21/5 4

Grammaires ambiguës. Grammaires hors contexte (GHC).

Automates à pile pour une GHC.

[1]: 3, 10, 18 [2]: 3.1

5 27/5 5

Automate à pile LL.

Notions d’ensembles First et Follow pour des grammaires LL(1).

[1] :7, 4.1-4.4, 19 [2] :3.2

28/5 5 Exercices sur les grammaires et les automates à piles.

6

3/6 5 Tables d’analyse LL(1). LL driver. Analyseurs syntaxiques descendants non-récursifs LL(1) avec un driver LL(1).

4/6 5 Exercices : grammaires LL(1) Devoir #3 : Grammaires LL(1)

(5)

7

10/6 1-6

Analyseurs syntaxiques descendants récursifs LL(1).

Générateurs d’analyseurs syntaxiques LL(1) : JavaCC.

Notions de grammaires attribués et d’arbres syntaxiques.

[2 ]: 3.3-3.5, 4 [4] : Doc de Java CC 11/6

6

Laboratoire supervisé sur JavaCC

Devoir #4 : Traducteur de mini-Scheme à Java, avec JavaCC.

17/6 Période des examens périodiques : pas de cours.

18/6

9

24/6 Congé

25/6 Correction de l’examen périodique.

Automates à piles LR. Notion de poignée (handle).

10

1/7

Congé

2/7 7

Notion de préfixes viables (viable prefixes) Notion d’éléments (items) LR(0).

AFD pour reconnaître les préfixes viables.

[1] : 20 [2]: 3.3, 3.4-3.5

11

8/7 7 Analyseurs LR(0).

9/7 7 Analyseurs SLR(1).

Exercices sur l’analyse LR.

12 15/7 8 Exercices : grammaires LR(0) et SLR(1).

Énoncé du TP5

16/7 7 Exercices: grammaires LR(1) et LALR(1).

13

22/7 7 Analyseurs LR(1). Analyseurs LALR(1).

23/7

Générateurs d’analyseurs syntaxiques LR: Java CUP. [5] : Doc de Java CUP Laboratoire supervisé sur Java CUP

Devoir #4 : Traducteur de mini-Scheme à Java, avec Java CUP.

14 29/7 1-7 Révision

30/7 8 Consultation au laboratoire sur Java CUP 5/8 1-7 Consultation au laboratoire

15 16

6-

16/8 Période des examens finaux

* Pour les lectures, les chiffres entre crochets correspondent aux documents référencés à la fin du plan de cours et les chiffres après les deux points correspondent aux sections du document.

2.3 Évaluation

Devoirs (6) : 40 %

Examen périodique : 20 % Examen final : 40 %

(6)

2.4 Échéancier des devoirs Devoir Spécification

donnée le Thème Pondération Date de remise

1 7 mai Analyseur lexical avec un AFD. Trouver des unités

lexicales avec et sans Regex en Java. 5 % 21 mai

2 14 mai Programmer un analyseur lexical avec JFlex 5 % 4 juin

3 4 juin Grammaires LL(1) 5 % 11 juin

4 11 juin Mini-projet avec JavaCC 10 % 15 juillet

5 15 juillet Grammaires LR(0), SLR(1), LR(1) et LALR(1) 5 % 23 juillet

6 23 juillet Mini-projet avec JavaCUP 10 % 5 août

Directives particulières

 Les devoirs sont effectués individuellement ou en équipe de 2 personnes. La qualité du français et de la présentation peut être considérée dans le résultat du travail.

 Toute soumission en retard vaut zéro, sauf celles motivées par des raisons valables, conformes au règlement des études de la Faculté.

 Le plagiat n’est pas toléré. Les étudiants doivent clairement référencer toute composante de leurs solutions aux devoirs tirée ou inspirée d’une tierce partie. À défaut ils risquent des sanctions sévères conformément au règlement des études et pouvant aller d’une note nulle pour le devoir à l’exclusion du programme.

 La correction des ´évaluations sera entre autres basée sur le fait que chacune de vos réponses soit : o claire, c’est-`a-dire lisible et compréhensible pour le correcteur

o précise, c’est-`a-dire exacte ou sans erreur ;

o complète, c’est-`a-dire que toutes les étapes de résolution du problème sont présentes ; o concise, c’est-`a-dire que la m´méthode de résolution est la plus courte possible.

 D’autres directives plus spécifiques, les dates de remise et les barèmes relatifs aux devoirs seront connus à la publication de l’énoncé de chaque devoir.

3 Matériel nécessaire pour le cours

Le livre de Sudkamp [1] est le manuel du cours. Tous les programmes et les diapositives présentés dans le cours sont disponibles sur le site du cours.

3 Références

[1] Sudkamp, T. A.. Languages and Machines. Third Edition Edition. Addison-Wesley, 2005.

[2] Appel, A. W. Modern Compiler Implementation in Java. Second Edition. Cambrdidge, 2002.

[3] JFlex : A Fast Scanner Generator for Java: http://jflex.de/

[4] JavaCC : A parser / scanner generator for Java: https://java.net/projects/javacc

[5] JavaCUP : An LALR Parser Genetrator for Java: http://www2.cs.tum.edu/projects/cup/

Références

Documents relatifs

- L’action de remplacer une chaînes de symboles au sommet de la pile par un non terminal (partie gauche d’une règle de production) est appelée “reduce” (on réduit la longueur

• En section 4.4 L’automate canonique, vous pouvez vous concentrer sur l’algorithme de minimisation (en 4.4.3 ; nécessite de connaître aussi la définition de

• On peut supprimer les productions et symboles inutiles sans affecter le langage généré.. • Algorithme en deux

Acceptation par état final : un peu comme pour les automates finis, on accepte si on se retrouve dans un état final après avoir lu tout le mot, et ce quelque soit le contenu de

• On suppose une capacité de mémoire infinie afin de pouvoir étudier la régularité (au sens usuel) des phénomènes syntaxiques et rendre la notion de structure syntaxique

• si ce n’est pas possible (parce qu’il s’agit d’un terminal ou parce que les différentes réécritures ne mènent à rien), c’est que la branche n’est pas viable.. •

À chaque étape, soit on sait qu’il faut s’arrêter (réussite ou échec), soit on sait quelle action effectuer pour continuer

Bon exercice : modifier l’algorithme afin de construire la tableT ′ en même temps que T, puis écrire l’algorithme listant toutes les