¿Por qué no simplificas un poco tus requisitos?
No use un analizador completo, es demasiado complejo e incluso innecesario para su caso.
Haga un bucle, escriba un mensaje que represente su "solicitud", puede ser la ruta actual que es.
Espere una cadena, "analice" la cadena y haga algo dependiendo del contenido de la cadena.
La cadena podría "analizar" como si esperara una línea, en la que los espacios son los separadores ("tokenizer"), y el resto de los caracteres están agrupados.
Ejemplo.
El programa genera (y permanece en la misma línea): / user / files / El usuario escribe (en la misma línea) enumera todos;
Su programa generará una lista, colección o matriz como
list
all;
o si ";" se considera un separador como espacios
/user/files/
list
all
Su programa podría comenzar esperando una sola instrucción, sin "canalizaciones" de estilo unix, ni redirección de estilo de ventana.
Su programa podría hacer un diccionario de instrucciones, cada instrucción puede tener una lista de parámetros.
El patrón de diseño del comando se aplica a su caso:
http://en.wikipedia.org/wiki/Command_pattern
Este es un pseudocódigo "simple c", no se ha probado ni terminado, solo una idea de cómo se podría hacer.
También podría hacerlo más orientado a objetos y, en el lenguaje de programación, le guste.
Ejemplo:
// "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()
No mencionaste tu lenguaje de programación. También puede mencionar cualquier lenguaje de programación, pero preferiblemente "XYZ".