2011-12-15 9 views
15

El skipper estándar ascii::space_type no omite mis comentarios. Los documentos mencionan que puede hacer su propio analizador de saltos, pero no hay un ejemplo de cómo hacerlo.Skip Skip Parser con Boost :: Spirit

Solo necesitaría un código de ejemplo o algo así, he estado buscando en Google durante 2 horas.

Por favor, no me dirijan al examples, los pocos enlaces que funcionan son irremediablemente obsoletos, se trata de Spirit 1.6.

+0

¿Has mirado los ejemplos que vienen con la distribución de Boost? –

Respuesta

27

Después de algunos experimentos, he encontrado una manera de especificar un patrón de encargo y voy a exponer 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 quiera analizar esto usando parse_phrase, debe dar un objeto de gramática del patrón. Yo 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.

+1

Gracias por esto. ¡Me has ahorrado mucho tiempo hoy! – Dilawar

Cuestiones relacionadas