![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Quickstart 3 - Counting Words Using a ParserBoost , Spirit 2.5.2 , Spirit.Lex Tutorials
|
Определение маркера |
Парсерная интеграция |
---|---|
< | Пример< |
Одиночный персонаж | Единый символ непосредственно используется в грамматике. Однако при определенных обстоятельствах его необходимо обернуть парсерным компонентом< |
явный токен id | Использование явного идентификатора токена вSpirit.QiГрамматика, которую вы должны обернуть специальным< |
В приведенном ниже определении грамматики используется каждый из трех типов, демонстрирующих их использование.
template <typename Iterator> struct word_count_grammar : qi::grammar<Iterator> { template <typename TokenDef> word_count_grammar(TokenDef const& tok) : word_count_grammar::base_type(start) , c(0), w(0), l(0) { using boost::phoenix::ref; using boost::phoenix::size; start = *( tok.word [++ref(w), ref(c) += size(_1)] | lit('\n') [++ref(c), ++ref(l)] | qi::token(IDANY) [++ref(c)] ) ; } std::size_t c, w, l; qi::rule<Iterator> start; };
Как уже было сказано (см.:Атрибуты),Spirit.Qiпарсерная библиотека построена на наборе полностью приписываемых парсерных компонентов. Следовательно, все определения токенов также поддерживают эту модель атрибутов. Наиболее естественным способом реализации этого было использование значений токенов в качестве атрибутов, раскрытых компонентом парсера, соответствующим определению токена (подробнее об этой теме можно прочитать здесь:О токенах и значениях токенов). В приведенном выше примере используется полная интеграция значений токена в качестве атрибутов парсера<token_def<>
>: определение токена<word
>объявляется как<token_def<std::string>
>, что делает каждый экземпляр токена<word
>нести представление строки согласованной входной последовательности в качестве ее значения. Семантическое действие, прилагаемое к<tok.word
>, получает эту строку (представленную<_1
>заполнителем) и использует ее для вычисления числа совпадающих символов:<ref(c)+=
size(_1)
>.
Основная функция должна реализовать немного больше логики, так как мы должны инициализировать и начать не только лексический анализ, но и процесс анализа. Три определения типов (93) упрощают создание лексического анализатора и грамматики. После прочтения содержимого данного файла в память он вызывает функцию<tokenize_and_parse()
>для инициализации лексического анализа и разбора процессов.
int main(int argc, char* argv[]) {typedef lex::lexertl::token< char const*, boost::mpl::vector<std::string> > token_type;
typedef lex::lexertl::lexer<token_type> lexer_type;
typedef word_count_tokens<lexer_type>::iterator_type iterator_type; // now we use the types defined above to create the lexer and grammar // object instances needed to invoke the parsing process word_count_tokens<lexer_type> word_count; // Our lexer word_count_grammar<iterator_type> g (word_count); // Our parser // read in the file int memory std::string str (read_from_file(1 == argc ? "word_count.input" : argv[1])); char const* first = str.c_str(); char const* last = &first[str.size()];
bool r = lex::tokenize_and_parse(first, last, word_count, g); if (r) { std::cout << "lines: " << g.l << ", words: " << g.w << ", characters: " << g.c << "\n"; } else { std::string rest(first, last); std::cerr << "Parsing failed\n" << "stopped at: \"" << rest << "\"\n"; } return 0; }
Определите тип токена, который будет использоваться:< | |
Определить тип лексера для использования реализации государственной машины | |
Определить тип итератора, подверженный типу лексера | |
Парсинг выполняется на основе потока токенов, а не потока символов, считываемого с ввода. Функция< |
Статья Quickstart 3 - Counting Words Using a Parser раздела Spirit 2.5.2 Spirit.Lex Tutorials может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Spirit.Lex Tutorials ::
реклама |