C++ 精神X3合成属性
我正在尝试编写精神规则,但我无法确定这条新规则的属性是什么 下面的代码按照我的预期工作C++ 精神X3合成属性,c++,boost-spirit,C++,Boost Spirit,我正在尝试编写精神规则,但我无法确定这条新规则的属性是什么 下面的代码按照我的预期工作 #include <iostream> #include <boost/spirit/home/x3.hpp> #include <boost/fusion/include/adapt_struct.hpp> #include <boost/fusion/include/io.hpp> #include <boost/fusion/tuple.hpp>
#include <iostream>
#include <boost/spirit/home/x3.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/fusion/tuple.hpp>
namespace ast{
struct Record{
int id;
std::string name;
};
struct Document{
Record rec;
Record rec2;
//std::vector<Record> rec;
std::string name;
};
using boost::fusion::operator<<;
}
BOOST_FUSION_ADAPT_STRUCT(ast::Record,
name, id
)
BOOST_FUSION_ADAPT_STRUCT(ast::Document,
rec, rec2,
//rec,
name
)
namespace parser{
namespace x3 = boost::spirit::x3;
namespace ascii = boost::spirit::x3::ascii;
using x3::lit;
using x3::int_;
using ascii::char_;
const auto identifier = +char_("a-z");
const x3::rule<class record, ast::Record> record = "record";
const auto record_def = lit("record") >> identifier >> lit("{") >> int_ >> lit("}");
const x3::rule<class document, ast::Document> document = "document";
const auto document_def =
record >> record
//+record // This should generate a sequence
>> identifier
;
BOOST_SPIRIT_DEFINE(document, record);
}
namespace{
constexpr char g_input[] = R"input(
record foo{42}
record bar{73}
foobar
)input";
}
int main(){
using boost::spirit::x3::ascii::space;
std::string str = g_input;
ast::Document unit;
bool r = phrase_parse(str.begin(), str.end(), parser::document, space, unit);
std::cout << "Got: " << unit << "\n";
return 0;
}
#包括
#包括
#包括
#包括
#包括
名称空间ast{
结构记录{
int-id;
std::字符串名;
};
结构文档{
记录记录;
记录rec2;
//std::向量rec;
std::字符串名;
};
使用boost::fusion::运算符标识符>>lit(“{”)>>int_>>lit(“}”);
constX3::rule document=“document”;
常量自动文档定义=
记录>>记录
//+记录//这将生成一个序列
>>标识符
;
提升精神定义(文件、记录);
}
名称空间{
constexpr char g_输入[]=R“输入(
记录foo{42}
记录栏{73}
福巴
)输入”;
}
int main(){
使用boost::spirit::x3::ascii::space;
std::string str=g_输入;
ast::文档单元;
bool r=phrase_parse(str.begin(),str.end(),parser::document,space,unit);
std::cout我认为它没有编译的全部原因是因为您试图打印结果…而std::vector
不知道如何流式传输:
namespace ast {
using boost::fusion::operator<<;
static inline std::ostream& operator<<(std::ostream& os, std::vector<Record> const& rs) {
os << "{ ";
for (auto& r : rs) os << r << " ";
return os << "}";
}
}
印刷品
Got: ({ (foo 42) (bar 73) } foobar)
旁注:注意语法的一个概念性问题。通过正确的关键字识别来修复它:
Got: ({ (foo 42) (bar 73) } foobar)