Tại sao bạn không đơn giản hóa một chút, yêu cầu của bạn?
Đừng sử dụng một trình phân tích cú pháp đầy đủ, nó quá phức tạp và thậm chí không cần thiết cho trường hợp của bạn.
Tạo một vòng lặp, viết một thông báo đại diện cho "dấu nhắc" của bạn, có thể là đường dẫn hiện tại của bạn.
Đợi một chuỗi, "phân tích" chuỗi và làm một cái gì đó tùy thuộc vào nội dung của chuỗi.
Chuỗi có thể "phân tích" như mong đợi một dòng, trong đó khoảng trắng là dấu phân cách ("mã thông báo") và phần còn lại của các ký tự được nhóm lại.
Thí dụ.
Các đầu ra chương trình (và nằm trong cùng một dòng): / user / files / Người dùng ghi (trong cùng một dòng) liệt kê tất cả;
Chương trình của bạn sẽ tạo ra một danh sách, bộ sưu tập hoặc mảng như
list
all;
hoặc nếu ";" được coi là một dấu phân cách như khoảng trắng
/user/files/
list
all
Chương trình của bạn có thể bắt đầu bằng cách mong đợi một hướng dẫn duy nhất, không có "đường ống" kiểu unix, không chuyển hướng kiểu windowze.
Chương trình của bạn có thể tạo một từ điển hướng dẫn, mỗi hướng dẫn, có thể có một danh sách các tham số.
Mẫu thiết kế lệnh áp dụng cho trường hợp của bạn:
http://en.wikipedia.org/wiki/Command_potype
Đây là một mã giả "đơn giản c", không được kiểm tra hoặc hoàn thành, chỉ là một ý tưởng về cách có thể được thực hiện.
Bạn cũng có thể làm cho nó hướng đối tượng hơn, và trong ngôn ngữ lập trình, bạn thích.
Thí dụ:
// "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()
Bạn đã không đề cập đến ngôn ngữ lập trình của bạn. Bạn cũng có thể đề cập đến bất kỳ ngôn ngữ lập trình nào, nhưng tốt nhất là "XYZ".