L'annotation utilise la with<>
directive. Cela modifie le contexte de ces règles.
Le contexte, cependant, a été codé en dur config.hpp
car cela permet de séparer les définitions de règle dans leur propre unité de traduction (fichier source).
Pour le réparer directement:
struct position_cache_tag;
using position_cache = boost::spirit::x3::position_cache<std::vector<iterator_type>>;
using simple_context_type = x3::phrase_parse_context<x3::ascii::space_type>::type;
using context_type = boost::spirit::x3::context<
client::parser::position_cache_tag,
std::reference_wrapper<position_cache>,
simple_context_type
>;
Cela devrait déjà fonctionner. Cependant, vous trouverez d'autres éléments manquants car l'ancienne parse
fonction in main
(sans annotations de position) était également toujours présente. En principe, ajouter un triplet comme
BOOST_SPIRIT_INSTANTIATE(person_type, iterator_type, simple_context_type)
BOOST_SPIRIT_INSTANTIATE(employee_type, iterator_type, simple_context_type)
BOOST_SPIRIT_INSTANTIATE(employees_type, iterator_type, simple_context_type)
suffirait à alléger, mais alors, évidemment, le code d'annotation on_success
ne se compilera pas. Si vous le souhaitez, vous pouvez vous sortir de ce désordre, mais je viens de supprimer le code inutilisé main.cpp
.
PRIME
En prime, vous pouvez vous passer de reference_wrapper
ces jours, car je vois que vous utilisez Boost 1.70.
L'encapsuleur de référence était auparavant requis pour l'état mutable dans les directives, mais j'ai découvert récemment ( Spirit X3, Cette approche de gestion des erreurs est-elle utile? ) Que ce n'est plus nécessaire. Par conséquent, vous pouvez simplifier le contexte:
using context_type = boost::spirit::x3::context<
client::parser::position_cache_tag,
position_cache,
simple_context_type
>;
Et déposez le wrapper de référence aux deux extrémités:
auto &position_cache = x3::get<position_cache_tag>(context); // NOTE: no more .get()
Et
auto const parser =
with<position_cache_tag>(positions)[client::employees()];
Code complet (Github)
Voici mon code de travail: https://github.com/sehe/corrupted-spirit contenant les commits suivants dans l'ordre, il est donc facile de trouver ce qui a changé pourquoi:
commit 2d1d553afab53d7a83620406c2dcd50967bf2765
Date: Wed Jul 31 22:50:49 2019 +0200
Build tweaks
Make it compile on my linux box, and adding some minimum
debug/sanitizer/diagnostics flags
commit 98a989bb165d0b25b6919449d4dd09f7656168c8
Date: Wed Jul 31 22:51:50 2019 +0200
Various compiler wanrings, no impact
commit 91f5c607c10a489e2d7b9e45dca55438d05419a2
Date: Wed Jul 31 22:53:46 2019 +0200
Fixed style issues in main.cpp
- using namespace (my first hunch was with `ref` being std::ref instead
of boost::ref, but that turned out a red herring. Better to be explicit
though
- added condition on use of ast[1]
commit 084700c80023d4fb291bee36f41cb99f23f7dffa
Date: Wed Jul 31 22:51:20 2019 +0200
Fix the context_type in config.hpp
commit df7f9505e042b93bcd62167090e89008788218de (HEAD -> master, sehe/master)
Date: Wed Jul 31 22:56:20 2019 +0200
Simplify the with directive
1.70.0 no longer requires manual ref() for with directives with mutable
context items.