c++ parsing boost-spirit

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.