Pourquoi ne simplifiez-vous pas un peu vos exigences?
N'utilisez pas un analyseur complet, c'est trop complexe et même inutile pour votre cas.
Faites une boucle, écrivez un message qui représente votre "invite", peut être le chemin actuel que vous êtes.
Attendez une chaîne, "analysez" la chaîne et faites quelque chose en fonction du contenu de la chaîne.
La chaîne pourrait "analyser" comme attendre une ligne, dans laquelle les espaces sont les séparateurs ("tokenizer"), et le reste des caractères sont regroupés.
Exemple.
Le programme génère (et reste sur la même ligne): / user / files / L'utilisateur écrit (sur la même ligne) liste tout;
Votre programme va générer une liste, une collection ou un tableau comme
list
all;
ou si ";" est considéré comme un séparateur comme des espaces
/user/files/
list
all
Votre programme pourrait commencer par attendre une seule instruction, sans "tuyaux" de style Unix, ni redirection de style windowze.
Votre programme pourrait créer un dictionnaire d'instructions, chaque instruction peut avoir une liste de paramètres.
Le modèle de conception de commande s'applique à votre cas:
http://en.wikipedia.org/wiki/Command_pattern
Ce pseudocode "plain c" n'est ni testé ni terminé, juste une idée de la façon de le faire.
Vous pouvez également le rendre plus orienté objet, et dans le langage de programmation, vous aimez.
Exemple:
// "global function" pointer type declaration
typedef
void (*ActionProc) ();
struct Command
{
char[512] Identifier;
ActionProc Action;
};
// global var declarations
list<char*> CommandList = new list<char*>();
list<char*> Tokens = new list<char*>();
void Action_ListDirectory()
{
// code to list directory
} // Action_ListDirectory()
void Action_ChangeDirectory()
{
// code to change directory
} // Action_ChangeDirectory()
void Action_CreateDirectory()
{
// code to create new directory
} // Action_CreateDirectory()
void PrepareCommandList()
{
CommandList->Add("ls", &Action_ListDirectory);
CommandList->Add("cd", &Action_ChangeDirectory);
CommandList->Add("mkdir", &Action_CreateDirectory);
// register more commands
} // void PrepareCommandList()
void interpret(char* args, int *ArgIndex)
{
char* Separator = " ";
Tokens = YourSeparateInTokensFunction(args, Separator);
// "LocateCommand" may be case sensitive
int AIndex = LocateCommand(CommandList, args[ArgIndex]);
if (AIndex >= 0)
{
// the command
move to the next parameter
*ArgIndex = (*ArgIndex + 1);
// obtain already registered command
Command = CommandList[AIndex];
// execute action
Command.Action();
}
else
{
puts("some kind of command not found error, or, error syntax");
}
} // void interpret()
void main(...)
{
bool CanContinue = false;
char* Prompt = "c\:>";
char Buffer[512];
// which command line parameter string is been processed
int ArgsIndex = 0;
PrepareCommandList();
do
{
// display "prompt"
puts(Prompt);
// wait for user input
fgets(Buffer, sizeof(Buffer), stdin);
interpret(buffer, &ArgsIndex);
} while (CanContinue);
} // void main()
Vous n'avez pas mentionné votre langage de programmation. Vous pouvez également mentionner n'importe quel langage de programmation, mais de préférence "XYZ".