Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Distinct Parser

Boost , ,

Distinct Parser

Distinct Parsers

Различные парсеры являются утилитарными парсерами, которые гарантируют, что соответствующий ввод не сразу последует за запрещенной моделью. Их типичное использование состоит в том, чтобы отличить ключевые слова от идентификаторов.

distinct_parser

Основное использование distinct_parser означает замену str_p parser. Например, декларация_правило в следующем примере:

    rule<ScannerT> declaration_rule = str_p("declare") >> lexeme_d[+alpha_p];

будет правильно соответствовать входной "декларе abc " , но также входной "деклареабк " , что обычно не предназначено. Чтобы избежать этого, мы можем использовать distinct_parser:

    // keyword_p may be defined in the global scope
    distinct_parser<> keyword_p("a-zA-Z0-9_");
    rule<ScannerT> declaration_rule = keyword_p("declare") >> lexeme_d[+alpha_p];

keyword_p работает так же, как и str_p parser, но совпадает только тогда, когда соответствующий вход не сразу последует один из символов из набора, переданного конструктору keyword_p. В примере < < деклара > > не может быть немедленно за ней следуют ни один алфавитный характер, ни какое-либо число, ни подчеркивание.

Смотрите полный пример здесь .

distinct_directive

Для более сложных случаев, например, когда ключевые слова хранятся в таблице символов, мы можем использовать distinct_directive.

    distinct_directive<> keyword_d("a-zA-Z0-9_");
    symbol<> keywords = "declare", "begin", "end";
    rule<ScannerT> keyword = keyword_d[keywords];

dynamic_distinct_parser and dynamic_distinct_directive

В некоторых случаях количество запрещенных последующих персонажей недостаточно. Например, условности имен ASN.1 позволяют идентификаторам содержать тире, но не двойные махи (что знаменует собой начало комментария). Кроме того, идентификаторы не могут закончиться тире. Таким образом, соответствующее ключевое слово не может сопровождаться каким-либо буквенно-цифровым характером или ровно одним тире, но за ним могут последовать два даши.

Это когда dynamic_distinct_parser и dynamic_distinct_directive в игру. Конструктор dynamic_distinct_parser принимает парсер, который соответствует любому входу, который НЕ следует за ключевым словом.

    // Alphanumeric characters and a dash followed by a non-dash
    // may not follow an ASN.1 identifier.
    dynamic_distinct_parser<> keyword_p(alnum_p | ('-' >> ~ch_p('-')));
    rule<ScannerT> declaration_rule = keyword_p("declare") >> lexeme_d[+alpha_p];

Поскольку dynamic_distinct_parser использует внутреннее правило, его тип зависит от типа сканера. Таким образом, keyword_p не должно быть определено глобально, а скорее в грамматике.

Смотрите полный пример здесь.

How it works

Когда keyword_p_1 и keyword_p_2 определены как

    distinct_parser<> keyword_p(forbidden_chars);
    distinct_parser_dynamic<> keyword_p(forbidden_tail_parser);

парсеры

    keyword_p_1(str)
    keyword_p_2(str)

эквивалентны правилам

    lexeme_d[chseq_p(str) >> ~epsilon_p(chset_p(forbidden_chars))]
    lexeme_d[chseq_p(str) >> ~epsilon_p(forbidden_tail_parser)]


Статья Distinct Parser раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:02:36/0.0055270195007324/1