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 : Sélectionner tout - Visualiser dans une fenêtre à part
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);
}