Чому ви трохи не спрощуєте свої вимоги?
Не використовуйте повний аналізатор, його занадто складний і навіть непотрібний для вашого випадку.
Зробіть цикл, напишіть повідомлення, яке представляє вас "підказка", може бути поточним шляхом, на якому ви знаходитесь.
Зачекайте рядок, "розберіть" рядок і зробіть щось залежно від вмісту рядка.
Рядок може "розбиратися", як очікування рядка, в якому пробіли є роздільниками ("токенізатором"), а решта символів згруповані.
Приклад.
Програма виводить (і залишається в одному рядку): / user / files / Користувач пише (у тому ж рядку) список усіх;
Ваша програма генерує подібний список, колекцію чи масив
list
all;
або, якщо ";" вважається роздільником як пробіли
/user/files/
list
all
Ваша програма може розпочатися, очікуючи однієї інструкції, без "дудків" у стилі unix, а також перенаправлення у стилі вікон.
Ваша програма може скласти словник інструкцій, кожна інструкція може мати список параметрів.
Шаблон дизайну команд застосовується до вашого випадку:
http://en.wikipedia.org/wiki/Command_pattern
Цей псевдокод "звичайного с" не перевіряється і не закінчується, а лише уявлення про те, як це можна зробити.
Ви також можете зробити його більш орієнтованим на об'єкт, і мовою програмування вам подобається.
Приклад:
// "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()
Ви не згадали про свою мову програмування. Ви також можете згадати будь-яку мову програмування, але бажано "XYZ".