2011-12-15 4 views
15

Lo skipper standard ascii::space_type ovviamente non salta i miei commenti. I documenti dicono che puoi fare il tuo parser di salto, ma non c'è un esempio di come farlo effettivamente.Custom Skip Parser con Boost :: Spirit

Avrei solo bisogno di un codice di esempio o altro, sono stato googling per 2 ore.

Si prega di non indicarmi il examples, i pochi collegamenti che funzionano sono irrimediabilmente obsoleti, che si occupano di Spirit 1.6.

+0

Hai esaminato gli esempi forniti con la distribuzione Boost? –

risposta

27

Dopo alcuni esperimenti, ho trovato un modo per specificare uno skipper personalizzato e vi illustrerà qui:

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; 

}; 

Il segreto sta nella chiamata del parser. Per qualche motivo, quando si desidera analizzare questo utilizzando parse_phrase, è necessario fornire un oggetto grammar skipper. Non ero a conoscenza di questo:

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); 

Questo funziona.

+1

Grazie per questo. Mi hai risparmiato un sacco di tempo oggi! – Dilawar