Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ 使用boost::qi::rule和boost\u FUSION\u ADAPT\u STRUCT的正确方法是什么?_C++_Boost Spirit_Boost Spirit Qi_Boost Fusion - Fatal编程技术网

C++ 使用boost::qi::rule和boost\u FUSION\u ADAPT\u STRUCT的正确方法是什么?

C++ 使用boost::qi::rule和boost\u FUSION\u ADAPT\u STRUCT的正确方法是什么?,c++,boost-spirit,boost-spirit-qi,boost-fusion,C++,Boost Spirit,Boost Spirit Qi,Boost Fusion,我试图获得一个qi::rule,以基于BOOST employee示例使用BOOST\u FUSION\u ADAPT\u结构发出一个结构 我有以下结构及其关联的fusion宏: struct LineOnCommand { int lineNum; std::vector<char> humpType; }; BOOST_FUSION_ADAPT_STRUCT( LineOnCommand, (int, lineNum) (std::vector&l

我试图获得一个qi::rule,以基于BOOST employee示例使用BOOST\u FUSION\u ADAPT\u结构发出一个结构

我有以下结构及其关联的fusion宏:

struct LineOnCommand
{
   int lineNum;
   std::vector<char> humpType;
};

BOOST_FUSION_ADAPT_STRUCT(
   LineOnCommand,
   (int, lineNum)
   (std::vector<char>, humpType)
)
struct LineOnCommand
{
int-lineNum;
std::矢量驼峰型;
};
增强融合适应结构(
LineOnCommand,
(int,lineNum)
(标准::矢量,驼峰型)
)
关联的解析规则包括:

qi::rule<Iterator, std::vector<char> ascii::space_type> humpIdentifer = qi::lit("BH") | qi::lit("DH");

qi::rule<Iterator, LineOnCommand(), ascii::space_type> Cmd_LNON = qi::int_ >> -humpIdentifier >> qi::lit("LNON");
qi::rule humpIdentifer=qi::lit(“BH”)| qi::lit(“DH”);
qi::rule Cmd_LNON=qi::int_>>-humpIdentifier>>qi::lit(“LNON”);
然后我有一个复合规则,其中所有其他规则(包括这个简单的测试用例)都是传递给解析器的一部分:

qi::rule<Iterator, qi::unused_type, ascii::space_type> commands =
   +( /* other rules | */ Cmd_LNON /*| other rules */);

bool success = qi::phrase_parse(StartIterator, EndIterator, commands, ascii::space);
qi::规则命令=
+(/*其他规则|*/Cmd|LNON/*|其他规则*/);
bool success=qi::phrase_parse(StartIterator、EndIterator、commands、ascii::space);
当我试图编译时,问题出现了,我得到了错误:

<boostsource>/spirit/home/qi/detail/assign_to.hpp(152): error: no suitable constructor exists to convert form "const int" to "LineOnCommand"
    attr = static_cast<Attribute>(val);
/spirit/home/qi/detail/assign\u to.hpp(152):错误:没有合适的构造函数将“const int”格式转换为“LineOnCommand”
attr=静态(val);
很明显我做错了什么,但我不确定是什么。如果我理解spirit的工作方式,规则模板的第二个参数表示属性(即规则发出的数据类型),BOOST_FUSION_ADAPT_STRUCT宏将调整我的结构,以便BOOST知道如何将“int,std::vector”流转换为它

我在这里所做的与boost employee示例之间的唯一区别是,我没有使用显式语法进行解析。我的理解是,这是没有必要的,规则本身就足够了


我做错了什么?

我不确定。我想我忽略了这个问题。也许,我“自然”回避了这个问题,因为你的样品不是独立的

因此,以下是我对它的看法:看看它,希望通过比较可以帮助你:

  • 我修正了你规则声明中的明显错误
  • 我提出了一些不同于
    qi::unused_type
    的建议;如果没有属性,就没有必要声明它;除了迭代器类型之外,
    qi::rule
    qi::grammar
    的模板参数不是位置参数。所以


    如果你的问题本质上是不相关的,通常更倾向于发布单独的问题。在本例中,它们是独立的。请尝试使示例独立。这使得人们可以更容易地提供帮助(我认为那些非常精通精神的常客可以用一只手的手指数出这些代码)。谢谢你的回答,这确实让我从困境中走了出来。但是,我发现LineOnCommand结构中的驼峰变量没有填充(它只是一个空向量)。如果我理解复合规则的工作方式,在您的示例中,它应该用“DH”、“BH”或“INVALID”填充。这对吗?@stix Ah。对不起,我错过了<代码>点亮不显示任何属性。使用
    字符串
    qi::rule<It, qi::unused_type(), ascii::space_type> r;
    qi::rule<It, ascii::space_type, qi::unused_type()> r;
    qi::rule<It, ascii::space_type> r;
    
    #include <boost/fusion/adapted/struct.hpp>
    #include <boost/spirit/include/qi.hpp>
    
    namespace qi = boost::spirit::qi;
    namespace ascii = boost::spirit::ascii;
    
    struct LineOnCommand
    {
       int lineNum;
       std::vector<char> humpType;
    };
    
    BOOST_FUSION_ADAPT_STRUCT(
       LineOnCommand,
       (int, lineNum)
       (std::vector<char>, humpType)
    )
    
    template <typename It, typename Skipper = ascii::space_type>
    struct parser : qi::grammar<It, std::vector<LineOnCommand>(), Skipper>
    {
        parser() : parser::base_type(commands)
        {
            using namespace qi;
            humpIdentifier = string("BH") | string("DH");
            Cmd_LNON       = int_ >> -humpIdentifier >> "LNON";
    
            commands       = +( /* other rules | */ Cmd_LNON /*| other rules */ );
        }
      private:
        qi::rule<It, std::vector<char>(),          Skipper> humpIdentifier;
        qi::rule<It, LineOnCommand(),              Skipper> Cmd_LNON;
        qi::rule<It, std::vector<LineOnCommand>(), Skipper> commands;
    };
    
    int main()
    {
        typedef std::string::const_iterator Iterator;
        parser<Iterator> p;
    
        std::string const input = 
            "123 BH LNON\n"
            "124 LNON\t\t\t"
            "125 DH LNON\n"
            "126 INVALID LNON";
    
        auto f(input.begin()), l(input.end());
    
        std::vector<LineOnCommand> data;
        bool success = qi::phrase_parse(f, l, p, ascii::space, data);
    
        std::cout << "success:" << std::boolalpha << success << ", " 
                  << "elements: " << data.size() << "\n";
    
        if (success)
        {
            for (auto& el : data)
            {
                std::cout << "Item: " << el.lineNum << ", humpType '" << std::string(el.humpType.begin(), el.humpType.end()) << "'\n";
            }
        }
    
        if (f!=l)
            std::cout << "Trailing unparsed: '" << std::string(f,l) << "'\n";
    
        return success? 0 : 1;
    }
    
    success:true, elements: 3
    Item: 123, humpType 'BH'
    Item: 124, humpType ''
    Item: 125, humpType 'DH'
    Trailing unparsed: '126 INVALID LNON'