Perché non semplifichi un po 'le tue esigenze?
Non utilizzare un parser completo, è troppo complesso e persino non necessario 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 in base al contenuto della stringa.
La stringa potrebbe "analizzare" come se si aspettasse una linea, in cui gli spazi sono i separatori ("tokenizer") e il resto dei caratteri sono raggruppati.
Esempio.
Il programma emette (e rimane sulla 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, if ";" è considerato un separatore come spazi
/user/files/
list
all
Il tuo programma potrebbe iniziare aspettandosi una singola istruzione, senza "pipe" in stile Unix, né reindirizzamento in stile windowze.
Il tuo programma potrebbe creare un dizionario di istruzioni, ogni istruzione può avere un elenco di parametri.
Il modello di progettazione del comando si applica al tuo caso:
link
Questo è uno pseudocodice "plain c", non testato o finito,
solo un'idea di come potrebbe essere fatto.
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 menzionare qualsiasi linguaggio di programmazione, ma preferibilmente "XYZ".