• 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é 2014

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 : Francis Bisson

Courriel : francis.bisson@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

On sait que les langages de programmation occupent une place prépondérante en informatique. Par leur structure et leurs particularités, ils exercent une influence certaine sur le style de programmation et par conséquent sur la conception des programmes. Par exemple, le langage Prolog est conçu pour faire de la programmation logique, le langage Eiffel de la programmation orientée objet, le langage Scheme de la programmation fonctionnelle, le langage Occam de la programmation parallèle et enfin le langage C de la programmation procédurale et impérative.

Les langages de programmation sont loin d’être les seuls langages utilisés en informatique. En effet, il arrive souvent qu’il faille exprimer des instructions ou des spécifications de manière formelle, par exemple pour d´écrire un système complexe (langages de spécification), faire exécuter une suite de tâches (langages de commandes), interroger une base de données (langages de quatrième génération), voire formater un texte ou utiliser un logiciel de calcul symbolique (langages spécialisés).

Tous ces langages ont plusieurs points en commun. D’abord, de la même manière que les langues naturelles peuvent être vues comme des ensembles de phrases constituées de mots, on peut définir ces langages comme des ensembles de suites de lexèmes qui obéissent à des règles lexicales (dans le cas des langages de programmation, les lexèmes sont les constantes numériques, les noms de variables, les mots-clés et les opérateurs comme + et =). Ensuite, on distingue les phrases valides des autres à l’aide d’un ensemble de règles syntaxiques, appelé grammaire.

Définir un langage de manière rigoureuse et formelle permet l’analyse automatique de programmes ou de textes écrits dans ce langage par un outil qui, selon le type de langage, est appelé un compilateur, un assembleur, un interpréteur, un préprocesseur ou un éditeur. Par exemple, un programme écrit en Java est soumis à un compilateur, qui vérifie s’il est conforme aux règles syntaxiques du langage Java; si c’est le cas, le compilateur pourra traduire le programme en bytecode, ce qui lui permettra d’être exécuté sur une machine virtuelle Java.

L’activité pédagogique IFT313 (Introduction aux langages formels) présente les principaux outils formels de description de langages et de mise en œuvre d’analyseurs lexicaux et syntaxiques. Ces outils sont basés sur la théorie des automates et des langages formels.

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. de comprendre et d’expliquer les principales méthodes de spécification et d’analyse lexicale et syntaxique;

3. d’appliquer les notions vues en cours à des exemples concrets;

4. d’utiliser des outils d’écriture automatique d’analyseurs lexicaux et syntaxiques.

1.4 Thèmes couverts

Le tableau suivant contient la matière présentée dans ce cours. L’étude de cette matière est accompagnée d’au moins cinq devoirs couvrant tous les sujets, dont au moins deux travaux pratiques utilisant des outils de construction automatique d’analyseurs lexicaux et syntaxiques

Thème Contenu Heure Objectifs

(3)

s 1 Introduction : présentation du domaine des automates et des langages

formels; présentation du plan de cours. 2

2 Langage régulier : alphabet, chaîne et langage; opérations sur les chaînes et les langages; façons de définir formellement un langage;

ensemble régulier et expressions régulières; exemples concrets à partir de langages de programmation

6 1,3

3 Automate fini déterministe : automate fini déterministe, automate fini non déterministe, exemples d’automates finis; algorithmes de

traduction directe d’une expression régulière en un automate fini déterministe.

6 1

4 Construction d’analyseurs lexicaux : introduction à un outil de

construction automatique d’analyseurs lexicaux. 2 4

5 Grammaire hors contexte : notion de grammaire hors contexte, exemples concrets de langages hors contexte;

notions de dérivation, d’arbre de dérivation et de grammaire ambiguë; transformation d’une grammaire ambiguë en une grammaire non ambiguë; formes de règles de production et formes de grammaire hors- contexte; grammaires régulières et grammaires linéaires.

8 1,3

6 Du lexical au syntaxique : frontière entre l’analyse lexicale et

