TP : Les expressions arithmétiques

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

TP 1 : 1 Calculs en binaire, octal et hexadécimal

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours de Programmation 2

Cours 1 : La compilation

Chapitre 1 I:\ Soyez courageux!

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

Le chiffre est le signe, le nombre est la valeur.

CH.6 Propriétés des langages non contextuels

Quelques éléments de compilation en C et makefiles

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

LE PROBLEME DU PLUS COURT CHEMIN

Représentation d un entier en base b

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

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

Annexe : La Programmation Informatique

Recherche dans un tableau

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

USTL - Licence ST-A 1ère année Codage de l information TP 1 :

Tutoriel code::blocks

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Conception de circuits numériques et architecture des ordinateurs

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

Télécom Nancy Année

COMMUNICATEUR BLISS COMMANDE PAR UN SENSEUR DE POSITION DE L'OEIL

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Brique BDL Gestion de Projet Logiciel

Compte-rendu de projet de Système de gestion de base de données

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

Cours 1 : Qu est-ce que la programmation?

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

Chap III : Les tableaux

Conditions : stage indemnisé, aide au logement possible, transport CEA en Ile-de-France gratuit.

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Représentation des Nombres

Cours Informatique Master STEP

Programmation parallèle et distribuée (Master 1 Info )

Calculer avec Sage. Revision : 417 du 1 er juillet 2010

Informatique Générale

Licence Sciences, Technologies, Santé Mention Informatique Codage de l'information

LES CARTES À POINTS : POUR UNE MEILLEURE PERCEPTION

Rappels sur les suites - Algorithme

TRAITEMENT AUTOMATIQUE DES LANGUES. Licence d'informatique 2ème Année Semestre 1. Département d'informatique Université de Caen Basse-Normandie

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

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

TP2 - Conguration réseau et commandes utiles. 1 Généralités. 2 Conguration de la machine. 2.1 Commande hostname

Créer le schéma relationnel d une base de données ACCESS

Compilation. Algorithmes d'analyse syntaxique

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

L informatique en BCPST

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

I. Introduction aux fonctions : les fonctions standards

GOL-502 Industrie de services. Travaux Pratique / Devoir #7

Une version javascript sera disponible directement dans le cours prochainement.

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

chapitre 4 Nombres de Catalan

ALGORITHMIQUE ET PROGRAMMATION En C

Licence Sciences et Technologies Examen janvier 2010

Généralités sur le Langage Java et éléments syntaxiques.

La mémoire. Un ordinateur. L'octet. Le bit

Logiciel Libre Cours 3 Fondements: Génie Logiciel

FAIRE SES COMPTES AVEC GRISBI

Chapitre 10. Les interfaces Comparable et Comparator 1

Cours d Informatique

Machines virtuelles Cours 1 : Introduction

Architecture matérielle des systèmes informatiques

ORACLE TUNING PACK 11G

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Puissances d un nombre relatif

Calcul de développements de Puiseux et application au calcul du groupe de monodromie d'une courbe algébrique plane

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

Par combien de zéros se termine N!?

Programmation en langage C

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51


Les structures. Chapitre 3

TEXT MINING von 7

IMPORTATION, CRÉATION, MANIPULATION, EXPORTATION DE DONNÉES STATISTIQUES

Calculabilité Cours 3 : Problèmes non-calculables.

Logiciel de Base. I. Représentation des nombres

Chapitre I Notions de base et outils de travail

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

Programmation Objet - Cours II

CNAM UE MVA 210 Ph. Durand Algèbre et analyse tensorielle Cours 4: Calcul dierentiel 2

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Dérivation : Résumé de cours et méthodes

2. RAPPEL DES TECHNIQUES DE CALCUL DANS R

Algorithmique et programmation : les bases (VBA) Corrigé

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

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Méthodes de développement. Analyse des exigences (spécification)

L'instruction if permet d'exécuter des instructions différentes selon qu'une condition est vraie ou fausse. Sa forme de base est la suivante:

Application 1- VBA : Test de comportements d'investissements

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

TP1. Outils Java Eléments de correction

Les suites numériques

Transcription:

