解析成类(不是结构) [英] parsing into classes (not structs)
问题描述
在下面,我显示了一个未编译的精神雇员示例.我要解决的问题是解析为类而不是结构.我知道,除了公共/私营部门之外,其他方面都是相同的.但是在将类/结构存储到向量中之前,我需要有一个构造函数来工作.如何更改BOOST_FUSION_ADAPT_STRUCT?
below I show an edited spirits employee example which does not compile. The problem I want to solve is to parse into classes not structs. I know, it's quite the same besides public/private. But I need to have a constructor to work before storing the class/struct into vector. How do I change BOOST_FUSION_ADAPT_STRUCT?
如何使它运行?
// STD HEADER
#include <iostream>
#include <string>
#include <complex>
// BOOST HEADER
#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_object.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>
namespace client
{
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
class employee
{
public:
employee (
int _age
, std::string _surname
, std::string _forename
, double _salary
);
private:
int age_;
std::string surname_;
std::string forename_;
double salary_;
};
employee::employee (
int _age
, std::string _surname
, std::string _forename
, double _salary
) : age_(_age)
, surnemae_(_surename)
, forename_(_forename)
, double salary_
{
// do some important stuff
}
}
// WHAT TO DO HERE?
BOOST_FUSION_ADAPT_STRUCT(
client::employee
)
namespace client
{
template <typename Iterator>
struct employee_parser
: qi::grammar<Iterator, employee(), ascii::space_type>
{
employee_parser() : employee_parser::base_type(start)
{
using qi::int_;
using qi::lit;
using qi::double_;
using qi::lexeme;
using ascii::char_;
quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> '}'
;
}
qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
qi::rule<Iterator, employee(), ascii::space_type> start;
};
}
int main()
{
std::cout << "/////////////////////////////////////////////////////////\n\n";
std::cout << "\t\tAn employee parser for Spirit...\n\n";
std::cout << "/////////////////////////////////////////////////////////\n\n";
std::cout
<< "Give me an employee of the form :"
<< "employee{age, \"surname\", \"forename\", salary } \n";
std::cout << "Type [q or Q] to quit\n\n";
using boost::spirit::ascii::space;
typedef std::string::const_iterator iterator_type;
typedef client::employee_parser<iterator_type> employee_parser;
employee_parser g;
std::string str;
while (getline(std::cin, str))
{
if (str.empty() || str[0] == 'q' || str[0] == 'Q')
break;
client::employee emp;
std::string::const_iterator iter = str.begin();
std::string::const_iterator end = str.end();
bool r = phrase_parse(iter, end, g, space, emp);
if (r && iter == end)
{
std::cout << boost::fusion::tuple_open('[');
std::cout << boost::fusion::tuple_close(']');
std::cout << boost::fusion::tuple_delimiter(", ");
std::cout << "-------------------------\n";
std::cout << "Parsing succeeded\n";
std::cout << "got: " << boost::fusion::as_vector(emp) << std::endl;
std::cout << "\n-------------------------\n";
}
else
{
std::cout << "-------------------------\n";
std::cout << "Parsing failed\n";
std::cout << "-------------------------\n";
}
}
std::cout << "Bye... :-) \n\n";
return 0;
}
推荐答案
您可以
By adding getters/setters. The other answer links to this as a solution: http://www.boost.org/doc/libs/release/libs/fusion/doc/html/fusion/adapted/adapt_adt.html
查看 在Coliru上直播
See it Live On Coliru
更改:
- 使该类默认为可构造的
-
从规则的语义动作中显式调用构造函数:
- make the class default constructible
call the constructor explicitly from within the rule's semantic action:
start =
lit("employee")
>> ('{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> '}'
) [ qi::_val = boost::phoenix::construct<employee>(qi::_1, qi::_2, qi::_3, qi::_4) ]
;
(可选)重载operator<<
,因此您仍然可以打印该类以进行调试
optionally overload operator<<
so you can still print the class for debugging
3.提供定制点
请参见 http ://www.boost.org/doc/libs/1_56_0/libs/spirit/doc/html/spirit/advanced/customize/assign_to.html
这篇关于解析成类(不是结构)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!