Custom Skip Parser с Boost :: Spirit - PullRequest
       17

Custom Skip Parser с Boost :: Spirit

18 голосов
/ 15 декабря 2011

Стандартный ascii::space_type шкипер, конечно, не пропускает мои комментарии. В документах упоминается, что вы можете создать свой собственный парсер пропуска, но на самом деле нет примера того, как это сделать.

Мне просто нужен пример кода или еще что-нибудь, я уже 2 часа гуглю.

Пожалуйста, не указывайте мне на примеры , те несколько ссылок, которые работают безнадежно устарели, имея дело с Духом 1.6.

1 Ответ

31 голосов
/ 16 декабря 2011

После некоторых экспериментов я нашел способ указать собственный шкипер и обрисую его здесь:

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;

};

Секрет кроется в вызове парсера. По какой-то причине, когда вы хотите разобрать это с помощью parse_phrase, вы должны предоставить объект грамматики шкипера. Я не знал об этом:

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

Это работает.

...