Classe interpreteur de commandes

Soyez le premier à donner votre avis sur cette source.

Vue 6 350 fois - Téléchargée 333 fois

Description

Cette classe aide à la conception d'interpreteur de lignes de commandes.

Source / Exemple :


Voici le programme de test lié à cette classe.

#include "interpret.hpp"

#include<iostream>
using namespace std;

// Quelques fonctions libres et functor de traitement
// (arguments passés en chaine de caractère)
void f_traitement1( string const & args ) { cout << "Appel de T1 (" << args << ")" << endl; }
void f_traitement2( string const & args ) { cout << "Appel de T2 (" << args << ")" << endl; }
void f_traitement3( string const & args ) { cout << "Appel de T3 (" << args << ")" << endl; }

struct f_traitement4 : t_functor {
	void operator()(std::string const & args) const { cout << "Appel de T4 (" << args << ")" << endl; }
};

struct f_traitement5 : t_functor {
	void operator()(std::string const & args) const { cout << "Appel de T5 (" << args << ")" << endl; }
};

struct f_traitement6 : t_functor {
	void operator()(std::string const & args) const { cout << "Appel de T6 (" << args << ")" << endl; }
};

// programme de test
int main()
{
	// Instanciation des functors
	f_traitement4 f_inst_traitement4;
	f_traitement5 f_inst_traitement5;
	f_traitement6 f_inst_traitement6;
	
	// Instanciation de l'interpreteur
	t_interpreteur it(' ','\n');

	// Initialisation de l'interpreteur
	it.lier( "t1", &f_traitement1 );
	it.lier( "t2", &f_traitement2 );
	it.lier( "t3", &f_traitement3 );
	it.lier( "t4", &f_inst_traitement4 );
	it.lier( "t5", &f_inst_traitement5 );
	it.lier( "t6", &f_inst_traitement6 );
	it.lier( "t1+4", &f_traitement1 );
	it.lier( "t1+4", &f_inst_traitement4 );

	// Serie de tests

	it( "" ); 		
	// rien		

	it( "t1\n" ); 
	// Appel de T1 ()

	it( "t2 a b c d\n" );
	// Appel de T2 (a b c d)

	it( "t1\nt2 a b c d\n" );
	// Appel de T1 ()
	// Appel de T2 (a b c d)

	it( "t1\nt2 a b c d\nt4\nt3 d f e\nt6\nt6\n" );
	// Appel de T1 ()
	// Appel de T2 (a b c d)
	// Appel de T4 ()
	// Appel de T3 (d f e)
	// Appel de T6 ()
	// Appel de T6 ()

	it( "t1+4 x y z\nt1\n" );
	// Appel de T1 (x y z)
	// Appel de T4 (x y z)
	// Appel de T1 ()

	// Cas d'erreur
	try
	{
		it( "t6\nt0\n" ); 
	}
	catch( t_interpreteur::ex_interpreteur & e )
	{
		cout << e.what() << " " << e.ligne_commande_erronee << endl;
	}
	// Appel de T6 ()
	// exception interpreteur : commande inconnue t0

	try
	{
		it( "t1" ); 
	}
	catch( t_interpreteur::ex_interpreteur & e )
	{
		cout << e.what() << " " << e.ligne_commande_erronee << endl;
	}
	// exception interpreteur : commande inconplete t1	
	
}

Conclusion :


Je termine le code un peu à l'arrache.... ne vous précipitez pas sur les oublis ! Je compte l'améliorer dans les prochains jours.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
1
Compile également sans problème avec gcc 3.2.3 sur RedHat Enterprise Linux AS Release 3. Pas de warning.
Bien fait.
Tu devrais peut-être ajouter "foncteur" à la liste des mots clé...
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Bonjour, merci !

Je ne vois pas ce qui pose probleme, le saut de ligne ? le throw ? Peut etre en précisant les types ex_commande_incomplete et ex_commande_inconnue de en ajoutant "t_interpreteur::" devant ?

Je vous invite soit à utiliser un autre compilateur gratuit (Visual Express ou GCC pour Windows).

Amicalement,
Xter.
Messages postés
1
Date d'inscription
samedi 18 novembre 2006
Statut
Membre
Dernière intervention
6 décembre 2006

Ce code est excellent !
Il est simple ET puissant.

Par contre, j'ai une erreur de compilation avec TurboC++ (je parle du successeur de C++Builder).

[C++ Erreur] interpret.cpp(36): E2303 Nom de type attendu
pour la ligne

void t_interpreteur::operator()( std::string ligne_commande ) const
throw( ex_commande_incomplete, ex_commande_inconnue )

Pourriez-vous y jeter un oeil (TC++ est gratuit) ?
Pour être honnête, je ne comprends pas cette ligne...
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Ca risque de devenir une unsine à gaz mais l'idée est loin d'être bete...

Bonne chance pour ton application.
Messages postés
46
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
31 juillet 2006

c'est exactement ce que je recherchais
il faudrait integrer ca avec le parseur XML pour pouvoir avoir un script plus lisible ^^
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.