Classe interpreteur de commandes

4/5 (8 avis)

Vue 6 902 fois - Téléchargée 384 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
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
19 août 2005 à 20:24
Merci à celui qui a déposé 1/10 de laisser un message d'explication. Je pense que ce n'est pas trop en demandé :-)
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
21 août 2005 à 12:05
Salut xterminhate,

Merci pour la source, c'est pas mal du tout ! Pas exactement ce à quoi je m'attendais mais j'y ai deja appris pas mal de choses, et je n'ai pas encore tout analysé !
Le programme va droit au but, il n'y a rien d'inutile ou de superflu, bravo.
Je n'ai jamais fait de C++ approfondi auparavant, juste du "C avec classe" (j'ai lu ca dans un autre poste) donc il faut que je m'habitue.
Puis je l'implanterai dans ma source.

Compilation sans erreur avec VC++ 6.0 mais 299 warning, puis 39 en mettant le warning level au minimum.
Tu compiles avec quoi ?
Je n'ai pas de compilateur sur le PC que j'utilise là et je ne me souviens plus du warning recurrent. Sans doute du coté des <...>. C'est assez genant si on recherche d'autres warning.

Sur ce, @+ et encore merci !
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
21 août 2005 à 12:41
Merci pour ton appréciation.

VC6 est une usine à warnings lorsqu'on exploite les composants de la STL.

Je te propose d'y regarder de plus pres en semaine, histoire d'éliminer un maximum de warnings.

Je compile avec GCC et je n'ai aucun warning.

N'hésite pas à me demander des évolutions pour adapter ce source à tes besoins.

Cordialement,
Xterm-in'Hate.
Mattpbem Messages postés 46 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 31 juillet 2006
16 avril 2006 à 19:53
c'est exactement ce que je recherchais
il faudrait integrer ca avec le parseur XML pour pouvoir avoir un script plus lisible ^^
cs_exar Messages postés 286 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 22 avril 2012 2
12 févr. 2008 à 11:52
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é...

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.