簡體   English   中英

精神氣:治炭[5]

[英]Spirit Qi : rule for char [5]

我有以下結構

struct MyStruct 
{
    char CODE;
    char NAME[5];
};

我把它做成融合結構

BOOST_FUSION_ADAPT_STRUCT
(
MyStruct,
(char, MARKET_CODE)
(char, NAME[5])
)

我的語法實現如下:

MyStruct_parser() : ticker_parser::base_type(start)
    {
        using qi::lexeme;
        using ascii::char_;

        a_word %= lexeme[+(char_)];
        start %=  a_word >> a_word;
    }
    qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
    qi::rule<Iterator, Ticker(), ascii::space_type> start;

不幸的是它不能編譯。 現在我使用std :: string代替char [5]我沒有問題。 您能告訴我如何告訴Spirit讀char [5]嗎?

謝謝

您可以使用boost::spirit::traits::transform_attribute<>提供自定義屬性轉換:

觀看Live on ColiruLive for C ++ 03

#include <boost/spirit/include/qi.hpp>
#include <boost/array.hpp>

namespace qi = boost::spirit::qi;

typedef char name_t[5];
// typedef boost::array<char, 5> name_t;

struct MyStruct {
    char   code;
    name_t name;
};

namespace boost { namespace spirit { namespace traits {

    template <>
        struct transform_attribute<name_t, std::vector<char>, qi::domain> {
            typedef std::vector<char> type;

            static type pre(name_t&) { return {}; }

            static void post(name_t& val, type const& attr) {
                static_assert(sizeof(val)==5, "");
                assert(attr.size() == sizeof(val));

                using boost::begin;
                using boost::end;
                std::copy(attr.begin(), attr.end(), begin(val));
            }
            static void fail(name_t&) { }
        };

} } }

int main()
{
    std::string const input("123456");

    using It = std::string::const_iterator;
    It f(input.begin()), l(input.end());

    MyStruct data;
    qi::rule<It, std::vector<char>()> c5 = qi::repeat(5) [ qi::char_ ];
    bool ok = qi::parse(f,l, qi::char_ >> c5, data.code, data.name);

    if (ok)
    {
        std::cout << "Parse success: " << data.code << ", '" << std::string(std::begin(data.name), std::end(data.name)) << "'\n";
    } else
    {
        std::cout << "Parse failed\n";
    }

    if (f!=l)
    {
        std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n";
    }
}

打印

Parse success: 1, '23456'

在c ++ 11和c ++ 03版本中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM