CSC 4508 - Traduction: TP noté 2014 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 :

Le TP comprend 3 exercices totalement indépendants et de difficultés différentes.
On utilisera des directories différents pour chaque exercice.

1 - Analyse syntaxique d'expressions booléennes

(source Michel Meynard)

L'objectif de cet exercice est d'écrire une calculette capable de reconnaître et d'évaluer des expressions logique d'ordre 0.

De manière similaire aux expressions arithmétiques, les expressions logiques d'ordre 0 sont construites à partir des composants suivants :

Les expressions logiques sont évaluées de gauche à droite. L'ordre de priorité des opérateurs est : {"|", "=>", "<=>", "^"} << "&" << "!". Les associativités droites ou gauches des opérateurs sont à préciser.

Pour la lisibilité des expressions, on ajoutera :

Exemples (fichier test)

0 | 1                   # == VRAI
( vrai | 0 ) & false    # == FAUX
1 | ( 0  & faux)        # == VRAI
vrai | 0 & false        # == VRAI si priorités correctes
faux => vrai            # == VRAI; NB  A=>B  ==  Non A  ou  B
faux <=> vrai           # == FAUX 
t = ( 1 ^ 0 ) & not 0   # Affectation variable t (a VRAI)
0 | t                   # == VRAI car t==VRAI
t & ! t | 1             # == VRAI
( 0 | (1 & 1 )          # erreur syntaxique
0 <= 1                  # erreur lexicale
t & u                   # erreur execution : variable u non initialisee
u = t ^ u               # idem

Travail demandé

  1. Ecrire un analyseur syntaxique qui évalue (imprime VRAI ou FAUX) des expressions logiques d'ordre 0 écrites ligne à ligne.
  2. Ajouter à cette calculette la fonctionnalité suivante :
  3. Ajouter enfin le traitement des erreurs avec génération de messages comme : "Expression incorrecte", "Utilisation de variable non initialisée", "Warning, affectation de variable déjà initialisée" ...
Corrigé
  

2 - Analyse de Messages Internet (mail) au format RFC822

L'objectif est de pouvoir analyser la structure d'un mail Internet afin de produire un rapport sommaire sur les entêtes utilisées et les tailles des constituants du message.

La syntaxe d'un email est décrite dans le RFC822 (Syntaxe BNF complète en annexe D, version simplifiée en annexe B).
Elle peut être synthétisée comme suit :

Exemples

Un exemple court (petit mail):

Return-Path: <Pascal.Hennequin@telecom-sudparis.eu>
Received: from alambix.int-evry.fr (alambix [157.159.100.57])
          by lor.int-evry.fr (8.8.0/jtpda-5.3) with ESMTP id KAA10453
          for <pascal@hugo>; Mon, 29 Apr 2013 10:48:43 +0200 (MET DST)
Received: (from pascal@localhost)
	by alambix.int-evry.fr (8.11.7p3+Sun/8.11.7) id r3T8mh021663
	for pascal; Mon, 29 Apr 2013 10:48:43 +0200 (MEST)
Date: Mon, 29 Apr 2013 10:48:43 +0200 (MEST)
From: Pascal Hennequin (LOR-AIGRI) <Pascal.Hennequin@telecom-sudparis.eu>
Message-Id: <201304290848.r3T8mh021663@alambix.int-evry.fr>
To: pascal@alambix.int-evry.fr.int-evry.fr
Subject: Juste un mail pour ce qu'il est
Status: O

Je suis un petit mail ... 

Entete_rfc822: Non, je ne suis pas une entete 

From / je ne suis pas un separateur du format Mbox 
fin

Un exemple plus long : Mail Plus Long

Travail demandé

  1. Ecrire un analyseur lexical qui lit un mail et identifie les unités lexicales "champs-entête" et "corps" de message. Pour les "\n" qui séparent ces unités lexicales, on pourra librement décider de les inclure ou non dans les unités lexicales.
  2. Compléter l'analyseur afin de produire un rapport avec la liste des "nom-champs", et la taille en nombre de caractères du "corps" du message.
  3. Ecrire un second analyseur qui pourra identifier des "mots" dans le "corps" du message et dans les "corps-champs". L'analyseur produira un rapport avec pour chaque champs d'entête et pour le corps de message le nombre de caractères, le nombre de mots et le nombre de lignes correspondant. Indication : utiliser les start-conditions de flex "%x" ou "%s".
Corrigé
  

3 - Les mots MEUMEU chez les Shadoks

(remerciements à Walther Franz Anton von Dyck)

Le peuple shadok ne connaît que quatre syllabes : "GA", "BU", "ZO" et "MEU". La transcription dans notre alphabet latin autorise indifféremment l'utilisation des minuscules ou des majuscules dans ces syllabes : "GA" == "ga" == "gA".
Tout les mots de la langue shadok sont obtenus par concaténation de ces syllabes fondamentales. Par exemple selon Wikipedia, "ZoGa" signifie pomper, "ZoBuGa" signifie pomper avec une petite pompe, et "ZoBuBuGa" signifie pomper avec une grosse pompe.

Le professeur Shadoko a défini la famille des mots "MeuMeu" comme suit :

Exemples

Le lecteur vérifiera en exercice les exemples suivants : (fichier test)

Travail demandé

  1. Décrire la famille des mots MeuMeu grâce à une grammaire context-free non ambiguë.
  2. Ecrire un analyseur (syntaxique+lexical) permettant de reconnaître les mots MeuMeu.

Indication

Le peuple Gibi, ennemi des shadoks, semble avoir un ensemble de mots comparable, mais à la place des syllabes Ga, Bu, Zo et Meu, ils utilisent des symboles ésotériques : {, [, ], }.

Corrigé

Le langage considéré est communement appelé l'ensemble des "mots bien parenthésés" (ici avec 2 paires de parentheses). En théorie des langages, Il s'agit des langages de Dyck qui jouent un rôle particulier dans le mesure où le théorème de Chomsky Schützenberger stipule qu'ils permettent de générer n'importe quel langage algébrique ("tout langage algébrique est une image homomorphe de l'intersection d'un langage rationnel avec une image homomorphe inverse du langage de Dyck sur deux paires de parenthèses" )

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