syntaxique, lemme de l’étoile. 1 2

7 Introduction à l’analyse syntaxique : graphe d’une grammaire; analyse

descendante et analyse ascendante à l’aide d’une recherche en largeur. 3 2 8 Automate à pile : notion d’automate à pile, types d’automate à pile et

leur équivalence. 4 1

9 Analyse syntaxique descendante : notion de grammaire LL(k); calcul des ensembles First, Follow et calcul des lookaheads; construction d’analyseurs syntaxiques descendants, descente récursive;

transformation d’une grammaire non LL(k) en une grammaire LL(k);

introduction à un outil de construction automatique d’analyseurs syntaxiques descendants.

8 2,4

10 Analyse syntaxique ascendante : notion de grammaire LR(k) et notions d’items; construction d’analyseurs syntaxiques ascendants;

grammaires LR(0), SLR(1), LR(1), LALR(1); transformation d’une grammaire non LR(k) en une grammaire LR(k);

à un outil de construction automatique d’analyseurs syntaxiques ascendants.

8 2,4

2 Organisation

Cette section propre à l’approche pédagogique de chaque enseignante ou enseignant présente la méthode pédagogique, le calendrier, le barème et la procédure d’évaluation ainsi que l’échéancier des travaux. Cette section doit être cohérente avec le contenu de la section précédente.

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.

(4)

2.2 Calendrier du cours

Les dates et les heures consacrés à chaque thème pourraient varier légèrement selon la progression.

Date Thème Contenu Lecture *

1

28/4

1 Plan de cours et introduction. [1] :1, [4] :1

2 Langages réguliers Expressions régulières.

[1] : 2, [3] :1, [4] :3.1- 3.3

29/4 3 Automates fini (AF)

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

[1] : 5.1-5.3, [3] :2

2

5/5 3

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

Convertir un AFN en un AFD.

[1] : 5.4-5.7, 6.1-6.4 [4] :3.6-3.7

6/5 3

Minimiser un AFD.

Lab #1 : 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

12/5 4

Générateurs d’analyseur lexicaux : JFlex. [2] :2.5 [4] :3.4-3.5, 3.8 [5] : Doc JFlex

6 Lemme de l’étoile [1] : 6.5-6.7

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

Dérivation. Arbre d’analyse. [1] : 3-4,

[4] : 4.1

13/5 4

Lab #2 : Se familiariser avec JFLEX

Devoir #2 : Programmer un analyseur lexical avec JFLEX.

4

19/5 Congé universitaire - Journée nationale des Patriotes

20/5 5, 7 Grammaires ambiguës. Grammaires hors contexte (GHC).

Automates à pile pour une GHC.

[1] : 3-4, 10 [2] : 3.1, [4] :4.2

5

26/5 8, 9

Automate à pile LL.

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

[1] :7.17.4, 19.1-19.5 [2] :3.2

[3] :4 [4] :4.3-4.4 27/5 8 Lab # 3 : Exercices sur les grammaires et les automates à

pile.

6

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

[1] : 19.6

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

(5)

7

9/6 9

Analyseurs syntaxiques descendants récursifs LL(1).

Générateurs d’analyseurs syntaxiques LL(1) JavaCC et notions de grammaires attribués et d’arbres syntaxiques.

[1] : 20 [2] : 3.3-3.5, 4 [6] : Doc de Java CC

10/6 1-9

Révision de mi-session

Lab #5 : Se familiariser avec JavaCC

Devoir #4 : Programmer un parseur avec JavaCC.

8 16/6 8,10 Automates à piles LR. Notion de poignée (handle).

17/6 Période des examens périodiques : pas de cours (du 17 au 27 juin) 9 23/6 Période des examens périodiques : pas de cours (du 17 au 27 juin)

24/6 Congé universitaire - Journée nationale du Québec

10

30/6 Congé universitaire – Fête du Canada (report du 1er juillet)

1/7

1-9 Correction de l’examen périodique.

8, 10

Rappel sur automates à piles LR et notion de poignée (handle).

