您为什么不简化一点,您的要求呢?
不要使用完整的解析器,它过于复杂,甚至对于您的案例来说都是不必要的。
进行循环,写一条表示“提示”的消息,可以作为您当前的路径。
等待一个字符串,“解析”该字符串,然后根据字符串的内容执行某些操作。
该字符串可以像预期的一行一样“解析”,其中的空格是分隔符(“ tokenizer”),其余字符被分组。
例。
程序输出(并保持在同一行中):/ user / files /用户写入(在同一行中)所有列表;
您的程序将生成一个列表,集合或数组,例如
list
all;
或者如果 ”;” 被认为是空格之类的分隔符
/user/files/
list
all
您的程序可以从期望一条指令开始,而没有Unix风格的“管道”,也没有windowze风格的重定向。
您的程序可以制作一个指令字典,每个指令可能都有一个参数列表。
命令设计模式适用于您的情况:
http://en.wikipedia.org/wiki/Command_pattern
这是一个“纯c”伪代码,未经测试或完成,仅是关于如何完成的构想。
您还可以使其更面向对象,并且可以使用编程语言。
例:
// "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”。