C++ 如何使用qi::hold[]解析器指令。(boost::swap的属性类型存在问题)

C++ 如何使用qi::hold[]解析器指令。(boost::swap的属性类型存在问题),c++,boost,swap,boost-spirit,boost-spirit-qi,C++,Boost,Swap,Boost Spirit,Boost Spirit Qi,我有一个解析器,可以解析成boost::variant 这在第一行“Sarai”中失败。如果我像这样反转double和int的解析: value = qi::double_ | qi::int_ | qi::lexeme[+(qi::char_ - qi::eol)] ; value = qi::hold[qi::int_] | qi::hold[qi::double_] | qi::lexeme[+(qi::char_ - qi::eol)] ; 它工作正常,但是“Janelle”的

我有一个解析器,可以解析成
boost::variant

这在第一行“Sarai”中失败。如果我像这样反转double和int的解析:

value =  qi::double_ | qi::int_ | qi::lexeme[+(qi::char_ - qi::eol)] ;
value =  qi::hold[qi::int_] | qi::hold[qi::double_] | qi::lexeme[+(qi::char_ - qi::eol)] ;
它工作正常,但是“Janelle”的整数值被解析为double。在和之后,我想像这样使用qi::hold[]:

value =  qi::double_ | qi::int_ | qi::lexeme[+(qi::char_ - qi::eol)] ;
value =  qi::hold[qi::int_] | qi::hold[qi::double_] | qi::lexeme[+(qi::char_ - qi::eol)] ;
但有了这个,我得到了一个关于缺少函数的消息:
swap()
。这实际上记录在boost文档中(注意)。但解释非常简洁。我找不到此交换函数的正确属性类型。有人能帮忙吗

此处的编译器消息:

