首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Skipper在boost::spirit中不起作用

Skipper在boost::spirit中不起作用
EN

Stack Overflow用户
提问于 2013-02-11 19:21:29
回答 1查看 362关注 0票数 0

我使用boost spirit来解析颜色。这工作得很好,但在我更改迭代器类型后,skipper停止了工作。

代码语言:javascript
复制
"rgb(1.0,1.0,0.5)"  // this works
" rgb(0.2,0.2,0.2)" // this fails

标题如下:

代码语言:javascript
复制
struct ColorGrammar : public qi::grammar<StringIterator, Color(), chs::space_type>
{
//! Iterator type for this grammar
typedef StringIterator ItType;
//! Skipper type used in this grammar
typedef chs::space_type Skipper;



//! Rule to parse a number with up to 3 digits
qi::uint_parser<uint8, 10, 1, 3> number;
//! Rule to parse a hex digit
qi::uint_parser<uint8, 16, 1, 1> hexdigit;

ColorGrammar();

//! Rule for rgb(...)
qi::rule<ItType, Color(), qi::locals<float, float>, Skipper> rule_rgb;
//! Rule for rgba(...)
qi::rule<ItType, Color(), qi::locals<float, float, float>, Skipper> rule_rgba;
//! Mainrule
qi::rule<ItType, Color(), Skipper> rule_color;
};

这是cpp

代码语言:javascript
复制
ColorGrammar::ColorGrammar()
: ColorGrammar::base_type(rule_color, "color-grammar")
{
using namespace qi::labels;
using boost::phoenix::construct;
auto& _1 = qi::_1;


rule_rgb = '(' >> qi::float_[_a = _1] >> ',' >> qi::float_[_b = _1] >> ',' >> qi::float_[_val = phx::construct<Color>(_a, _b, _1)] >> ')';
rule_rgba = '(' >> qi::float_[_a = _1] >> ',' >> qi::float_[_b = _1] >> ',' >> qi::float_[_c = _1] >> ',' >> qi::float_[_val = phx::construct<Color>(_a, _b, _c, _1)] >> ')';
rule_color = (qi::lit("rgb") >> rule_rgb)
    | (qi::lit("rgba") >> rule_rgba);
}

还有这个电话:

代码语言:javascript
复制
Color out;
StringIterator begin = str.cbegin();
StringIterator end = str.cend();

bool result = qi::phrase_parse(begin, end, color_, chs::space, out);

我敢肯定,这只是一个小错误,但我不能看到它。也许我在源头上看得太久了。你能看到一个错误的赌注吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-11 21:09:12

我看不出有什么问题:我已经尽力重建了您的SSCCE。

  • http://liveworkspace.org/code/1pDtmn$1

在这个过程中,我看起来一定是解决了这个问题。我建议你也这样做。

哦,我是这样写的:

更多的constructors

  • no qi::locals

  • no更多不需要的copying

  • using

简而言之:别再大惊小怪了。

代码语言:javascript
复制
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted/struct.hpp>
#include <cstdint>

namespace qi  = boost::spirit::qi;
namespace chs = boost::spirit::ascii; //qi;

typedef std::string::const_iterator StringIterator;

struct Color
{
    float r,g,b,a; 
};

BOOST_FUSION_ADAPT_STRUCT(Color, (float, r)(float, g)(float, b)(float, a))

template <typename ItType, typename Skipper>
struct ColorGrammar : public qi::grammar<StringIterator, Color(), Skipper>
{
    ColorGrammar()
        : ColorGrammar::base_type(rule_color, "color-grammar")
    {
        using namespace qi;
        rule_rgb   = lit("rgb")  >> '(' > float_ > ',' > float_ > ',' > float_ >       attr(1.0f) > ')';
        rule_rgba  = lit("rgba") >> '(' > float_ > ',' > float_ > ',' > float_ > ',' > float_     > ')';
        rule_color = rule_rgb | rule_rgba;
    }

  private:
    qi::uint_parser<uint8_t, 10, 1, 3> number;   // unused
    qi::uint_parser<uint8_t, 16, 1, 1> hexdigit; // unused

    qi::rule<ItType, Color(), Skipper> rule_rgb, rule_rgba, rule_color;
};

int main()
{
    Color out;
    std::string str = " rgb ( 0.3 , .4 , 0.5 )";
    StringIterator begin = str.cbegin();
    StringIterator end   = str.cend();

    ColorGrammar<StringIterator, chs::space_type> color_;

    bool result = qi::phrase_parse(begin, end, color_, chs::space, out);
    std::cout << std::boolalpha << result << '\n';
    std::cout << "remains: '" << std::string(begin, end) << "'\n";
}

http://liveworkspace.org/code/35htD$3上直播

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14811227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档