আপনি কেন আপনার প্রয়োজনীয়তাগুলি কিছুটা সহজ করেন না?
একটি সম্পূর্ণ পার্সার ব্যবহার করবেন না, এটি খুব জটিল এবং এমনকি আপনার মামলার জন্য অযৌক্তিক।
একটি লুপ তৈরি করুন, একটি বার্তা লিখুন যা আপনাকে "প্রম্পট" উপস্থাপন করে, আপনি যে বর্তমান পথ হতে পারেন তা হতে পারে।
স্ট্রিংয়ের জন্য অপেক্ষা করুন, স্ট্রিংটিকে "পার্স" করুন এবং স্ট্রিংয়ের বিষয়বস্তুর উপর নির্ভর করে কিছু করুন।
স্ট্রিংটি কোনও রেখার প্রত্যাশার মতো "পার্স" করতে পারে, যেখানে স্পেসগুলি বিভাজক ("টোকেনাইজার") হয় এবং বাকী অক্ষরগুলি গোষ্ঠীভুক্ত হয়।
উদাহরণ।
প্রোগ্রাম আউটপুট (এবং একই লাইনে থাকে): / ব্যবহারকারী / ফাইল / ব্যবহারকারী লিখেছেন (একই লাইনে) সমস্ত তালিকা;
আপনার প্রোগ্রামটি একটি তালিকা, সংগ্রহ বা অ্যারের মতো তৈরি করবে
list
all;
অথবা যদি ";" স্থানগুলির মতো পৃথককারী হিসাবে বিবেচিত
/user/files/
list
all
আপনার প্রোগ্রামটি ইউনিক্স-স্টাইল "পাইপ" ছাড়াই একটি একক নির্দেশের প্রত্যাশা দিয়ে শুরু করতে পারে, উইন্ডোজ-স্টাইলের পুনঃনির্দেশ নয়।
আপনার প্রোগ্রামে প্রতিটি নির্দেশের নির্দেশাবলীর একটি অভিধান তৈরি করতে পারে, পরামিতিগুলির একটি তালিকা থাকতে পারে।
কমান্ড ডিজাইনের ধরণটি আপনার ক্ষেত্রে প্রযোজ্য:
http://en.wikipedia.org/wiki/Command_pattern
এটি একটি "প্লেইন সি" সিউডোকোড, পরীক্ষা বা সমাপ্ত নয়, কীভাবে এটি করা যায় তার একটি ধারণা।
আপনি এটিকে আরও অবজেক্ট ওরিয়েন্টেড এবং প্রোগ্রামিং ভাষায় আপনার পছন্দ করতে পারেন।
উদাহরণ:
// "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()
আপনি আপনার প্রোগ্রামিং ভাষার উল্লেখ করেননি। আপনি যে কোনও প্রোগ্রামিং ভাষার উল্লেখ করতে পারেন, তবে তবে "এক্সওয়াইজেড"।