Por que você não simplifica um pouco seus requisitos?
Não use um analisador completo, é muito complexo e até desnecessário para o seu caso.
Faça um loop, escreva uma mensagem que represente seu prompt, pode ser o caminho atual.
Aguarde uma sequência, "analise" a sequência e faça algo dependendo do seu conteúdo.
A string pode "analisar" como esperar uma linha, na qual os espaços são os separadores ("tokenizer") e o restante dos caracteres são agrupados.
Exemplo.
O programa gera (e permanece na mesma linha): / user / files / O usuário grava (na mesma linha) lista tudo;
Seu programa irá gerar uma lista, coleção ou matriz como
list
all;
ou se ";" é considerado um separador como espaços
/user/files/
list
all
Seu programa pode começar esperando uma única instrução, sem "pipes" no estilo unix, nem redirecionamento no estilo windowze.
Seu programa pode criar um dicionário de instruções, cada instrução, pode ter uma lista de parâmetros.
O padrão de design do comando se aplica ao seu caso:
http://en.wikipedia.org/wiki/Command_pattern
Esse pseudocódigo "simples c" não foi testado ou finalizado, apenas uma idéia de como poderia ser feito.
Você também pode torná-lo mais orientado a objetos e, na linguagem de programação, desejar.
Exemplo:
// "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()
Você não mencionou sua linguagem de programação. Você também pode mencionar qualquer linguagem de programação, mas preferencialmente "XYZ".