2 votes

Grammaire Boost.Spirit.Qi pour les valeurs par défaut dans Boost.Fusion adapt struct

struct coordinate {
  int x;
  int y;
  int z;
};

BOOST_FUSION_ADAPT_STRUCT(
  coordinate,
  (int, x)
  (int, y)
  (int, z)
)

template <typename Iterator>
struct coordinate_grammar : qi::grammar<Iterator, coordinate(), ascii::space_type>
{
  coordinate_grammar()
  :
    coordinate_grammar::base_type(start),
    optional_x(-(qi::int_ >> ':')),
    optional_z(-('@' >> qi::int_)),
    start(optional_x >> qi::int_ >> optional_z)
  {
  }

  qi::rule<Iterator, int, ascii::space_type> optional_x;
  qi::rule<Iterator, int, ascii::space_type> optional_z;
  qi::rule<Iterator, coordinate(), ascii::space_type> start;
};

Je souhaite définir 0 comme valeur par défaut de x y 1000 comme valeur par défaut de z .

Entrée --> Sortie souhaitée :

  • 200:400@300 --> [200,400,300]
  • 200:400 --> [200,400,1000]
  • 400@300 --> [0,400,300]
  • 400 --> [0,400,1000]

Comment dois-je modifier la syntaxe de la règle pour fournir une valeur par défaut lorsqu'une valeur n'a pas été spécifiée pour l'élément optionnel _( optional_x y optional_z )_ des analyseurs ?

1voto

Zak Points 2223

L'astuce consiste à reconsidérer la notion de "facultatif"...

optional_x(-(qi::int_ >> ':')),
optional_z(-('@' >> qi::int_)),

Comme nous le savons, la - indique que cette règle peut être spécifiée 0 ou 1 fois, ce qui la rend facultative.

Cependant, nous ne voulons pas vraiment avoir une valeur "optionnelle". Nous voulons soit la valeur qui a été analysée, soit une valeur par défaut. Ce n'est pas optionnel, c'est tout simplement l'un ou l'autre.

En modifiant la syntaxe de la règle, nous pouvons mieux décrire notre intention.

optional_x((qi::int_ >> ':') | qi::attr(0)),
optional_z(('@' >> qi::int_) | qi::attr(1000)),

Désormais, lorsque l'option est traitée, si vous n'avez pas fourni de valeur pour l'option x ou z une valeur sera fournie en votre nom par qi:attr(...) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X