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)