一个面向对象的命令行解析器

时间:2021-07-01 08:08:12
这个类能解析如下格式的参数:
  • -b
  • -h www.codeproject.com
  • stdafx.cpp
  • -temp:-7

除此以外,还可以解析以“”或“/”打头的参数。

一般有三类参数需要解析:

  • 作为标识的参数(例如“ls –l”),这叫空参数
  • 有其值的参数(例如“netstat –p tcp”),这叫值参数
  • 不带任何“-”的(例如“copy a.cpp b.cpp”),这叫默认参数。
一个面向对象的命令行解析器
一个面向对象的命令行解析器#include 
< map >
一个面向对象的命令行解析器#include 
< string >
一个面向对象的命令行解析器
一个面向对象的命令行解析器
一个面向对象的命令行解析器
#define  UNKNOWN_PARAM "UNKNOWN_PARAM"
一个面向对象的命令行解析器
#define  NO_VALUE_PARAM "PARAM_NO_VALUE"
一个面向对象的命令行解析器
#define  GENERIC_ERROR "GENERIC_ERROR"
一个面向对象的命令行解析器
一个面向对象的命令行解析器一个面向对象的命令行解析器
/**
一个面向对象的命令行解析器    Interface that must be implemented by the objects that requires access to the
一个面向对象的命令行解析器    command line arguments.
一个面向对象的命令行解析器    @see CCommandLineParser
一个面向对象的命令行解析器
*/

一个面向对象的命令行解析器
class  ICmdLineParam
一个面向对象的命令行解析器一个面向对象的命令行解析器
{
一个面向对象的命令行解析器
public:
一个面向对象的命令行解析器一个面向对象的命令行解析器    
/**
一个面向对象的命令行解析器         Method called by the CCommandLineParser to pass the arguments and the values.
一个面向对象的命令行解析器         The parser calls this method to indicate the name of the arguments and/or
一个面向对象的命令行解析器         the values only when applicable. The '-' or '/' of the arguments are eliminated
一个面向对象的命令行解析器         before reach this method.
一个面向对象的命令行解析器         @return false only if the parser must stop, on a serious error.
一个面向对象的命令行解析器                true when the argument is OK or is malformed, in this second case 
一个面向对象的命令行解析器                the function GetError must return a description, see below.
一个面向对象的命令行解析器    
*/

一个面向对象的命令行解析器    
virtual bool Parse(std::string argument,std::string value) = 0;
一个面向对象的命令行解析器
一个面向对象的命令行解析器一个面向对象的命令行解析器    
/** Method called by the CCommandLineParser to retrieve the error description.
一个面向对象的命令行解析器        // if an fail in command line occurs, this method must return a description of the error.
一个面向对象的命令行解析器        // Ex: "Inaccesible input file", "invalid type of algorithm",..,etc.
一个面向对象的命令行解析器        @retrun "" to indicate that no error was produced.
一个面向对象的命令行解析器    
*/

一个面向对象的命令行解析器    
virtual std::string GetError() = 0;
一个面向对象的命令行解析器
一个面向对象的命令行解析器}
;
一个面向对象的命令行解析器
一个面向对象的命令行解析器
一个面向对象的命令行解析器
class  CCommandLineParser
一个面向对象的命令行解析器一个面向对象的命令行解析器
{
一个面向对象的命令行解析器
public:
一个面向对象的命令行解析器一个面向对象的命令行解析器    CCommandLineParser()
{m_defaultCommand = NULL;}
一个面向对象的命令行解析器一个面向对象的命令行解析器    
/**
一个面向对象的命令行解析器        Object that handle the default arguments. Only one can be specified.
一个面向对象的命令行解析器    
*/

一个面向对象的命令行解析器    
void SetDefaultCommand(ICmdLineParam* e);
一个面向对象的命令行解析器一个面向对象的命令行解析器    
/**
一个面向对象的命令行解析器        Objects that handle the empty arguments. Can be called how many times as necesary.
一个面向对象的命令行解析器        @param para name of the argument that this ICmdLineParam expect.
一个面向对象的命令行解析器        @e ICmdLineParam
一个面向对象的命令行解析器    
*/

一个面向对象的命令行解析器    
void PutEmptyCommand(std::string argument,ICmdLineParam* e);
一个面向对象的命令行解析器一个面向对象的命令行解析器    
/**
一个面向对象的命令行解析器        Entry that handle the values arguments. Can be called how many times as necesary.
一个面向对象的命令行解析器        @param para name of the argument that this ICmdLineParam expect.
一个面向对象的命令行解析器        @e ICmdLineParam
一个面向对象的命令行解析器    
*/

一个面向对象的命令行解析器    
void PutValueCommand(std::string argument,ICmdLineParam* e);
一个面向对象的命令行解析器一个面向对象的命令行解析器    
/**
一个面向对象的命令行解析器        Entry that handle the errors of the CCommandLineParser. Only one can be specified.
一个面向对象的命令行解析器    
*/

一个面向对象的命令行解析器    
void SetErrorCommand(ICmdLineParam* e);
一个面向对象的命令行解析器
一个面向对象的命令行解析器    
一个面向对象的命令行解析器一个面向对象的命令行解析器    
/**
一个面向对象的命令行解析器        Inits the parse process.
一个面向对象的命令行解析器        @param argn number of arguments passed to the application.
一个面向对象的命令行解析器        @param argv array of string with the arguments passed to the application.
一个面向对象的命令行解析器    
*/

一个面向对象的命令行解析器    
bool ParseArguments(int argn,char* argv[]);
一个面向对象的命令行解析器
private:
一个面向对象的命令行解析器    ICmdLineParam
* m_defaultCommand;
一个面向对象的命令行解析器    ICmdLineParam
* m_errorCommand;
一个面向对象的命令行解析器    std::map
<std::string,ICmdLineParam*> m_mapValueCommand;//值参数映射表
一个面向对象的命令行解析器
    std::map<std::string,ICmdLineParam*> m_mapEmptyCommand;//空参数映射表
一个面向对象的命令行解析器

一个面向对象的命令行解析器一个面向对象的命令行解析器    
/**
一个面向对象的命令行解析器        Deletes the '-', '--', '/' of the argument.
一个面向对象的命令行解析器        @return <b>true</b> if the argument is not a value.
一个面向对象的命令行解析器    
*/

一个面向对象的命令行解析器    
bool DeleteMinus(std::string& param);
一个面向对象的命令行解析器}
;
一个面向对象的命令行解析器

