-
Cette fois-ci, en traitant plusieurs chaînes à la suite, sans devoir
relancer le programme à chaque fois.
fichier accept_bcl.cpp
#include "../automates/auto.h"
#include <iostream>
#include <string>
using namespace std;
int main () {
cout << "Bonjour ! \nJe suis le programme de reconnaissance \nSortie par CTRL-D \n";
while(true){
string lu;
cout << "Donnez une chaîne\n";
if (!getline(cin, lu)){
cout << "Au-revoir !\n";
break; // sortie de la boucle, fin de l'exécution
}
// on a lu une chaîne...
int start = 0;
if( analyser(lu, start) ){
cout << "Oui\n";
}else{
cout << "Non\n";
}
}//while
return 0;
}
-
trouver une sous-chaîne de la chaîne-candidate qui fait partie du
langage
- la première de gauche à droite
- et la plus longue possible
(implémentation "par force brutale", sans souci d'efficacité).
fichier match_sg.cpp
// La première sous-chaîne, la plus longue
#include "../automates/auto.h"
#include <iostream>
#include <string>
using namespace std;
int main () {
cout << "Bonjour ! \nJe suis le programme de 'match'\n";
string lu;
cout << "Donnez une chaîne\n";
getline(cin, lu);
int k = lu.length();
int i; // indice de début de la sous-chaîne à tester
for( i = 0; i< k; i++ ){ // boucle extérieure
//cout << i << "\n";
int j; // indice de fin de la sous-chaîne à tester
for( j = k; j >= i; j-- ){ // boucle intérieure
string cand = lu.substr(i, j-i);
//cout << cand << "\n";
int start = 0;
if( analyser(cand, start) ){
cout << cand <<"\n";
break; // sort de la boucle intérieure
}
} // for intérieur
if( j >= i ) break; // on est sorti de la boucle avant la fin,
// c'est donc qu'on a trouvé, et on sort
} // for extérieur
if( i == k ) cout << "no match\n";
return 0;
}
-
fichier
matchAll.cpp
à utiliser avec redirection d'un fichier en entrée, par
%./matchAll < try.txt
// Toutes les plus longues sous-chaînes
#include "../automates/auto.h"
#include <iostream>
#include <string>
using namespace std;
int main () {
string lu;
getline(cin, lu, '\0'); // censé être un fichier par redirection
int k = lu.length();
int i;
for( i = 0; i< k; i++ ){ // boucle extérieure
int j;
for( j = k; j > i; j-- ){ // boucle intérieure
string cand = lu.substr(i, j-i);
int start = 0;
if( analyser(cand, start) ){
cout << cand <<"\n";
break; // sort de la boucle intérieure
}
}// for intérieur
if( j > i ) i = j; // et on repart
} // for extérieur
return 0;
}