Introduction 1. Le générateur de scanners (F)LEX. Introduction 2. Interaction LEX-YACC. INFO010 Théorie des langages Partie pratique



Documents pareils
Interpréteur d algèbre relationnelle

Quelques éléments de compilation en C et makefiles

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

Générer un analyseur avec Flex&Bison

Algorithmique et Programmation, IMA


TP 1. Prise en main du langage Python

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

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

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

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Programmation système I Les entrées/sorties

ALGORITHMIQUE ET PROGRAMMATION En C

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

V- Manipulations de nombres en binaire

Cours 1 : La compilation

Outils pour la pratique

Cours Informatique 1. Monsieur SADOUNI Salheddine

Chap III : Les tableaux

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Rappels Entrées -Sorties

Cours Programmation Système

ACTIVITÉ DE PROGRAMMATION

IV- Comment fonctionne un ordinateur?

Programmation en langage C

Introduction au langage C

Le langage C. Séance n 4

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

PROJET 1 : BASE DE DONNÉES REPARTIES

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

Programme awk------introduction rapide

Programmation C. Apprendre à développer des programmes simples dans le langage C

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

Les structures. Chapitre 3

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Les processus légers : threads. Système L3, /31

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

Le langage C. Introduction, guide de reference

Les chaînes de caractères

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Java Licence Professionnelle CISII,

Théorie de la Programmation

Introduction à l algorithmique et à la programmation M1102 CM n 3

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

Programmation en Java IUT GEII (MC-II1) 1

STAGE IREM 0- Premiers pas en Python

Présentation du langage et premières fonctions

Programmation C++ (débutant)/instructions for, while et do...while

Cours d Algorithmique et de Langage C v 3.0

Traduction des Langages : Le Compilateur Micro Java

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

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

Machines virtuelles fonctionnelles (suite) Compilation ML Java

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

Évaluation et implémentation des langages

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

Cours 1 : Qu est-ce que la programmation?

Corrigé des exercices sur les références

Cours 1: Java et les objets

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

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

Cours d algorithmique pour la classe de 2nde

Informatique Générale

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Cegid Business Line. Version 2008 Release 2. Service d'assistance Téléphonique

Cours Langage C/C++ Programmation modulaire

TP1. Outils Java Eléments de correction

Approche Contract First

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

LES TYPES DE DONNÉES DU LANGAGE PASCAL

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Manuel d'installation

Programmation par les Objets en Java

Ingénierie Dirigée par les Modèles. Editeurs de modèles. (Eclipse Modeling Tools) Jean-Philippe Babau

TP : Gestion d une image au format PGM

OCL - Object Constraint Language

OS Réseaux et Programmation Système - C5

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Algorithmique, Structures de données et langage C

Sendmail milter/greylisting

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Programmation système en C/C++

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Le prototype de la fonction main()

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

ERETES-SERIES. Support de formation. Formation ERETES ERETES-SERIE 1/58

1/ Présentation de SQL Server :

Polytech Montpellier IG PROJET C Réseaux sociaux : recherche de composantes fortement connexes

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

Initiation. àl algorithmique et à la programmation. en C

Programmer en JAVA. par Tama

INFO-F-105 Language de programmation I Séance VI

Transcription:

Introduction 1 Le générateur de scanners (F)LEX INFO010 Théorie des langages Partie pratique LEX est un outil qui permet de générer automatiquement un scanner à partir d une spécification. Il est souvent utilisé en conjonction avec YACC (générateur d analyseur syntaxique), qui fera l objet d un prochain TP... Il existe une version GNU de LEX, qui s appelle FLEX, ainsi que de YACC, qui s appelle BISON. S. COLLETTE et G. GEERAERTS /19 Introduction 2 Interaction LEX-YACC L input de LEX est une spécification, formée de paires d expressions régulières et de code C ; LEX s en sert pour générer un fichier source C, implémentant le scanner sour la forme d une fonction : yylex() ; L exécutable, obtenu après compilation, analyse son input pour trouver des occurences des expressions régulières de la spécification, et exécute le code C associé. Description des tokens Specification Lex include lex.yy.c yy.tab.h Fichiers.c auxiliaires GCC Grammaire Specification Yacc yy.tab.c Compilateur.3/19

