CSC 4508 - Traduction: CF1 TP noté, 22 Mai 2015 Corrigé

0 - Consignes

Rendre sur la plate-forme Moodle, une archive Nom.tar.gz (ou .tgz) contenant uniquement les fichiers utiles. C'est-à-dire :

Par contre :

Prévoir éventuellement de rendre plusieurs versions pour le même exercice. Par exemple : une version qui marche mais fait presque rien et une version qui fait presque tout mais ne marche pas du tout !

Les 3 parties du TP sont indépendantes et de poids différents :

I - Nombres Romains (flex seul)

Pour une description détaillée des nombres romains, on pourra consulter les pages Wikipedia Numération Romaine ou Roman numerals

On se limitera à l'usage "classique" des nombres romains entre 1 et 4999 construits à partir des chiffres :

IVXLCDM
1510501005001000

soit les premiers nombres :
IIIIIIIVVVIVIIVIIIIX
123456789

Travail demandé

Veni, Vidi, Vici ou Veni, Vidi, Victus ?

Corrigé :

II - Addition selon Turing (bison seul)

Sur l'alphabet Σ={a,b,c}, on considère le langage L = { anbpcn+p | p≥0,n≥0 }.
Prouvez que ce langage est algébrique déterministe. (Oups ! de la théorie !)

En pratique, construisez une spécification Bison sans conflit qui reconnaît le langage L.
Le langage est alors algébrique puisque décrit par une grammaire context-free, et déterministe puisque reconnaissable sans conflit par Bison.

Travail demandé

Indications

On pourra, par étape, rechercher des grammaires context-free pour :

On propose un squelette de spécification alan.bison qui permet de se passer de Flex. Utilisation : " bison -o alan.c alan.bison; gcc -o alan alan.c "

On donne aussi le code Astar.c qui permet de générer tout les mots de taille donnée sur un alphabet. Si on adapte la spécification pour compter et imprimer le nombre total de lignes syntaxiquement correctes, on aura la vérification expérimentale sous la forme "Astar abc N | alan" qui doit pour N = 0, 1, 2, 3, 4, ... , imprimer 1, 0, 2, 0, 3,...

Corrigé :

III - Expressions Vectorielles (flex+bison)

Remerciements : Michel Meynard

L'objectif de cet exercice est d'écrire un interpréteur capable de reconnaître et d'évaluer des expressions arithmétiques et vectorielles. Les expressions sont construites à partir des composants suivants :

Quelques exemples :

1- YASH (Yet another shell)

Cette partie est indépendante des expressions vectorielles. Elle est non bloquante pour la suite qui pourra être réalisée directement à partir du squelette de départ fourni

On donne un squelette d'interpréteur de commande ligne à ligne avec les fichiers yash0.flex et yash0.bison. On recommande l'utilisation des fichiers génériques du cours Makefile, proto-color.h

Travail demandé

Étudier et tester l'interpréteur Yash0.

Compléter l'interpréteur pour :

Exemple de résultat

yash> hello # fuck!
Nice to meet you
yash> thanks; ; hello @ fuck # fuck                                          
You are welcome
Nice to meet you
yash> hello; zzzzzz ; hello
Nice to meet you
<syntax error, unexpected $undefined, expecting NEWLINE or CMD_SEP>
Command invalide: 
Nice to meet you
yash> fuck # oups!
<Semantic Error : Censored !>
Ligne invalide
yash> fuck ; bye
<Semantic Error : Censored !>
Command invalide: 
See you

Corrigé :

2- Expressions scalaires et vectorielles

Écrire l'analyseur syntaxique qui valide, évalue et imprime le résultat pour des expressions scalaires et des expressions vectorielles. Les expressions sont à intégrer comme des commandes dans l'interpréteur Yash.

On prendra soin d'assurer soit au niveau syntaxique, soit au niveau sémantique, la consistance des expressions. On n'ajoute pas un vecteur et un scalaire, on ne multiplie pas 2 vecteurs,... et l'on additionne que des vecteurs de même taille.

Indications

Corrigé :

3- Matrix ! ou d'autres extensions

Étendre l'analyseur dans l'une au choix des 3 directions proposées. Pour chacune des directions l'énoncé reste ouvert sur le travail à faire et la façon de le réaliser.

Prévoir de rendre une version stable de la question précédente avant de tout casser avec les extensions.

3.a) Calcul Matriciel

Intégrer des Matrices à deux dimensions.

En terme de syntaxe, on peut écrire une matrice comme un vecteur de vecteurs ([[1,2],[2,3],[3,4]]) en fixant une convention ligne par ligne ou colonne par colonne. On peut aussi différentier des vecteurs horizontaux "[]" et des vecteurs verticaux "{}" et permettre 2 écritures pour une même matrice ( {[1,2,3],[3,4,5]} == [{1,3},{2,4},{3,5}] )

Les expressions définies précédemment s'appliquent sur les matrices. Les vecteurs deviennent une cas particuliers de matrices avec une dimension égale à 1..

NB: la fonction "dim()" retourne maintenant un vecteur à deux composantes au lieu d'un scalaire.

3.b) Utilisation de variables typées

Intégrer des variables permettant d'enregistrer les valeurs des expressions scalaires ou vectorielles. Les variables devront être typées.

Il convient donc de gérer :

On pourra gérer une table de symbole rudimentaire avec un nombre fini de "Nom_variable" (A-Z, V_0..V_99,..) ou utiliser l'implémentation générique de tables de symboles fournie dans le cours.

3.c) Des réels et Quelques opérations en plus

Remplacer les valeurs scalaires entières par des réelles signés et ajouter dans les expressions :

Corrigé : pas de corrigé

CSC 4508, Télécom SudParis, Pascal Hennequin Last modified: Mai 2015