Université de Nice-Sophia Antipolis Licence d Informatique 3 e année Analyses TP N 1. Programmation manuelle d un analyseur lexical

Documents pareils
Programmation système I Les entrées/sorties

Le prototype de la fonction main()

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)

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

Introduction au langage C

INFO-F-404 : Techniques avancées de systèmes d exploitation

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

Testez votre installation. Créer un répertoire vide

Le système de gestion des fichiers, les entrées/sorties.


Programmation système de commandes en C

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Exercices sur SQL server 2000

Programmation impérative

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

3IS - Système d'exploitation linux - Programmation système

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

Contents Windows

Programmation en langage C

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

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Programmation en langage C Eléments de syntaxe

Java Licence Professionnelle CISII,

How to Login to Career Page

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Logiciel Libre Cours 2 Fondements: Programmation

SUPPORT DE COURS. Langage C

Algorithmique et Programmation, IMA

TP2 : tableaux dynamiques et listes chaînées

Instructions Mozilla Thunderbird Page 1

Cours 6 : Tubes anonymes et nommés

Arguments d un programme

Lesson Plan Physical Descriptions. belle vieille grande petite grosse laide mignonne jolie. beau vieux grand petit gros laid mignon

Les fichiers. Chapitre 4

Projet de programmation (IK3) : TP n 1 Correction

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Programmation Réseau SSH et TLS (aka SSL)

Application Form/ Formulaire de demande

France SMS+ MT Premium Description

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

Cours de programmation avancée. Le langage C. Université du Luxembourg

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

Once the installation is complete, you can delete the temporary Zip files..

that the child(ren) was/were in need of protection under Part III of the Child and Family Services Act, and the court made an order on

Cours Bases de données 2ème année IUT

The new consumables catalogue from Medisoft is now updated. Please discover this full overview of all our consumables available to you.

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Programmation système en C/C++

Paris Airports - Web API Airports Path finding

Cours 14 Les fichiers

Logitech Tablet Keyboard for Windows 8, Windows RT and Android 3.0+ Setup Guide Guide d installation

Instructions pour mettre à jour un HFFv2 v1.x.yy v2.0.00

WiFi Security Camera Quick Start Guide. Guide de départ rapide Caméra de surveillance Wi-Fi (P5)

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

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

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

Township of Russell: Recreation Master Plan Canton de Russell: Plan directeur de loisirs

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

COMPARAISONDESLANGAGESC, C++, JAVA ET

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

OS Réseaux et Programmation Système - C5

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

Modernisation, développement d applications et DB2 sous IBM i Technologies, outils et nouveautés Volubis.fr

I. Programmation I. 1 Ecrire un programme en Scilab traduisant l organigramme montré ci-après (on pourra utiliser les annexes):

Compression de Données - Algorithme de Huffman Document de Conception

et Active Directory Ajout, modification et suppression de comptes, extraction d adresses pour les listes de diffusion

TP: Représentation des signaux binaires. 1 Simulation d un message binaire - Codage en ligne

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Arbres binaires de recherche

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Le langage C. Séance n 4

Cours Programmation Système

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

TD3: tableaux avancées, première classe et chaînes

Gestion Electronique de Document (ECM/GED)

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Exercice sur les Dockers

Cours de C. Allocation dynamique. Sébastien Paumier

Grégoire de Lassence. Copyright 2006, SAS Institute Inc. All rights reserved.

Cours de Programmation 2

PARIS ROISSY CHARLES DE GAULLE

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Programmation Classique en langage C

INF 104 (SELC) Introduction au langage C

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

Claude Delannoy. 3 e édition C++

Structure d un programme

Génie Logiciel avec Ada. 4 février 2013

Lier Erlang avec d autres langages de programmation

Les structures. Chapitre 3

Programmer en JAVA. par Tama

Programmation client-serveur sockets - RPC

Transcription:

1 Université de Nice-Sophia Antipolis Licence d Informatique 3 e année Analyses 2004 2005 TP N 1 Programmation manuelle d un analyseur lexical 1 Le langage Logo 1.1 Un peu d historique Le langage Logo a été developpé par Seymour PAPERT en 1967 comme un langage d apprentissage pour enfants. Le langage permet l expérimentation de la géométrie planaire par le biais de la programmation, mais a été largement étendu depuis. Dans sa version la plus simple, les déplacements d une tortue sont commandés par des scripts écrits en Logo de manière à dessiner sur l écran. Nous allons travailler sur un langage inspiré du langage Logo. Par exemple le programme suivant dessine un triangle équilatéral : avancer 100 tourner droite 120d avancer 100 tourner droite 120d avancer 100 1.2 Les lexèmes du langage Les lexèmes du langage sont identificateur, mot-clé, sens, opérateur, angle et nombre. L automate permettant leur reconnaissance est celui de la figure 1 (les mots-clés et sens sont reconnus par le même état de reconnaissance que les identificateurs). Précisons que les mots-clés sont tantque, si, sinon, pour, poser, lever, avancer et tourner, tandis que les sens sontgauche etdroite. 2 Question : Écrivez le programme C de l analyseur lexical pour ce langage inspiré du langage Logo. Il lira sur l entrée standard un fichier de texte et écrira sur la sortie standard les types des différents lexèmes reconnus. Voici un exemple d exécution : Exemple : l entrée standard : lever avancer 10 titi1 := 7r titi1:=7r 10toto<<x tourner # titi1 droite