Format d une spécification LEX Format en trois parties, séparées par des : Partie 1 : Déclaration de variables, de constantes et de définitions régulières ; Les définitions régulières sont utilisées comme des «macros» dans les actions ; Par exemple : chiffre [0-9] Format d une spécification LEX Format en trois parties, séparées par des : Partie 2 : Règles de traduction, de la forme : ExpReg {Action ExpReg est une expression régulière étendue ; Action est un fragment de code C, qui sera exécuté chaque fois qu un token satisfaisant ExpReg est rencontré. Les actions peuvent faire appel aux expressions régulières de la partie 1 grâce aux { ; Par exemple : {chiffre {Action... ;.5/19 Format d une spécification LEX Variables spéciales accessibles Format en trois parties, séparées par des : Partie 3 : Procédures de l utilisateur. Par exemple : main() si le scanner n est pas utilisé avec YACC ou BISON. Dans les actions, on peut accéder à certaines variables spéciales : yyleng : contient la taille du token reconnu ; yytext : est une variable de type char* qui pointe vers la chaîne de caractères reconnue par l expression régulière. yylval : qui permet de passer des valeurs entières à YACC... Il existe aussi une action spéciale : ECHO qui équivaut à printf("%s",yytext)..5/19

Exemple chiffre [0-9] lettre [a-z] [A-Z] {lettre({chiffre {lettre)* { printf("j ai reconnu l identifiant: %s de longueur %d\n", yytext, yyleng) ; ({chiffre)+ { printf("j ai reconnu un nombre\n") ; ECHO ; main(){ yylex() ; Compilation Pour obtenir l exécutable du scanner : On commence par compiler le fichier lex.yy.c : gcc -c lex.yy.c... ce qui crée le fichier lex.yy.o ; On compile les autres fichiers.c ; On linke le tout avec la librairie libl (libfl pour FLEX) : gcc -o executable fichier1.o... fichiern.o lex.yy.o -ll.7/19 Exercices Exercice 5 1. Écrire un filtre qui compte le nombre de caractères, de mots et de lignes d un fichier ; 2. Écrire un filtre qui numérote les lignes d un fichier (hormis les lignes blanches) ; 3. Écrire un filtre qui n imprime que les commentaires d un programmes. Ceux-ci sont compris entre { ; 4. Écrire un filtre qui transforme un texte en remplaçant le mot compilateur par beurk si la ligne début par a, par schtroumpf si la ligne débute par b et par youpi!! si la ligne débute par c. Écrire une fonction d analyse lexicale à l aide de LEX. Les tokens reconnus seront : Les nombres décimaux (en notation scientifique) ; Les identifiants de variables ; Les opérateurs relationnels (<, >,, etc) ; Les mots-clefs si, sinon et alors. Cette fonction a pour but d être utilisée dans un analyseur syntaxique écrit en YACC..9/19

Exercice 1 Solution Exercice 1 Solution chiffre [0-9] lettre [a-z] [A-Z] alphanum {chiffre {lettre blanc " " int Nb_Car, Nb_Word, Nb_Line; % ({alphanum)+ {ECHO; Nb_Car += yyleng; Nb_Word++; ({blanc)+ {ECHO; Nb_Car += yyleng; \n {ECHO; Nb_Line++; { Nb_Car=Nb_Word=Nb_Line=0; yylex() ; /* pas de return */ printf("\nnb_car=%d\nnb_word=%d\nnb_line=%d\n\n", Nb_Car,Nb_Word,Nb_Line); return(1); 1/19 Exercice 2 Solution Exercice 3 Solution blanc " " \t #define yywrap() 1 /* GNU flex */ int Nb_Line = 1; % ^({blanc)* { \n { ^.* {printf("[%d] %s\n",nb_line, yytext) ; Nb_Line++; { yylex(); return(1); "{"([^{])+"" {ECHO;. \n { { yylex(); return(1); 3/19

Exercice 4 Solution Exercice 4 Solution int i; % \n {ECHO; i=0; ^a {ECHO; i=1; ^b {ECHO; i=2; ^c {ECHO; i=3; compilateur {if(i==1) printf("beurk"); if(i==2) printf("schtroumpf"); if (i==3) printf("youpi!!"); if(i==0) printf("compilateur");. {ECHO; { i=0; yylex(); return(1); 5/19 Exercice 5 Solution Exercice 5 Solution #define PPQ 1 #define PPE 2 /* etc... */ % /*Definition regulieres*/ delim [ \t\n] bl {delim+ lettre [A-Za-z] chiffre [0-9] id {lettre+({lettre {chiffre)* nombre {chiffre+(\.{chiffre+)?(e[+-]?{chiffre+)? {bl {/* Pas d action, pas de retour */ si {return(si); alors {return(alors); sinon {return(sinon); {id {yylval=rangerid(); return(id); {nombre{yylval=rangernb(); return(nombre); "<" {yylval=ppq; return(oprel); "<=" {yylval=ppe; return(oprel); "=" {yylval=ega; return(oprel); "<>" {yylval=dif; return(oprel); 7/19

Exercice 5 Solution ">" {yylval=pgq; return(oprel); ">=" {yylval=pge; return(oprel); RangerId() { /* Ranger dans la table des symboles le lexeme yytext */ RangerNb() { /*Idem pour un nombre (Conversion)*/ 9/19