boost :: spirit :: qi :: фраза_парсер () в std :: map ошибка - PullRequest
0 голосов
/ 09 февраля 2019

Приведенный ниже код предназначен для синтаксического анализа строки "key = val; .." в std :: map, и он не может быть скомпилирован с ошибкой:

Ошибка C2146: синтаксическая ошибка: отсутствует '> 'перед идентификатором' value_type '
Ошибка C2039:' value_type ': не является членом' std :: pair, std :: allocator, std :: basic_string, std :: allocator >> 'c: \ git \risk-engine-core_tcp \ stage \ boost-1.66.0-barclays-1 \ include \ boost \ spirit \ home \ support \ container.hpp

Не нравится последний параметр, "содержание"(std :: map), переданный в качестве контейнера.

Boost версия 1.66

namespace qi = boost::spirit::qi;

std::map<std::string,std::string> contents;
std::string::iterator first = str.begin();
std::string::iterator last  = str.end();

const bool result = qi::phrase_parse(first,last, 
*( *(qi::char_-"=")  >> qi::lit("=") >> *(qi::char_-";") >> -qi::lit(";") ),
 ascii::space, contents); 

Глядя на документы повышения и переполнения стека, я не вижу никаких проблем с вышеупомянутымкод.

1 Ответ

0 голосов
/ 10 февраля 2019

Вы включили

#include <boost/fusion/adapted/std_pair.hpp>

Вот рабочий пример с некоторыми предложениями по улучшению:

Live On Coliru

#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/spirit/include/qi.hpp>
#include <map>
#include <iomanip> // std::quoted

namespace qi = boost::spirit::qi;

int main() {
    std::string str("key = value");
    std::string::const_iterator first = str.begin();
    std::string::const_iterator last  = str.end();

    std::map<std::string, std::string> contents;
    bool const result = qi::phrase_parse(first,last, 
        *( *~qi::char_('=')  >> '=' >> *~qi::char_(';') >> -qi::lit(';') ),
         qi::ascii::space, contents); 

    if (result) {
        std::cout << "Parsed " << contents.size() << " elements\n";
        for (auto& [k,v] : contents) {
            std::cout << "\t" << std::quoted(k) << ": " << std::quoted(v) << "\n";
        }
    } else {
        std::cout << "Parse failed\n";
    }

    if (first != last)
        std::cout << "Remaining input unparsed: " << std::quoted(std::string(first, last)) << "\n";
}

Отпечатки

Parsed 1 elements
    "key": "value"
...