なぜあなたの要件を少し簡素化しないのですか?
完全なパーサーを使用しないでください。複雑すぎて、場合によっては不要です。
ループを作成し、youtの「プロンプト」を表すメッセージを記述して、現在のパスにすることができます。
文字列を待ち、文字列を「解析」し、文字列の内容に応じて何かを行います。
文字列は、行が期待されるように「解析」できます。この場合、スペースが区切り文字(「トークン化機能」)であり、残りの文字はグループ化されます。
例。
プログラムは出力します(そして同じ行にとどまります):/ 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」が望ましいです。