повысить дух, чтобы разобрать структуру - PullRequest
1 голос
/ 06 июля 2011

Я хотел бы использовать boost::spirit для анализа структуры из std::string.В моем примере строка выглядит как то, что будет прочитано из файла

Знаете ли вы, почему она вообще не анализируется?Я скопировал классический employee пример, но строка не проанализирована.

AFG

std::string temp_1 = 
"MyStruct   {               \n"
"   a ""A"",            \n"
"   b ""B"",            \n"
"   c ""C"",            \n"
"   d ""D""             \n"
"  }                    \n"
;




namespace client{
    namespace qi = boost::spirit::qi;
    namespace ascii = boost::spirit::ascii;
    struct MyStruct{
        std::string a;
        std::string b;
        std::string c;
        std::string d;
    };
};



BOOST_FUSION_ADAPT_STRUCT(
    client::MyStruct,
    (std::string, a)
    (std::string, b)
    (std::string, c)
    (std::string, d)
)

namespace client
{
    template <typename Iterator>
    struct MyStruct_parser : qi::grammar<Iterator, MyStruct(), ascii::space_type>
    {
        MyStruct_parser() : MyStruct_parser::base_type(start)
        {
                using qi::lexeme;
                using ascii::char_;
            using qi::lit;

                quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];

                start %=
                lit("MyStruct")
                >> '{'
                >> "a" >> quoted_string >> ','
                >> "b" >> quoted_string >> ','
                >> "c" >> quoted_string >> ','
                >> "d" >> quoted_string
                >>  '}'
                ;
        }

        qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
        qi::rule<Iterator, MyStruct(),  ascii::space_type> start;
    };
}


int main( int argc, char** argv ){



    using boost::spirit::ascii::space;
    typedef std::string::const_iterator iterator_type;
    typedef client::MyStruct_parser<iterator_type> MyStruct_parser;

    std::stringstream inp(temp_1);

    std::string line;
    while( std::getline( line, inp ) ){

        std::string::const_iterator a = line.begin();
            std::string::const_iterator b = line.end();

        MyStruct_parser g; // Our grammar
        client::MyStruct obj;
        bool r = phrase_parse( a, b, g, space, obj);
        if( r ){
            std::cout << "parsed" << std::endl;
        }else{
            std::cout << "not parsed" << std::endl;
        }
    }
    return 1;
}

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

Если вы введете свои входные данные как:

std::string temp_1 = 
"MyStruct   {\n"
"   a \"A\",\n"
"   b \"B\",\n"
"   c \"C\",\n"
"   d \"D\"\n"
"  }\n"
;

(то есть добавите правильное цитирование), это будет работать.

3 голосов
/ 06 июля 2011

Кажется, что ваши строки в temp_1 не заключены в кавычки, но ваша грамматика ожидает строки в кавычках. Чтобы добавить цитату в строковый литерал, используйте escape \ "

...