Je base mon application sur cet exemple et obtient les mêmes résultats. Pour une raison quelconque, le contenu de la chaîne d'entrée est analysé dans la structure de fusion 'comments', et rien n'est analysé dans la structure de fusion 'numbers'. Donc je ne sais pas où je vais mal ici.X3: Est-ce que cet analyseur syntaxique, * (char-eol), consomme toutes les lignes?
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;
using namespace x3;
x3::attr_gen dummy;
typedef std::string::const_iterator It;
using namespace x3;
auto const comment = *(char_ - eol) >> dummy(false);
auto const number = int_ >> int_;
auto lines = [](auto p) { return *(p >> eol); };
auto const input =
lines(comment) >>
lines(number);
}
}
int main()
{
namespace x3 = boost::spirit::x3;
std::string const iss("any char string here\n1 2\n");
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;
// This range loop prints all contents if input.
for (auto& item : types.comments) { std::cout << "comment: " << boost::fusion::as_deque(item) << "\n"; }
// This loop prints nothing.
for (auto& item : types.numbers) { std::cout << "number: " << boost::fusion::as_deque(item) << "\n"; }
}
Ma plus grande application fait la même chose avec un grand fichier d'entrée et plusieurs de plus de AST, mais il semblerait tous mes exemples sont consommés par l'analyseur de commentaire.
Voici l'exemple complet de fonctionnement.
http://coliru.stacked-crooked.com/a/f983b26d673305a0
pensées?
Que fait 'lines (parser)'? – llonesmiz
lignes (analyseur)? lignes fait en sorte que chaque analyseur (c'est-à-dire, lignes (commentaire), lignes (nombre) est suivi par un eol – Ender
Il fait plus que cela ... – llonesmiz