2 a za Z0 9 h identificateur mot clé sens a za Z > g opérateur i : = = a + */=() f opérateur < >= e opérateur. 0 9. d nombre b gdr c angle 0 9 FIG. 1 L automate reconnaissant les lexèmes du langage inspiré de Logo. la sortie standard : mot-clé mot-clé nombre ident op angle ident op angle nombre ident op op ident mot-clé ERREUR ident sens /* lex_logo.c Hand-written lexer for Logo. Output: succession of ID, KEYWORD, DIRECTION, OP, ANGLE, NUMBER, ERROR and \n. Input: ID -> LETTER ( LETTER DIGIT )* KEYWORD -> WHILE IF ELSE FOR DOWN UP FORWARD TURN DIRECTION -> LEFT RIGHT OP -> SPE <> <= >=.. := ANGLE -> NUMBER [dgr] NUMBER -> DIGIT+ DIGIT -> [0-9]

3 */ LETTER -> [A-Za-z] SPE -> [+*-/=<>()] #include <stdlib.h> /* Utility functions, needed for exit */ #include <stdio.h> /* Input and output, needed for fopen etc. */ #include <ctype.h> /* Character class tests, needed for isalpha etc. */ #include <string.h> /* String functions, needed for strcasecmp etc. */ #include <assert.h> /* Diagnostics, needed for assert */ /* Axioms. You have to make sure these numbers will not interfere with other possible token values, like EOF, \n etc. */ #define ID 0 #define KEYWORD 1 #define DIRECTION 2 #define OP 3 #define ANGLE 4 #define NUMBER 5 #define ERROR 6 /* Various definitions */ #define OPCHARS " + /=() < >.: " #define ANGLES " gdr " #define WHILE " tantque " #define IF " s i " #define ELSE " sinon " #define FOR " pour " #define DOWN " poser " #define UP " l e ver " #define FORWARD " avancer " #define TURN " tourner " #define LEFT " gauche " #define RIGHT " d r o i t e " /* Define our own fgetc to ease tracing mistakes when TRACE is defined. */ int fgettok (FILE* f) int c = fgetc (f); #ifdef TRACE switch (c) case EOF: printf (" ## read : EOF\ n "); break; case : printf (" ## read : _ \ n "); break; case \ t : printf (" ## read : \ \ t \ n "); break; case \ n : printf (" ## read : \ \ n \ n "); break; default: printf (" ## read : %c \ n ", c); #endif /* TRACE */ return c; /* Return the next recognized axiom from the input file f. */

4 int lexer (FILE *f) int token; assert (f!= NULL); token = fgettok (f); /* test for EOF and whitespace */ if (token == EOF isspace(token)) return token; /* test for OP */ if (strchr (OPCHARS, token)!= NULL) switch (token) case : : if (fgettok (f)!= = ) return ERROR; break; case. : if (fgettok (f)!=. ) return ERROR; break; case < : token = fgettok (f); /* Here we are looking ahead to see if we are in an <> or an <=. When looking ahead, one has to remember to ungetc the lookahead token in case of a failure. */ if (token!= > token!= = ) break; case > : token = fgettok (f); if (token!= = ) return OP; /* test for NUMBER or ANGLE */ if (isdigit (token)) /* There is a look ahead operation hidden in this while loop. */ while (isdigit (token = fgettok (f))); if (strchr (ANGLES, token)) return ANGLE; else return NUMBER; /* test for ID, KEYWORD and DIRECTION */ if (isalpha (token))

5 char word[bufsiz]; unsigned int index = 0; do assert (index < BUFSIZ); word[index++] = token; while (isalnum (token = fgettok (f))); assert (index < BUFSIZ); word[index] = \0 ; if (strcasecmp (word, LEFT) == 0 strcasecmp (word, RIGHT) == 0) return DIRECTION; else if (strcasecmp (word, WHILE) == 0 strcasecmp (word, IF) == 0 strcasecmp (word, ELSE) == 0 strcasecmp (word, FOR) == 0 strcasecmp (word, DOWN) == 0 strcasecmp (word, UP) == 0 strcasecmp (word, FORWARD) == 0 strcasecmp (word, TURN) == 0) return KEYWORD; else return ID; /* otherwise, send an ERROR */ return ERROR; /* The main returns 0 on a successful lexing, 1 on an erroneous parameter number, 2 on an erroneous filename and 3 on an unsuccessful lexing. */ int main (int argc, char *argv[]) FILE *f; int axiom, ret = 0; if (argc!= 2) fprintf (stderr, " Usage : %s <filename >\n", argv[0]); exit (1); f = fopen (argv[1], " r "); if (f == NULL) perror (argv[1]); exit (2); while ((axiom = lexer (f))!= EOF)

6 switch (axiom) case ID: printf (" i d e n t "); break; case KEYWORD: printf (" mot clé "); break; case DIRECTION: printf (" sens "); break; case OP: printf (" op "); break; case ANGLE: printf (" angle "); break; case NUMBER: printf (" nombre "); break; case ERROR: printf ("ERREUR "); ret = 3; break; case \ n : putchar ( \ n ); break; fclose (f); return ret;.............................................................................................