E:\Boost\boost_1_58_0\boost/spirit/home/support/attributes.hpp(1036) : error C2784: 'void boost::spirit::swap(boost::spirit::multi_pass<T,Policies> &,boost::spirit::multi_pass<T,Policies> &)' : could not deduce template argument for 'boost::spirit::multi_pass<T,Policies> &' from 'int' 
我对“Rebekah”的值有疑问。我还看到,评估值的顺序很重要。这一次,问题不再是
double
值,而是
int
字符串之间的问题。我想实施这样的东西:(政策?)

  • 只有数字、可选减号和包含点的所有内容都是
    double
  • 只有数字和可选减号的所有内容都是
    int
  • 其他一切都是
    std::string

  • 解决方案
    有时候,理解问题比理解问题更重要

    问题不是解析器策略,而是我对解析规则的定义(见上文)。规则3“其他所有内容”实际上包括:“截至EOL的所有内容”。因此,
    规则中的所有三个备选方案必须与此匹配:

    value =   strict_double >> qi::eol
            | qi::int_ >> qi::eol
            | qi::lexeme[+(qi::char_ - qi::eol)] >> qi::eol;
    

    有了这个变化,就像一个魅力

    保持不用于此操作

    想想看:这会有什么帮助?它不会使整数分支不匹配,因此它仍然无法解析,并且
    hold
    不会还原任何内容

    hold[]
    主要用于容器属性,其中部分解析可能会修改属性。容器通常已经实现了交换。你找错人了

    包括字符串,参见例如




    解决问题: 您可以使用严格实数策略仅将实数值解析为double

    value =  strict_double | qi::int_ | qi::lexeme[+(qi::char_ - qi::eol)] ;
    
    // with
    qi::real_parser<double, qi::strict_real_policies<double> > strict_double;
    
    和调试信息(如果启用)

    
    莎拉:52.731
    莎拉:52.731
    莎拉:52.731
    莎拉:52.731
    :    52.731199473801
    [S,a,r,a,i]]
    52.731199473801\n
    \nJamiya:果冻
    [52.7312]
    杰米娅:果冻
    [S,a,r,a,i],52.7312]
    杰米娅:果冻
    杰米娅:果冻
    :果冻滴
    [J,a,m,i,y,a]]
    果冻滴\n果冻
    \nClara:-92.4
    [J,e,l,l,y,D,r,o,p]]
    克拉拉:-92.40
    [J,a,m,i,y,a],[J,e,l,l,y,D,r,o,p]]
    克拉拉:-92.40
    克拉拉:-92.40
    :    -92.40860586988
    [C,l,a,r,a]]
    -92.408605869885
    \nJanelle:13234
    [-92.4086]
    珍妮尔:132349
    [C,l,a,r,a],-92.4086]]
    珍妮尔:132349
    珍妮尔:132349
    :132349223\n文件
    [J,a,n,e,l,l,e]]
    132349223\n布里利
    \恩布里利:-40.9
    [132349223]
    布里利:-40.90
    [J,a,n,e,l,l,e],132349223]
    布里利:-40.90
    布里利:-40.90
    :    -40.90535249560
    [B,r,i,l,e,y]]
    -40.905352495602
    \n
    [-40.9054]
    [B,r,i,l,e,y],-40.9054]
    [B,r,i,l,e,y],-40.9054],[C,l,a,r,a],-92.4086],[J,a,m,i,y,a],[J,e,l,l,y,D,r,o,p],[J,a,n,e,l,l,e],132349223],[S,a,r,a,i],52.7312]]
    [B,r,i,l,e,y],-40.9054],[C,l,a,r,a],-92.4086],[J,a,m,i,y,a],[J,e,l,l,y,D,r,o,p],[J,a,n,e,l,l,e],132349223],[S,a,r,a,i],52.7312]]
    


    非常感谢!我还有很多东西要学;-)但是请看一下我对这个问题的更新。是否有类似于
    严格的\u整型\u策略
    value =  strict_double | qi::int_ | qi::lexeme[+(qi::char_ - qi::eol)] ;
    
    // with
    qi::real_parser<double, qi::strict_real_policies<double> > strict_double;
    
    #define BOOST_SPIRIT_DEBUG
    #include <boost/fusion/adapted/std_pair.hpp>
    #include <boost/spirit/include/qi.hpp>
    #include <map>
    
    namespace qi    = boost::spirit::qi;
    namespace ascii = boost::spirit::ascii;
    
    typedef boost::variant<int, double, std::string> value_t;
    typedef std::map<std::string, value_t> namevalue;
    typedef std::pair<std::string, value_t> namevaluepair;
    
    template <typename Iterator>
    struct keys_and_values2
        :   qi::grammar<Iterator, namevalue(), ascii::blank_type>
    {
        keys_and_values2() : keys_and_values2::base_type(start)
        {
            start %= query >> qi::eoi;
            query =  +pair;
            value =  strict_double | qi::int_ | qi::lexeme[+(qi::char_ - qi::eol)] ;
            pair  =  key >> qi::lit(':') >> value >> qi::eol;
            key   =  qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9");
    
            BOOST_SPIRIT_DEBUG_NODES((start)(query)(value)(pair)(key))
        }
      private:
        qi::real_parser<double, qi::strict_real_policies<double> > strict_double;
        qi::rule<Iterator, namevalue(),     ascii::blank_type> start;
        qi::rule<Iterator, namevalue(),     ascii::blank_type> query;
        qi::rule<Iterator, namevaluepair(), ascii::blank_type> pair;
        qi::rule<Iterator, std::string(),   ascii::blank_type> key;
        qi::rule<Iterator, value_t(),       ascii::blank_type> value;
    };
    
    int main() {
        typedef boost::spirit::istream_iterator It;
        It f(std::cin >> std::noskipws), l;
    
        keys_and_values2<It> g;
        namevalue data;
        bool ok = qi::phrase_parse(f,l,g,ascii::blank,data);
    
        if (ok) {
            std::cout << "Parse succeeded:\n";
            for(auto& p : data)
                std::cout << "\t'" << p.first << "'\t-> " << p.second << "\n";
        } else
            std::cout << "Parse failed\n";
    
        if (f!=l)
            std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n";
    }
    
    Parse succeeded:
        'Briley'    -> -40.9054
        'Clara' -> -92.4086
        'Jamiya'    -> Jelly Drop
        'Janelle'   -> 132349223
        'Sarai' -> 52.7312
    
    <start>
    <try>Sarai    :    52.731</try>
    <query>
        <try>Sarai    :    52.731</try>
        <pair>
        <try>Sarai    :    52.731</try>
        <key>
            <try>Sarai    :    52.731</try>
            <success>:    52.731199473801</success>
            <attributes>[[S, a, r, a, i]]</attributes>
        </key>
        <value>
            <try>    52.731199473801\n</try>
            <success>\nJamiya   :    Jelly</success>
            <attributes>[52.7312]</attributes>
        </value>
        <success>Jamiya   :    Jelly </success>
        <attributes>[[[S, a, r, a, i], 52.7312]]</attributes>
        </pair>
        <pair>
        <try>Jamiya   :    Jelly </try>
        <key>
            <try>Jamiya   :    Jelly </try>
            <success>:    Jelly Drop\nClar</success>
            <attributes>[[J, a, m, i, y, a]]</attributes>
        </key>
        <value>
            <try>    Jelly Drop\nClara</try>
            <success>\nClara    :    -92.4</success>
            <attributes>[[J, e, l, l, y,  , D, r, o, p]]</attributes>
        </value>
        <success>Clara    :    -92.40</success>
        <attributes>[[[J, a, m, i, y, a], [J, e, l, l, y,  , D, r, o, p]]]</attributes>
        </pair>
        <pair>
        <try>Clara    :    -92.40</try>
        <key>
            <try>Clara    :    -92.40</try>
            <success>:    -92.40860586988</success>
            <attributes>[[C, l, a, r, a]]</attributes>
        </key>
        <value>
            <try>    -92.408605869885</try>
            <success>\nJanelle  :    13234</success>
            <attributes>[-92.4086]</attributes>
        </value>
        <success>Janelle  :    132349</success>
        <attributes>[[[C, l, a, r, a], -92.4086]]</attributes>
        </pair>
        <pair>
        <try>Janelle  :    132349</try>
        <key>
            <try>Janelle  :    132349</try>
            <success>:    132349223\nBrile</success>
            <attributes>[[J, a, n, e, l, l, e]]</attributes>
        </key>
        <value>
            <try>    132349223\nBriley</try>
            <success>\nBriley   :    -40.9</success>
            <attributes>[132349223]</attributes>
        </value>
        <success>Briley   :    -40.90</success>
        <attributes>[[[J, a, n, e, l, l, e], 132349223]]</attributes>
        </pair>
        <pair>
        <try>Briley   :    -40.90</try>
        <key>
            <try>Briley   :    -40.90</try>
            <success>:    -40.90535249560</success>
            <attributes>[[B, r, i, l, e, y]]</attributes>
        </key>
        <value>
            <try>    -40.905352495602</try>
            <success>\n</success>
            <attributes>[-40.9054]</attributes>
        </value>
        <success></success>
        <attributes>[[[B, r, i, l, e, y], -40.9054]]</attributes>
        </pair>
        <pair>
        <try></try>
        <key>
            <try></try>
            <fail/>
        </key>
        <fail/>
        </pair>
        <success></success>
        <attributes>[[[[B, r, i, l, e, y], -40.9054], [[C, l, a, r, a], -92.4086], [[J, a, m, i, y, a], [J, e, l, l, y,  , D, r, o, p]], [[J, a, n, e, l, l, e], 132349223], [[S, a, r, a, i], 52.7312]]]</attributes>
    </query>
    <success></success>
    <attributes>[[[[B, r, i, l, e, y], -40.9054], [[C, l, a, r, a], -92.4086], [[J, a, m, i, y, a], [J, e, l, l, y,  , D, r, o, p]], [[J, a, n, e, l, l, e], 132349223], [[S, a, r, a, i], 52.7312]]]</attributes>
    </start>