一个面向对象的命令行解析器void  CCommandLineParser::SetDefaultCommand(ICmdLineParam *  obj)
一个面向对象的命令行解析器一个面向对象的命令行解析器
{
一个面向对象的命令行解析器    m_defaultCommand 
= obj;
一个面向对象的命令行解析器}

一个面向对象的命令行解析器
void  CCommandLineParser::PutEmptyCommand(std:: string  argument,ICmdLineParam *  obj)
一个面向对象的命令行解析器一个面向对象的命令行解析器
{
一个面向对象的命令行解析器    m_mapEmptyCommand[argument] 
= obj;
一个面向对象的命令行解析器    
一个面向对象的命令行解析器}

一个面向对象的命令行解析器
void  CCommandLineParser::PutValueCommand(std:: string  argument,ICmdLineParam *  obj)
一个面向对象的命令行解析器一个面向对象的命令行解析器
{
一个面向对象的命令行解析器    m_mapValueCommand[argument] 
= obj;
一个面向对象的命令行解析器}

一个面向对象的命令行解析器
void  CCommandLineParser::SetErrorCommand(ICmdLineParam *  obj)
一个面向对象的命令行解析器一个面向对象的命令行解析器
{
一个面向对象的命令行解析器    m_errorCommand 
= obj;
一个面向对象的命令行解析器}

