Сохранение надстройки :: spirit :: qi :: rule в std :: list - PullRequest
1 голос
/ 10 декабря 2010

Я прочитал другую ветку о копировании или ссылочной семантике для boost :: spirt :: qi :: rule . Я использую Boost 1.42.

using boost::spirit::qi::phrase_parse;
typedef boost::spirit::qi::rule < std::string::const_iterator, boost::spirit::ascii::space_type > rule_type;
std::list < rule_type > ruleList;
std::string const s("abcdef");
std::string::const_iterator iter = s.begin(), end = s.end();
std::cout << typeid(char_).name() << std::endl;
ruleList.push_back(char_);
ruleList.push_back(*ruleList.back());
assert(phrase_parse(iter, s.end(), ruleList.back(), boost::spirit::ascii::space));
assert(iter == s.end());

Это не с ...

Assertion `phrase_parse(iter, s.end(), ruleList.back(), traits::space())' failed.
Aborted (core dumped)

Есть ли способ хранить правила в списке STL или в deque? (Ссылки не умирают, пока не будут удалены).

Ответы [ 2 ]

2 голосов
/ 10 декабря 2010

В Boost V1.45 это (по сути, ваш код сверху) работает без проблем (MSVC2010, g ++ 4.5.1):

#include <list>
#include <string>
#include <iostream>
#include <boost/spirit/include/qi.hpp>

using namespace boost::spirit; 

int main()
{
    typedef qi::rule<std::string::const_iterator, ascii::space_type> rule_type; 
    std::list<rule_type> ruleList; 

    std::string const s("abcdef"); 
    std::string::const_iterator iter = s.begin(), end = s.end(); 
    std::cout << typeid(qi::char_).name() << std::endl; 

    ruleList.push_back(qi::char_); 
    ruleList.push_back(*ruleList.back()); 

    assert(qi::phrase_parse(iter, s.end(), ruleList.back(), ascii::space)); 
    assert(iter == s.end());

    return 0;
}

Поэтому, я полагаю, это ошибка в версии Spiritвы используете.

0 голосов
/ 10 декабря 2010

Я не смог получить ваш пример для компиляции. Помимо using правильных типов из ...::qi, вы добавили () к типу trait::space.

Это работает без проблем для меня (boost 1.44)

#include <boost/spirit/include/qi.hpp>
#include <string>
#include <vector>
#include <cassert>

using boost::spirit::qi::phrase_parse;

typedef boost::spirit::qi::rule < std::string::const_iterator, boost::spirit::qi::space_type > rule_type;

int main() {

std::list < rule_type > ruleList;
std::string const s("abcdef");
std::string::const_iterator iter = s.begin(), end = s.end();
ruleList.push_back(*boost::spirit::qi::char_);
assert(phrase_parse(iter, s.end(), ruleList.back(), boost::spirit::qi::space));
assert(iter == s.end());

}

~>g++ test.cpp && ./a.out<br> ~>

обратите внимание, я использую qi::space_type и `qi::space вместо пространства имен ascii. Я понятия не имею, что / где находится пространство имен trait.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...