boost :: spirit :: qi анализатор перестановок и синтезированные атрибуты

Я пытаюсь собрать простой синтаксический анализатор командной строки с помощью SPIRIT. Я'Я использую BOOST 1.52, но я бы не хотел использовать возможности C ++ 11. Грамматика имеет следующий синтаксис:

[-p num1] [-j] [--jobs num2] str1 str2

Необязательные параметры могут быть в любом порядке. Я успешно проанализировал только дополнительные параметры. Как только я добавляю дополнительные обязательные два строковых парсера, он ломается. Это ломается, даже когда я пытаюсь записатьRSTART» атрибуты в явном виде и избежать вывода типа с помощьюавто", Любая помощь или предложение очень ценится!

#include 
#include 
#include 
#include 
#include 
#include 
#include 

bool parse_line( const std::string&str,bool useStart1 )
{
    bool rc=false;
    namespace qi = boost::spirit::qi;

    using boost::spirit::ascii::space_type;
    using boost::spirit::ascii::space;
    using boost::spirit::ascii::char_;

    std::string::const_iterator iter( str.begin() );

    std::size_t num1    =88;
    bool        bool1   =false;
    std::size_t num2    =88;
    std::string str1,str2;

    qi::rule< std::string::const_iterator,std::string() > rstring=+~space;
    qi::rule< std::string::const_iterator,std::size_t() ,space_type > 
        rOption1=qi::lit( "-p" ) >> qi::int_;
    qi::rule< std::string::const_iterator,bool()        ,space_type >
        rOption2=qi::lit( "-j" ) >> qi::attr(true);
    qi::rule< std::string::const_iterator,std::size_t() ,space_type >
        rOption3=qi::lit( "--jobs" ) >> qi::int_;

#if defined(AAA)
    qi::rule<   std::string::const_iterator,
                boost::spirit::ascii::space_type,
                boost::tuple<   boost::optional,
                                boost::optional,
                                boost::optional
                >
            >
#endif

    auto rstart1 = ( rOption1 ^ rOption2 ^ rOption3 ) ;
    auto rstart2 = ( rOption1 ^ rOption2 ^ rOption3 ) >> rstring >> rstring;

    if( useStart1 )
        qi::phrase_parse( iter,str.end(),
            ( qi::lit( "-p" ) >> qi::int_ ) ^
            ( qi::lit( "-j" ) >> qi::attr(true) ) ^
            ( qi::lit( "--jobs" ) >> qi::int_ ),space,num1,bool1,num2);
    else
    {
    //  qi::phrase_parse(
    //      iter,str.end(),rstart2,space,num1,bool1,num2,str1,str2);
    }

    if(iter==str.begin())
        iter=str.begin(); //NOP
    else
    if(iter!=str.end())
        std::cerr

Ответы на вопрос(1)

Ваш ответ на вопрос