我最終得到了這些移動錯誤很多,我不太清楚爲什麼除了解析字符串的方式之外。刪除與「虛擬」相關的所有內容,並返回錯誤。X3,attr_gen是什麼?
有人提到使用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"; }
}
如果拆分了關於解析的問題直到行結束爲止......一次詢問兩個不相關的問題就會使問題在未來對其他人無用。 – sehe
所以你忘了其他問題?我已經得到了答案[坐在這裏等待](https://stackoverflow.com/a/45162122/85371) – sehe
不得不逃跑,認爲它看起來很簡單。刪除了'直到問題'的問題。但是,我嘗試了所有這三種方法,並繼續出現錯誤。我並不太熟悉Qi和X3的差異,但我使用的是X3。我已將我的分析更改爲phrase_parse,但不知何故規則不能很好地與我有什麼混合。「保持字符串解決方法」是我選擇關注的方法,因爲它似乎是一個很好的解決方法。 – Ender