一个面向对象的命令行解析器
一个面向对象的命令行解析器
一个面向对象的命令行解析器
bool  CCommandLineParser::ParseArguments( int  argn, char *  argv[])
一个面向对象的命令行解析器一个面向对象的命令行解析器
{
一个面向对象的命令行解析器    
bool bAllOK = true;
一个面向对象的命令行解析器    
int i = 1// First paramter is discarded becouse it's the execution program path.
一个面向对象的命令行解析器
    
一个面向对象的命令行解析器    
while(i < argn )
一个面向对象的命令行解析器一个面向对象的命令行解析器    
{
一个面向对象的命令行解析器        
一个面向对象的命令行解析器        std::
string argument = argv[i];//当前待处理的参数
一个面向对象的命令行解析器

一个面向对象的命令行解析器        
if(DeleteMinus(argument))
一个面向对象的命令行解析器一个面向对象的命令行解析器        
{
一个面向对象的命令行解析器            
//到值参数映射表中寻找待设置的值参数
一个面向对象的命令行解析器            
// Check if this argument requires a value.
一个面向对象的命令行解析器
            std::map<std::string,ICmdLineParam*>::iterator it = m_mapValueCommand.find(argument);
一个面向对象的命令行解析器
一个面向对象的命令行解析器            
if(it != m_mapValueCommand.end())
一个面向对象的命令行解析器一个面向对象的命令行解析器            
{//值参数表中存在
一个面向对象的命令行解析器
                if(argv[i + 1== NULL)
一个面向对象的命令行解析器一个面向对象的命令行解析器                
{//没有提供值
一个面向对象的命令行解析器
                    bAllOK &= m_errorCommand->Parse(NO_VALUE_PARAM,argument);
一个面向对象的命令行解析器                    
return false;
一个面向对象的命令行解析器                }

一个面向对象的命令行解析器                std::
string paso = argv[i + 1];
一个面向对象的命令行解析器                
if(DeleteMinus(paso))
一个面向对象的命令行解析器一个面向对象的命令行解析器                
{//没有提供值
一个面向对象的命令行解析器
                    bAllOK &= m_errorCommand->Parse(NO_VALUE_PARAM,argument);
一个面向对象的命令行解析器                    
return false;
一个面向对象的命令行解析器                }

一个面向对象的命令行解析器                
else
一个面向对象的命令行解析器一个面向对象的命令行解析器                
{
一个面向对象的命令行解析器                    bAllOK 
&= it->second->Parse(argument,paso);//解析出值
一个面向对象的命令行解析器
                    i++;
一个面向对象的命令行解析器                }

一个面向对象的命令行解析器            }

一个面向对象的命令行解析器            
else
一个面向对象的命令行解析器一个面向对象的命令行解析器            
{//值参数表中不存在
一个面向对象的命令行解析器
                it = m_mapEmptyCommand.find(argument);//到空参数表中寻找
一个面向对象的命令行解析器
                if(it != m_mapEmptyCommand.end())
一个面向对象的命令行解析器一个面向对象的命令行解析器                
{//找到了
一个面向对象的命令行解析器
                    bAllOK &= it->second->Parse(argument,"");
一个面向对象的命令行解析器                }

一个面向对象的命令行解析器                
else
一个面向对象的命令行解析器一个面向对象的命令行解析器                
{//用户设置的格式是”参数:值“,对这种情况进行解析
一个面向对象的命令行解析器                    
// Try to split a ":"
一个面向对象的命令行解析器
                    std::string::size_type position = argument.find_first_of(":");
一个面向对象的命令行解析器                    
if(position != std::string::npos)
一个面向对象的命令行解析器一个面向对象的命令行解析器                    
{
一个面向对象的命令行解析器                        std::
string command = argument.substr(0,position);
一个面向对象的命令行解析器                        std::
string value = argument.substr(position + 1);
一个面向对象的命令行解析器                        
//到值参数映射表中寻址
一个面向对象的命令行解析器
                        std::map<std::string,ICmdLineParam*>::iterator it = m_mapValueCommand.find(command);
一个面向对象的命令行解析器                        
if(it != m_mapValueCommand.end())
一个面向对象的命令行解析器一个面向对象的命令行解析器                        
{//找到
一个面向对象的命令行解析器
                            bAllOK &= it->second->Parse(command,value);
一个面向对象的命令行解析器                        }

一个面向对象的命令行解析器                        
else
一个面向对象的命令行解析器一个面向对象的命令行解析器                        
{//不存在
一个面向对象的命令行解析器
                            bAllOK &= m_errorCommand->Parse(UNKNOWN_PARAM,command);
一个面向对象的命令行解析器                            
return false;
一个面向对象的命令行解析器                        }

一个面向对象的命令行解析器                    }

一个面向对象的命令行解析器                    
else
一个面向对象的命令行解析器一个面向对象的命令行解析器                    
{//未知参数
一个面向对象的命令行解析器
                        bAllOK &= m_errorCommand->Parse(UNKNOWN_PARAM,argument);
一个面向对象的命令行解析器                        
return false;
一个面向对象的命令行解析器                    }

一个面向对象的命令行解析器                }

一个面向对象的命令行解析器
一个面向对象的命令行解析器            }
    
一个面向对象的命令行解析器        }

一个面向对象的命令行解析器        
else
一个面向对象的命令行解析器一个面向对象的命令行解析器        
{//不是附加参数,而是默认参数
一个面向对象的命令行解析器
            if(m_defaultCommand != NULL)
一个面向对象的命令行解析器一个面向对象的命令行解析器            
{
一个面向对象的命令行解析器                bAllOK 
&= m_defaultCommand->Parse("",argument);
一个面向对象的命令行解析器            }

一个面向对象的命令行解析器            
else
一个面向对象的命令行解析器一个面向对象的命令行解析器            
{
一个面向对象的命令行解析器                
return false;
一个面向对象的命令行解析器            }

一个面向对象的命令行解析器        }

一个面向对象的命令行解析器        i
++;
一个面向对象的命令行解析器    }

一个面向对象的命令行解析器    
//错误处理
一个面向对象的命令行解析器
    std::string error = m_defaultCommand->GetError();
一个面向对象的命令行解析器    
if(error != "")
一个面向对象的命令行解析器一个面向对象的命令行解析器    
{
一个面向对象的命令行解析器        m_errorCommand
->Parse(GENERIC_ERROR,error);
一个面向对象的命令行解析器        
return false;
一个面向对象的命令行解析器    }

一个面向对象的命令行解析器
一个面向对象的命令行解析器
一个面向对象的命令行解析器    std::map
<std::string,ICmdLineParam*>::iterator it = m_mapValueCommand.begin();
一个面向对象的命令行解析器
一个面向对象的命令行解析器    
while(it != m_mapValueCommand.end())
一个面向对象的命令行解析器一个面向对象的命令行解析器    
{
一个面向对象的命令行解析器        error 
= it->second->GetError();
一个面向对象的命令行解析器        
if(error != "")
一个面向对象的命令行解析器一个面向对象的命令行解析器        
{
一个面向对象的命令行解析器            m_errorCommand
->Parse(GENERIC_ERROR,error);
一个面向对象的命令行解析器            
return false;
一个面向对象的命令行解析器        }

一个面向对象的命令行解析器        it
++;
一个面向对象的命令行解析器    }

一个面向对象的命令行解析器
一个面向对象的命令行解析器    std::map
<std::string,ICmdLineParam*>::iterator it2 = m_mapEmptyCommand.begin();
一个面向对象的命令行解析器
一个面向对象的命令行解析器    
while(it2 != m_mapEmptyCommand.end())
一个面向对象的命令行解析器一个面向对象的命令行解析器    
{
一个面向对象的命令行解析器        error 
= it2->second->GetError();
一个面向对象的命令行解析器        
if(error != "")
一个面向对象的命令行解析器一个面向对象的命令行解析器        
{
一个面向对象的命令行解析器            m_errorCommand
->Parse(GENERIC_ERROR,error);
一个面向对象的命令行解析器            
return false;
一个面向对象的命令行解析器        }

一个面向对象的命令行解析器        it2
++;
一个面向对象的命令行解析器    }

一个面向对象的命令行解析器
一个面向对象的命令行解析器
一个面向对象的命令行解析器    
return bAllOK;// Devuelve false si ha habido error.
一个面向对象的命令行解析器
}

一个面向对象的命令行解析器
一个面向对象的命令行解析器
bool  CCommandLineParser::DeleteMinus(std:: string &  argument)
一个面向对象的命令行解析器一个面向对象的命令行解析器
{//去掉参数前的分隔符
一个面向对象的命令行解析器
    switch(argument[0])
一个面向对象的命令行解析器一个面向对象的命令行解析器    
{
一个面向对象的命令行解析器    
case '/':
一个面向对象的命令行解析器        argument 
= &(argument.c_str()[1]);
一个面向对象的命令行解析器        
return true;
一个面向对象的命令行解析器    
case '-':
一个面向对象的命令行解析器        
if(argument[1== '-')
一个面向对象的命令行解析器一个面向对象的命令行解析器        
{
一个面向对象的命令行解析器            argument 
= &(argument.c_str()[2]);
一个面向对象的命令行解析器        }

一个面向对象的命令行解析器        
else
一个面向对象的命令行解析器一个面向对象的命令行解析器        
{
一个面向对象的命令行解析器            argument 
= &(argument.c_str()[1]);
一个面向对象的命令行解析器        }

一个面向对象的命令行解析器        
return true;
一个面向对象的命令行解析器    }

一个面向对象的命令行解析器
一个面向对象的命令行解析器
一个面向对象的命令行解析器    
return false;
一个面向对象的命令行解析器}

一个面向对象的命令行解析器

一个面向对象的命令行解析器一个面向对象的命令行解析器测试程序