Analyseurs LR(0) : notion de préfixes viables (viable prefixes) ; notion d’éléments (items) LR(0);

[1] : 20 [2]: 3.3, 3.4-3.5 [4] :4.5-4.6

11

7/7 10 Analyseurs LR(0), suite : AFD pour reconnaître les préfixes viables.

8/7 10

Analyseurs SLR(1) : pilote LR(1); générer une table

d’analyse SLR(1).

[4] : 4.7

Analyseurs LR(1) et LALR(1) : générer une table d’analyser LR(1) et LALR(1).

12 14/7 10 Lab #6 : Exercices : grammaires LR(0) et SLR(1).

Devoir #5 : grammaires LR(0), SLR(1), LR(1), LALR(1) 15/7 10 Lab #7 : Exercices: grammaires LR(1) et LALR(1).

13 21/7

10 Générateurs d’analyseurs syntaxiques LR: Java CUP. [4] : 4.9

[6] : Doc de Java CUP 10 Lab #8 : Laboratoire supervisé sur Java CUP

Devoir #6 : Programmer un parseur avec Java CUP.

22/7 1-10 Révision finale

14 28/7 10 Consultation au laboratoire sur Java CUP 29/7 10 Consultation au laboratoire sur Java CUP 15 4/8 10 Consultation au laboratoire sur Java CUP

15 5/8 Période des examens finaux (du 5 au 15 août)

* 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 %

(6)

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

2.4 Échéancier des devoirs Devoir Spécification

donnée le

Thème Pondération Date de remise

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

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

2 13 mai Programmer un analyseur lexical avec JFlex 5 % 3 juin

3 3 juin Grammaires LL(1) 5 % 10 juin

4 10 juin Programmer un parseur avec JavaCC 10 % 15 juillet

5 14 juillet Grammaires LR(0), SLR(1), LR(1) et LALR(1) 5 % 22 juillet

6 21 juillet Programmer un parseur avec JavaCUP 10 % 4 août

Directives particulières

 Certains devoirs seront individuels, d’autres pourront être faits 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-à-dire lisible et compréhensible pour le correcteur

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

o complète, c’est-à-dire que toutes les étapes de résolution du problème sont présentes ; o concise, c’est-à-dire que la 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. D’autres livres complémentaires sont suggérés. Tous les programmes et les diapositives présentés dans le cours sont disponibles sur le site du cours.

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

[2] Appel, A. and Palsberg, J. Modern Compiler Implementation in Java. Second Edition. Cambridge, 2004.

[3] Wolper, P. Introduction à la calculabilité, 3è édition. Dunod, 2006

[4] Aho, A., Lam, M., Sethi R., Ullman J. Compilers: Principles, Techniques, and Tools, 2nd Edition. Addison Wesley, 2007.

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

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

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

Références

Documents relatifs

• JFlex sera utilisé plus tard pour générer un analyseur lexical pour Java CUP un outil de génération d’analyseurs syntaxiques. • Jflex permet beaucoup

Par conséquent, si x, u, et y sont les mots représentés par la figure précédente, tous les mots de la forme xu*y sont accepté par l’automate et font partie du langage Autrement

- Nous avons vu qu’un langage est un ensemble de mots où un mot est une chaîne de symboles (caractères) d’un alphabet fini.. - Pour les langages réguliers (par exemple, le langage

- On vient de voir qu’en calculant First(S) ou First(XYS) on doit tenir compte des non-terminaux qui pourraient dériver la chaîne vide et de ceux qui pourraient les suivre dans

 Parce que les deux règles ont la même fonction d’analyse (c-à-d., la fonction correspondant au non terminal dans la partie gauche de chaque production).. Si elle partagent le

– Si le symbole est un non terminal, l’attribut pourrait être une donnée calculée en utilisant les actions sémantiques. – Une grammaire avec des attributs est appelée

• Pouvoir programmer un analyseur syntaxique récursif pour une grammaire donnée. • Connaître les fondements d’un générateur d’analyseur syntaxique LL tel

- 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