왜 요구 사항을 약간 단순화하지 않습니까?
전체 파서, 너무 복잡하고 귀하의 경우에 필요하지 않은 구문 분석기를 사용하지 마십시오.
루프를 만들고 "프롬프트"를 나타내는 메시지를 작성하면 현재 경로가 될 수 있습니다.
문자열을 기다렸다가 "파싱"하고 문자열의 내용에 따라 무언가를합니다.
문자열은 줄을 예상하는 것처럼 "구문 분석"할 수 있으며, 공백은 구분 기호 ( "토큰 라이저")이며 나머지 문자는 그룹화됩니다.
예.
프로그램은 출력하고 같은 줄에 유지됩니다. / user / files / 사용자는 같은 줄에 모든 것을 씁니다.
프로그램은 다음과 같은 목록, 컬렉션 또는 배열을 생성합니다
list
all;
또는 ";"인 경우 공백과 같은 구분자로 간주됩니다.
/user/files/
list
all
여러분의 프로그램은 유닉스 스타일의 "파이프"없이, 윈도즈 스타일의 리디렉션이 아닌 하나의 단일 명령을 기대함으로써 시작할 수 있습니다.
프로그램은 명령어 사전을 만들 수 있으며, 각 명령어마다 매개 변수 목록이있을 수 있습니다.
명령 디자인 패턴은 다음과 같은 경우에 적용됩니다.
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"가 바람직합니다.