簡體   English   中英

BOOST_FUSION_ADAPT_STRUCT的boost :: spirit編譯問題

[英]boost::spirit compile issue with BOOST_FUSION_ADAPT_STRUCT

我是新來提升:: spirit / fusion的人。 有人可以向我解釋為什么不編譯以下內容嗎? 如果將m_namem_settings變量直接放在config結構中,則可以正常編譯,但將它們分成兩個不同的結構時編譯失敗。 我想念什么?

順便說一句,使編譯器噴出大量的boost::spirit errors is: cfg = section >> node;的代碼行boost::spirit errors is: cfg = section >> node;

#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>
#include <boost/fusion/include/adapt_struct.hpp>

#include <iostream>
#include <string>
#include <vector>

namespace qi = boost::spirit::qi;
namespace fusion = boost::fusion;
namespace phoenix = boost::phoenix;
namespace ascii = boost::spirit::ascii;

struct config_section
{
  std::string m_name;
  std::string m_settings;
};

struct config
{
  config_section m_sections;
};

BOOST_FUSION_ADAPT_STRUCT(
    config_section,
    (std::string, m_name)
    (std::string, m_settings)
)

BOOST_FUSION_ADAPT_STRUCT(
    config,
    (config_section, m_sections)
)

template <typename Iterator>
struct config_grammar : qi::grammar<Iterator, config(), ascii::space_type>
{
  config_grammar() : config_grammar::base_type(cfg)
  {
    using qi::lexeme;
    using qi::lit;
    using ascii::string;
    using ascii::char_;
    using namespace qi::labels;

    section %= '[' >> lexeme[+(char_ - ']')] >> ']';

    node %= !lit('[') >> lexeme[+(char_ - '\n')];

    cfg %= section >> node;
  }

  qi::rule<Iterator, config(), ascii::space_type> cfg;
  qi::rule<Iterator, std::string(), ascii::space_type> node;
  qi::rule<Iterator, std::string(), ascii::space_type> section;
};

template <typename Iterator>
bool parse_config(Iterator first, Iterator last)
{
  using qi::double_;
  using qi::phrase_parse;
  using ascii::space;
  using boost::phoenix::ref;

  config result;
  config_grammar<Iterator> config_parser;

  bool r = phrase_parse(first, last, config_parser, space, result);
  if (first != last) // fail if we did not get a full match
    return false;

  return r;
}

int main()
{
  std::string input = "[section]\nstuff";

  bool b = parse_config(input.begin(), input.end());

  if (b)
    std::cout << "Success" << std::endl;
  else
    std::cout << "Failure" << std::endl;

  return 0;
}

謝謝!

問題似乎是您沒有指定如何從config_section轉換為config。 您告訴過精神,config_section由2個字符串組成,但是嘗試在沒有規則的情況下解析配置,以鏈接配置和config_section之間的轉換。 這似乎可以編譯。

template <typename Iterator>
struct config_grammar : qi::grammar<Iterator, config(), ascii::space_type>
{
  config_grammar() : config_grammar::base_type(cfg)
  {
    using qi::lexeme;
    using qi::lit;
    using ascii::string;
    using ascii::char_;
    using namespace qi::labels;

    section %= '[' >> lexeme[+(char_ - ']')] >> ']';

    node %= !lit('[') >> lexeme[+(char_ - '\n')];

    //create a rule to specify conversion of a config_section to a config
    cfg %= cfg_sec;
    //this a now a cfg_sec (which is what you declared to be composed of 2
    //  strings)
    cfg_sec %= section >> node;
  }

  qi::rule<Iterator, config(), ascii::space_type> cfg;
  //add new declaration here for cfg_sec
  qi::rule<Iterator, config_section(), ascii::space_type> cfg_sec;
  qi::rule<Iterator, std::string(), ascii::space_type> node;
  qi::rule<Iterator, std::string(), ascii::space_type> section;
};

問題在於,您的cfg規則和config_grammar語法的屬性不是config ,而是(據我所知-因為它是兩個隨后的字符串) config_section 更換之后:

struct config_grammar : qi::grammar<Iterator, config_section(), ascii::space_type>
....
qi::rule<Iterator, config_section(), ascii::space_type> cfg;

它編譯。

我建議您更多地了解規則的屬性以及它們如何工作-否則您會一直迷路。

暫無
暫無

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

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