gpt4 book ai didi

c++ - X3,什么是attr_gen?

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:44 26 4
gpt4 key购买 nike

我最终遇到了很多这些移动错误,除了与我解析字符串的方式有关外,我不太清楚为什么。删除与“dummy”有关的所有内容,然后错误又回来了。

有人提到使用 attr_gen(无法在文档中找到它),通过这样做,我可以克服这些“traits::move_to”编译错误,但解析器仍然失败。我已经标记了我添加的行以使其编译,但认为“<---”不是必需的。

#define BOOST_SPIRIT_X3_DEBUG

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

#include <boost/spirit/home/x3.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>

namespace client {
namespace ast {
struct number {
int num1;
int num2;
};

struct comment {
std::string text;
bool dummy; // <---
};

struct input {
std::vector<comment> comments;
std::vector<number> numbers;
};
}
}

BOOST_FUSION_ADAPT_STRUCT(client::ast::comment, text, dummy) // <---
BOOST_FUSION_ADAPT_STRUCT(client::ast::number, num1, num2)
BOOST_FUSION_ADAPT_STRUCT(client::ast::input, comments, numbers)

namespace client {
namespace parser {

namespace x3 = boost::spirit::x3;
namespace ascii = boost::spirit::x3::ascii;

using namespace x3;
x3::attr_gen dummy; // <---

auto const comment = char_ % ' ' >> dummy(false); // <---
//auto const comment = lexeme[+graph] >> dummy(false);
auto const number = int_ >> int_;

auto lines = [](auto p) { return *(p >> eol); };

auto const input = skip(blank) [
lines(comment) >>
lines(number)
];
}
}

int main()
{
namespace x3 = boost::spirit::x3;
using boost::spirit::x3::ascii::blank;
using x3::char_;

std::string const iss(R"(this is a test
1 2)");

auto iter = iss.begin(), eof = iss.end();

client::ast::input types;

bool ok = parse(iter, eof, client::parser::input, types);

if (iter != eof) {
std::cout << "Remaining unparsed: '" << std::string(iter, eof) << "'\n";
}
std::cout << "Parsed: " << (100.0 * std::distance(iss.begin(), iter) / iss.size()) << "%\n";
std::cout << "ok = " << ok << std::endl;

for (auto& item : types.comments) { std::cout << boost::fusion::as_deque(item) << "\n"; }
for (auto& item : types.numbers) { std::cout << boost::fusion::as_deque(item) << "\n"; }
}

最佳答案

x3::attr() 非常好 documented (它背后的生成器类型是一个实现细节,就像您使用 x3::int_ 而不是 x3::int_gen 一样)。

之前已经回答了您需要它的事实。关键是要有单元素融合序列。

关于c++ - X3,什么是attr_gen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45157367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com