c++ - Personalizar Skip Parser con Boost:: Spirit
parsing boost-spirit (1)
Después de algunos experimentos, he encontrado una manera de especificar un patrón personalizado y lo describiré aquí:
template<typename Iterator>
struct pl0_skipper : public qi::grammar<Iterator> {
pl0_skipper() : pl0_skipper::base_type(skip, "PL/0") {
skip = ascii::space | (''{'' >> *(qi::char_ - ''}'') >> ''}'');
}
qi::rule<Iterator> skip;
};
template<typename Iterator, typename Skipper = pl0_skipper<Iterator>>
struct pl0_grammar : public qi::grammar<Iterator, Skipper> {
/* The rules use our skipper */
qi::rule<Iterator, Skipper> start;
qi::rule<Iterator, Skipper> block;
qi::rule<Iterator, Skipper> statement;
};
El secreto está en la llamada del analizador. Por alguna razón, cuando desea analizar esto usando parse_phrase
, tiene que dar un objeto de gramática de patrón. No estaba al tanto de esto:
typedef std::string::const_iterator iterator_t;
typedef parser::pl0_grammar<iterator_t> grammar;
typedef parser::pl0_skipper<iterator_t> skipper;
grammar g;
skipper ws;
iterator_t iter = str.begin();
iterator_t end = str.end();
bool r = phrase_parse(iter, end, g, ws);
Esto funciona.
El patrón estándar de ascii::space_type
no omite mis comentarios. Los documentos mencionan que puedes crear tu propio analizador de omisión, pero no hay ningún ejemplo de cómo hacerlo.
Solo necesitaría un código de ejemplo o algo así, he estado buscando en Google por 2 horas.
Por favor, no me apunten a los examples , los pocos enlaces que funcionan están totalmente desactualizados, tratando con Spirit 1.6.