Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用sprit boost解析器库规则调用函数或函子以将值保存在向量c++;_C++_Boost_Boost Spirit - Fatal编程技术网

C++ 使用sprit boost解析器库规则调用函数或函子以将值保存在向量c++;

C++ 使用sprit boost解析器库规则调用函数或函子以将值保存在向量c++;,c++,boost,boost-spirit,C++,Boost,Boost Spirit,我想解析这一行并将所有十六进制值存储在functor中 [] 此值在txt文件中,m逐行读取此填充 像 005F 0061 00660066 00660069 00660066006C 所有值都应该是矢量,但它不起作用 spirit规则是解析这一行 rule<> blanks = *blank_p; rule<> parse_int = blanks >> "<" >> int_p [AddEntry] >> ">"; ru

我想解析这一行并将所有十六进制值存储在functor中 [] 此值在txt文件中,m逐行读取此填充

像 005F 0061 00660066 00660069 00660066006C 所有值都应该是矢量,但它不起作用

spirit规则是解析这一行

rule<> blanks = *blank_p;
rule<> parse_int = blanks >> "<" >> int_p [AddEntry] >> ">";
rule<> parse_ints = *parse_int ;
rule<> parse_range = *parse_int >>"[" >> blanks >> *parse_int >> "]";

int status = parse (line.c_str(),
*(
     parse_range 
 )
 ).full;
规则空白=*blank\p;
规则解析_int=blanks>>“”;
规则parse_int=*parse_int;
规则parse_range=*parse_int>>“[”>>空格>>*parse_int>>“]”;
int status=parse(line.c_str(),
*(
解析u范围
)
).全部;
我的函子是这个

struct AddEntry
{
    vector<int> list;   
    void operator()( int integer)
    {
        list.push_back(integer);
    }
};
struct AddEntry
{
向量表;
void运算符()(整数)
{
列表。向后推_(整数);
}
};

下面是一个使用Spirit V2执行此操作的示例

#define BOOST_SPIRIT_DEBUG
#include <boost/spirit/include/qi.hpp>
namespace qi  = boost::spirit::qi;

int main() {
    typedef std::string::const_iterator It;
    std::string const line = "<005F> <0061> [<00660066> <00660069> <00660066006C>]";

    It f = line.begin(), l = line.end();

    qi::int_parser<uintmax_t, 16> hex_int;
    qi::rule<It, uintmax_t()> braced_hex = '<' >> hex_int >> '>';
    BOOST_SPIRIT_DEBUG_NODE(braced_hex);

    std::vector<uintmax_t> list;
    bool result = qi::phrase_parse(f, l, *braced_hex >> '[' >> *braced_hex >> ']', qi::space, list);

    if (result) {
        std::cout << "Parse success: " << list.size() << "\n";

        for (auto& v : list)
            std::cout << v << " ";
    }
    else {
        std::cout << "Parse failed\n";
    }

    if (f!=l) {
        std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n";
    }
}
调试输出(如果启用):



[使用Spirit V2的时间到了?经典已经过时很多年了展示我能用V2实现它吗?任何相关的例子都会被欣赏吗?请检查它为什么两个解析函数都是真的我希望简单的函数都是假的非常感谢你我正在学习它并感谢你的帮助:)调试时出现了一个小错误你知道吗s?1>parser.cpp(21):错误C2143:语法错误:缺少“”,“”之前“”:“1>parser.cpp(21):错误C2530:“v”:必须初始化引用1>parser.cpp(21):错误C3531:“v”:类型包含“auto”的符号必须具有初始化器1>1>生成失败。您的编译器似乎不支持c++11(完全支持)。更改为c++03:请检查为什么两个解析函数都为true我希望简单函数为false
Parse success: 5
95 97 6684774 6684777 438093348972 
<braced_hex>
    <try><005F> <0061> [<0066</try>
    <success> <0061> [<00660066> </success>
    <attributes>[95]</attributes>
</braced_hex>
<braced_hex>
    <try><0061> [<00660066> <</try>
    <success> [<00660066> <006600</success>
    <attributes>[97]</attributes>
</braced_hex>
<braced_hex>
    <try>[<00660066> <0066006</try>
    <fail/>
</braced_hex>
<braced_hex>
    <try><00660066> <00660069</try>
    <success> <00660069> <0066006</success>
    <attributes>[6684774]</attributes>
</braced_hex>
<braced_hex>
    <try><00660069> <00660066</try>
    <success> <00660066006C>]</success>
    <attributes>[6684777]</attributes>
</braced_hex>
<braced_hex>
    <try><00660066006C>]</try>
    <success>]</success>
    <attributes>[438093348972]</attributes>
</braced_hex>
<braced_hex>
    <try>]</try>
    <fail/>
</braced_hex>