Mengapa Anda tidak menyederhanakan sedikit, persyaratan Anda?
Jangan gunakan parser penuh, terlalu rumit, dan bahkan tidak perlu untuk kasus Anda.
Buat perulangan, tulis pesan yang mewakili "prompt" Anda, bisa menjadi jalur Anda saat ini.
Tunggu string, "parsing" string, dan lakukan sesuatu tergantung pada isi string.
String dapat "parse" seperti mengharapkan garis, di mana spasi adalah pemisah ("tokenizer"), dan karakter lainnya dikelompokkan.
Contoh.
Output program (dan tetap di baris yang sama): / user / files / Pengguna menulis (di baris yang sama) daftar semua;
Program Anda akan menghasilkan daftar, koleksi, atau susunan seperti
list
all;
atau jika ";" dianggap sebagai pemisah seperti spasi
/user/files/
list
all
Program Anda bisa mulai dengan mengharapkan satu instruksi tunggal, tanpa "pipa" unix-style, tidak ada redirection gaya windowze.
Program Anda dapat membuat kamus instruksi, setiap instruksi, mungkin memiliki daftar parameter.
Pola desain perintah berlaku untuk kasus Anda:
http://en.wikipedia.org/wiki/Command_pattern
Ini pseudocode "c polos", tidak diuji atau selesai, hanya sebuah gagasan tentang bagaimana bisa dilakukan.
Anda juga bisa membuatnya lebih berorientasi objek, dan dalam bahasa pemrograman, Anda suka.
Contoh:
// "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()
Anda tidak menyebutkan bahasa pemrograman Anda. Anda juga dapat menyebutkan bahasa pemrograman apa pun, tetapi lebih disukai "XYZ".