3MMALG11 Soutien S03

De Ensiwiki
Aller à : navigation, rechercher
AttentionCette page est maintenue uniquement par les enseignants. Afin de ne pas perturber le déroulement des cours, elle n'a pas vocation à être modifiée par les élèves. Mais si vous avez des modifications à proposer, merci d'en discuter ou d'envoyer un e-mail aux auteurs de la page (cf. historique)

Correction du P12

Vous trouverez ici l'automate correspondant au programme commentaires de l'exercice P12.

Il faut donc modifier le code comme suit :

  • ajouter Consomme := False; dans l'état LuFinChaine ;
  • implanter l'état LuApostrophePuisMoins comme ci-dessous :
         when LuApostrophePuisMoins =>
            if CarCour = '-' then
               EtatCour := EstDansCommentaire;
            else
               EtatCour := Principal;
            end if;

Exercice préliminaire sur les automates

On va commencer par un exercice simple implantant un automate reconnaisseurs de séquences. On veut écrire un programme capable de reconnaitre la séquence de caractères décrite par l'expression régulière suivante : a + bc(c^*), c'est à dire soit un 'a', soit un 'b' suivi d'au moins un 'c'. On suppose le flux de caractère infini et on doit prendre en compte les recouvrements. Le programme va analyser à la volée les caractères lus et afficher la trace "<vu>" à chaque fois qu'une séquence valide est détectée.

Par exemple, sur la séquence de caractères "bbabbcccb", le programme affichera "bba<vu>bbc<vu>c<vu>c<vu>b". On utilisera la machine-caractères de type 1 vu en TD et TP pour lire les caractères (télécharger le fichier .ads et le fichier .adb). On ignorera les caractères différents de 'a', 'b' et 'c'.

Le programme a écrire sera en pratique une implantation de l'automate de Mealy suivant :

3MMALG11 Soutien FSM.png

On donne le squelette du programme à compléter :

with Ada.Text_IO, SeqCarM1;
use Ada.Text_IO, SeqCarM1;

procedure S03_E1 is

    type Etat is (Init, LuB, LuBC);
    EtatCour: Etat;

begin
    DemCar;
    EtatCour := Init;
    while not FinCar loop
        if CarCour in 'a' .. 'c' then
            case EtatCour is

--  A COMPLETER !

            end case;
        end if;
        AvCar;
    end loop;
    StopCar;
end;

Programme reconnaissant les commentaires

On a déjà travaillé sur cet exercice appelé P12. Le code fourni contient en fait 2 erreurs.

Pour les trouver, on recommande de commencer par dessiner l'automate correspondant au programme fourni, pour vous aider à comprendre son fonctionnement.

Ensuite, vous noterez aisément que tous les états de cet automate ne sont pas implanté dans le programme fourni : cela doit vous mettre sur la piste de la première erreur (on rappelle que les programmes analysés sont supposés syntaxiquement corrects).

Pour la deuxième erreur, vous avez simplement besoin de savoir qu'en Ada, on peut afficher des guillemets à l'intérieur d'une chaine de caractères simplement en en écrivant deux consécutifs. Par exemple, Put_Line("Le caractere guillemets "" peut etre affiche dans une chaine"); donnera à l'écran Le caractere guillemets " peut etre affiche dans une chaine.