以下是boost spirit文檔中的employee.cpp源文件。它是'結構員工',後面是一個宏,它告訴'結構員工'的聚合,其次是員工解析器。使用精神解析類?
我想適應這個爲我的目的,而不是使用'結構員工',我有一些我想用來代替'結構員工'的類。
我正在試圖替換類結構員工',但我沒有看到宏融合做到這一點?而我不想把它放在結構體中的原因是因爲我不得不將它從struct複製到我的類中,而這看起來沒有必要,更不用說性能問題了。
經過多思考之後,我可能不會理解Fusion和元組的用途,因此,也許我必須這樣使用它,然後將數據移動到我自己的類結構中。
任何指導?
namespace client { namespace ast
{
///////////////////////////////////////////////////////////////////////////
// Our employee struct
///////////////////////////////////////////////////////////////////////////
struct employee
{
int age;
std::string surname;
std::string forename;
double salary;
};
using boost::fusion::operator<<;
}}
// We need to tell fusion about our employee struct
// to make it a first-class fusion citizen. This has to
// be in global scope.
BOOST_FUSION_ADAPT_STRUCT(
client::ast::employee,
(int, age)
(std::string, surname)
(std::string, forename)
(double, salary)
)
namespace client
{
///////////////////////////////////////////////////////////////////////////////
// Our employee parser
///////////////////////////////////////////////////////////////////////////////
namespace parser
{
namespace x3 = boost::spirit::x3;
namespace ascii = boost::spirit::x3::ascii;
using x3::int_;
using x3::lit;
using x3::double_;
using x3::lexeme;
using ascii::char_;
x3::rule<class employee, ast::employee> const employee = "employee";
auto const quoted_string = lexeme['"' >> +(char_ - '"') >> '"'];
auto const employee_def =
lit("employee")
>> '{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> '}'
;
BOOST_SPIRIT_DEFINE(employee);
}
}