Neden gereksinimlerinizi biraz kolaylaştırmıyorsunuz?
Tam bir çözümleyici kullanmayın, çok karmaşık ve davanız için gereksiz.
Bir döngü yapın, "isteminizi" temsil eden bir mesaj yazın, bulunduğunuz yol olabilir.
Bir dizgiyi bekleyin, dizgiyi "ayrıştırın" ve dizginin içeriğine bağlı olarak bir şeyler yapın.
Dize, boşlukların ayırıcı ("tokenizer") olduğu ve diğer karakterlerin gruplandığı bir satır beklemek gibi "ayrıştırılabilir".
Örnek.
Program çıktı verir (ve aynı satırda kalır): / user / files / Kullanıcı yazar (aynı satırda) hepsini listeler;
Programınız bir liste, koleksiyon veya benzeri bir dizi oluşturacak
list
all;
ya da eğer ";" boşluk gibi bir ayırıcı olarak kabul edilir
/user/files/
list
all
Programınız, ne windowze tarzı yönlendirme, unix tarzı "borular" olmadan tek bir komut bekleyerek başlayabilir.
Programınız bir talimatlar sözlüğü yapabilir, her komutta bir parametre listesi bulunabilir.
Komut tasarım deseni sizin durumunuz için geçerlidir:
http://en.wikipedia.org/wiki/Command_pattern
Bu bir "düz c" sözde kodu, test edilmedi veya bitmedi, sadece nasıl yapılabileceğine dair bir fikir.
Daha fazla nesne yönelimli de yapabilirsiniz ve programlama dilinde de hoşunuza gider.
Örnek:
// "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()
Programlama dilinden bahsetmedin. Ayrıca herhangi bir programlama dilinden ancak tercihen "XYZ" den bahsedebilirsiniz.