Warum vereinfachen Sie nicht ein bisschen Ihre Anforderungen?
Verwenden Sie keinen vollständigen Parser, der für Ihren Fall zu komplex und sogar unnötig ist.
Machen Sie eine Schleife, schreiben Sie eine Nachricht, die Ihre "Eingabeaufforderung" darstellt, kann der aktuelle Pfad sein, den Sie sind.
Warten Sie auf eine Zeichenfolge, "analysieren" Sie die Zeichenfolge und führen Sie je nach Inhalt der Zeichenfolge einen Vorgang aus.
Die Zeichenfolge könnte wie erwartet eine Zeile "parsen", in der die Trennzeichen ("Tokenizer") und die restlichen Zeichen gruppiert sind.
Beispiel.
Das Programm gibt Folgendes aus (und bleibt in derselben Zeile): / user / files / Der Benutzer schreibt (in derselben Zeile), liste alle auf;
Ihr Programm generiert eine Liste, Sammlung oder ein Array wie
list
all;
oder wenn ";" wird wie Leerzeichen als Trennzeichen betrachtet
/user/files/
list
all
Ihr Programm könnte mit einer einzigen Anweisung beginnen, ohne "Pipes" im Unix-Stil und ohne Umleitung im Windowze-Stil.
Ihr Programm könnte ein Wörterbuch mit Anweisungen erstellen, wobei jede Anweisung möglicherweise eine Liste von Parametern enthält.
Das Befehlsentwurfsmuster gilt für Ihren Fall:
http://en.wikipedia.org/wiki/Command_pattern
Dieser Pseudocode "plain c" ist weder getestet noch fertiggestellt, sondern nur eine Vorstellung davon, wie dies geschehen könnte.
Sie könnten es auch objektorientierter gestalten und in der Programmiersprache, die Sie mögen.
Beispiel:
// "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()
Sie haben Ihre Programmiersprache nicht erwähnt. Sie können auch jede Programmiersprache erwähnen, vorzugsweise jedoch "XYZ".