Univ. Lille1 - Licence Informatique 2ème année 2012-2013 Algorithmes et Programmation Impérative 2 TP : Les expressions arithmétiques Objectifs : Travailler sur les arbres binaires. Les utiliser pour représenter les expressions arithmétiques et les évaluer. 1 Le matériel Pour ce TP vous aurez besoin du module sur les arbres binaires, ainsi que du module Lexemes que vous avez déjà utilisé pour l'évaluation d'expressions postxées. Attention, le module Lexemes dont vous aurez besoin est légèrement modié par l'ajout de deux lexèmes pour les parenthèses. Cette version modiée se trouve dans le matériel que vous allez récupérer. Question 1 Récupérez le chier expression_arithmetique.zip et décompressez-le dans votre répertoire de travail. Vous devez obtenir 1. un chier calculette.ml contenant le code source d'un programme que vous compilerez en n de TP, 2. les deux chiers sources d'une nouvelle version du module Lexemes, 3. le chier interface d'un module dont vous réaliserez l'implémentation, 4. et la documentation au format HTML de ce dernier module ainsi que du nouveau module Lexemes. Question 2 Faîtes aussi une copie des deux chiers d'interface et d'implémentation du module Arbre_binaire dans votre répertoire de travail. Question 3 Recopiez le texte ci-dessous dans un chier nommé Makefile. MODULES = lexemes arbre_binaire expression_arithmetique MODULESCMI = $(addsuffix.cmi, $(MODULES)) MODULESCMO = $(addsuffix.cmo, $(MODULES)) calculette: calculette.ml $(MODULESCMO) ocamlc -o $@ $(MODULESCMO) $< expression_arithmetique.cmo: expression_arithmetique.ml $(MODULESCMI) $(MODULESCMO) ocamlc -c lexemes.cmo arbre_binaire.cmo expression_arithmetique.ml %.cmo: %.ml %.cmi ocamlc -c $< %.cmi: %.mli ocamlc -c $< Rappel : les actions qui suivent les cibles doivent être précédées d'une tabulation et non d'espaces. 1

Ce Makefile contient quatre cibles accompagnées de dépendances et des actions pour réaliser ces cibles. 1. La première cible pour compiler le programme nal calculette. Il vous faudra auparavant réaliser l'implémentation du module Expression_arithmetique. Cette cible dépend du chier source calculette.ml et des chiers compilés des modules Lexemes, Arbre_binaire et Expression_arithmetique. 2. La deuxième cible pour compiler l'implémentation du module Expression_arithmetique. Cette cible dépend évidemment de son chier source, mais aussi de la version compilée de son interface, et des chiers compilés des deux autres modules. 3. La troisième cible est destinée à compiler les implémentations des deux autres modules. 4. Et la dernière cible pour produire les versions compilées des interfaces. Ce Makefile sera bien utile pour les compilations que vous aurez à eectuer dans la suite. Question 4 À l'aide de ce Makefile, compilez les interfaces et implémentations des modules Lexemes et Arbre_binaire. 2 Les expressions arithmétiques complètement parenthésées Les expressions arithmétiques considérées dans ce TP sont des expressions inxées complètement parenthésées : inxées parce que leur écriture place l'opérateur arithmétique entre les deux opérandes, autrement dit c'est l'écriture communément employée ; complètement parenthésées parce qu'hormis les nombres toutes les expressions composées de deux opérandes et un opérateur sont parenthésées. Ainsi il n'y a pas de problème de priorité des opérateurs, c'est le parenthésage qui le xe. On peut décrire les expressions arithmétiques à l'aide d'une grammaire qui décrit la syntaxe des expressions correctes. Expr ::= Nombre ( Expr Op Expr ) Op ::= + - * / % Nombre ::= [0-9]+ La première ligne de cette grammaire indique que syntaxiquement il existe deux sortes d'expressions arithmétiques inxées complètement parenthésées : 1. les nombres 2. et les expressions débutant par une parenthèse ouvrante, suivie d'une expression arithmétique, suivie d'un opérateur, suivi d'une autre expression arithmétique, suivi enn d'une parenthèse fermante. La deuxième ligne de la grammaire précise quels sont syntaxiquement les opérateurs autorisés. Ici, les opérateurs usuels de l'addition et de la soustraction (+ et -), l'astérisque (*) pour la multiplication, et deux opérateurs pour la division entière : la barre oblique (/) pour le quotient et le pourcent (%) pour le reste. Et la dernière ligne indique que les nombres s'écrivent avec un nombre quelconque non nul de symboles compris entre 0 et 9. En particulier, le symbole - n'est pas autorisé, et les nombres négatifs ne sont donc pas autorisés dans nos expressions. 2

