Perché non semplifichi un po 'le tue esigenze?
Non usare un parser completo, è troppo complesso e persino inutile per il tuo caso.
Crea un ciclo, scrivi un messaggio che rappresenta il tuo "prompt", può essere il percorso corrente che sei.
Attendi una stringa, "analizza" la stringa e fai qualcosa a seconda del contenuto della stringa.
La stringa potrebbe "analizzare" come aspettarsi una linea, in cui gli spazi sono i separatori ("tokenizer"), e il resto dei caratteri sono raggruppati.
Esempio.
Il programma emette (e rimane nella stessa riga): / user / files / L'utente scrive (nella stessa riga) elenca tutti;
Il tuo programma genererà un elenco, una raccolta o un array come
list
all;
o se ";" è considerato un separatore come gli spazi
/user/files/
list
all
Il tuo programma potrebbe iniziare prevedendo una singola istruzione, senza "pipe" di tipo unix, né reindirizzamento di tipo windowze.
Il tuo programma potrebbe creare un dizionario di istruzioni, ciascuna istruzione potrebbe avere un elenco di parametri.
Il modello di progettazione del comando si applica al tuo caso:
http://en.wikipedia.org/wiki/Command_pattern
Questo pseudocodice "semplice c", non è testato o finito, solo un'idea di come si potrebbe fare.
Potresti anche renderlo più orientato agli oggetti e, nel linguaggio di programmazione, ti piace.
Esempio:
// "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()
Non hai menzionato il tuo linguaggio di programmazione. Puoi anche citare qualsiasi linguaggio di programmazione, ma preferibilmente "XYZ".