Spirit + phoenix + closure
Bonjour,
En gros, dans ma grammaire j'ai un premier champs qui me dit le nombre d'éléments qui suivent. Je n'arrive pas à la construire: je n'arrive pas à faire le lien entre le nombre d'éléments lire et un parser repeat_p. J'essaye avec lazy_p mais je ne vois pas du tout comment tourner la chose. L'aide boost m'a été assez peu précieuse alors si quelque a une piste, je suis preneur.
Code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include <iostream>
#include <boost/spirit.hpp>
#include <boost/spirit/dynamic/lazy.hpp>
using namespace BOOST_SPIRIT_CLASSIC_NS;
using namespace phoenix;
struct ma_closure : boost::spirit::closure<ma_closure, size_t>
{
member1 NbrElts;
};
class MaGrammaire
:public grammar<MaGrammaire>
{
public:
template <typename ScannerT>
struct definition
{
rule<ScannerT,ma_closure::context_t> liste;
rule<ScannerT> element;
definition(MaGrammaire const& self)
{
liste = uint_p[assign_a(liste.NbrElts)]>>":">>lazy_p(repeat_p(liste.NbrElts)[element]); // Comment faire?
element = uint_p>>",";
}
rule<ScannerT,ma_closure::context_t> const& start() const
{return liste;}
};
};
int main()
{
MaGrammaire MonParseur;
// Create a file iterator for this file
std::string L_strChaine("5:1,2,3,4,5,");
parse_info<char const*> info = parse(
L_strChaine.c_str(),
L_strChaine.c_str()+L_strChaine.length(),
MonParseur
);
if (info.full)
std::cout << "Parse succeeded!\n";
else
std::cout << "Parse failed!\n";
return std::getc(stdin);
} |