Quelques exemples d'expressions arithmétiques correctes : 12, 3, 5,... : ce sont des nombres (positifs) ; (12 + 3) : on trouve bien une parenthèse ouvrante, une expression arithmétique ( 12), un opérateur (+), une expression arithmétique (3) et une parenthèse fermante ; ((12 + 3) 5) : (12 + 3) et 5 sont deux expressions arithmétiques correctes séparées par un opérateur, le tout encadré par des parenthèses. En revanche, les expressions ci-dessous ne sont pas correctes du point de vue de la syntaxe décrite par la grammaire : (12) : les nombres ne doivent pas être parenthésés ; 12 + 3 : les expressions composées à l'aide d'un opérateur doivent être parenthésées ; (12 + 3 5) : à chaque opérateur doit correspondre un couple de parenthèses. 3 Le module Expression_arithmetique Dans cette partie, vous allez réaliser l'implémentation du module Expression_arithmetique, que vous mettrez naturellement dans un chier expression_arithmetique.ml. Durant cette implémentation, il vous faudra valider chacune des fonctionnalités réalisées. Cette validation se fera par des tests au niveau d'un interpréteur du langage dans lequel les modules Lexemes et Arbre_binaire auront préalablement été chargés. > ocaml lexemes.cmo arbre_binaire.cmo Question 5 Avant de commencer, étudiez la documentation du module. 3.1 Le type La structure récursive binaire des expressions arithmétiques amène naturellement à les représenter par des arbres binaires. Les n uds de ces arbres sont étiquetés par 1. des opérateurs pour les n uds internes, 2. des nombres entiers pour les feuilles. Pour les étiquettes, vous utiliserez le type lexeme du module Lexemes. Question 6 Déclarez le type t pour les expressions arithmétiques, ainsi que l'exception Expression_incorrecte. Remarque : Cette déclaration de type pour les expressions arithmétiques inclut des arbres qui ne correspondent à aucune expression arithmétique. 1. l'arbre vide ; 2. les arbres dont certain n uds n'ont qu'un seul ls ; 3. les arbres étiquetés par les lexèmes Par_ouvrante et Par_fermante ; 4. les arbres dont certaines feuilles sont étiquetés par des opérateurs ; 5. et les arbres dont certains n uds internes sont étiquetés par des nombres. Dans l'immédiat, vous ferez l'hypothèse que les arbres manipulés par les fonctions suivantes (hormis la dernière) ne font pas partie de l'un des cas énumérés ci-dessus. Ce sera le rôle du constructeur de_chaine de s'assurer de ne produire que des arbres valides. 3

Question 7 Dans un chier, nommé par exemple exples_expressions.ml, déclarez une variable de type Expression_arithmetique.t pour chacune des expressions suivantes : 1. expr 1 = 12 2. expr 2 = 3 3. expr 3 = 5 4. expr 4 = (12 + 3) 5. expr 5 = (3 5) 6. expr 6 = ((12 + 3) 5) 7. expr 7 = (12 + (3 5)) Vous utiliserez ces déclarations pour vérier les fonctions que vous réaliserez dans la suite. 3.2 Conversion en chaîne de caractères Question 8 Réalisez la fonction en_chaine. Question 9 Vériez votre fonction avec les expressions déclarées dans le chier exples_expressions.ml. 3.3 Évaluation Question 10 Réalisez la fonction evalue. Question 11 Vériez votre fonction avec les expressions déclarées dans le chier exples_expressions.ml. 3.4 Analyse syntaxique Vous voici arrivés au point le plus délicat de ce TP. Il consiste à réaliser la dernière fonction de notre module : de_chaine. Cette fonction est chargée de construire une expression arithmétique, c'est-à-dire un arbre, à partir de son écriture linéaire sous forme de chaîne de caractères. Cette construction se fait en deux étapes. 1. Une première étape d'analyse lexicale qui a pour but de décomposer la chaîne de caractères en éléments lexicaux (lexèmes) de base, à savoir : parenthèses ouvrante et fermante, nombres et opérateurs, tout en vériant que la chaîne de caractères ne contient bien que des caractères autorisés. C'est la fonction lexemes du module Lexemes qui est chargée de ce travail. Si tout se passe bien, elle renvoie une liste de lexèmes. Dans le cas contraire elle déclenche une exception Caractere_non_autorise. 2. La seconde étape d'analyse syntaxique qui est chargée de vérier la conformité de la liste de lexèmes produite par l'analyse lexicale à la grammaire qui décrit la syntaxe des expressions arithmétiques inxées complètement parenthésées. Si cette liste est bien conforme, la fonction renvoie un arbre représentant l'expression décrite par la chaîne. Dans le cas contraire, elle déclenche l'exception Expression_incorrecte. Question 12 Réalisez la fonction de_chaine. Question 13 Vériez la validité de cette fonction avec les expressions valides et non valides de votre choix. Par exemple 4

en_chaine (de_chaine "((12 + 3) * 5)" en_chaine (de_chaine "(12 + 3 * 5)" 3.5 Compilation Question 14 Compilez l'implémentation du module que vous venez de réaliser. Utilisez votre Makefile. 4 Le programme calculette Question 15 Compilez le programme calculette. Question 16 Eectuez des tests. Les expressions arithmétiques que vous passez sur la ligne de commandes peuvent avoir besoin d'être entourées de ". >./calculette "((12 + 3) * 5)" 75 5