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

Dynamic Parsers

Boost , ,

Dynamic Parsers

Мы видим динамический разбор повсюду в Духе. Специальная группа парсеров, метко названных динамическими парсерами, образует самые основные строительные блоки для динамического парсеринга. Эта глава посвящена этим тварям. Вы заметите сходство этих парсеров со структурами управления C++. Сходство не является совпадением. Эти парсеры придают императивный вкус парсингу, и, поскольку императивные конструкции не являются родными для декларативного EBNF, имитируя язык хоста, C++, должны сделать их использование сразу знакомым.

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

Conditions

В качестве условий могут использоваться функции или функторы, возвращающие значения, конвертируемые в bool. Когда оценка функции/функтора дает истинное значение, она рассматривается как удовлетворяющая условию.

Парсеры также могут использоваться в качестве условий. Когда парсер совпадает, условие выполняется. Парсеры, используемые в качестве условий, работают в режиме «все или ничего»: сканер не будет усовершенствован, когда они не совпадают.

Неспособность выполнить условие не приведет к ошибке анализа.

if_p

if_pМожно использовать с другой частью или без нее. Синтаксис это:

    if_p(condition)[then-parser]

или

    if_p(condition)[then-parser].else_p[else-parser]

Когда условие выполнено, тогда-парсер используется следующим в процессе разбора. Когда условие не выполнено и другой-парсер доступен, другой-парсер используется следующим. Когда условие не выполнено и больше не доступен парсер, тогда весь парсер соответствует пустой последовательности. (Примечание: старые версииif_pсообщать о сбое, когда условие не выполнено и больше не доступен.

Пример:

    if_p("0x")[hex_p].else_p[uint_p]

while_p, do_p

в то время как_p/do_pСинтаксис:

    while_p(condition)[body-parser]
do_p[body-parser].while_p(condition)

До тех пор, пока условие выполнено, динамический парсер, построенный, в то время как _pбудет пытаться соответствовать парсеру тела.do_pвозвращает парсер, который пытается соответствовать парсеру тела, а затем ведет себя так же, как парсер, возвращенный, в то время как_p. Неспособность сопоставить тело-парсер приведет к тому, что не будет сообщено в то время / до-парсер.

Пример:

    uint_p[assign_a(sum)] >> while_p('+')[uint_p[add(sum)]]
'"' >> while_p(~eps_p('"'))[c_escape_ch_p[push_back_a(result)]] >> '"'

Предполагая, чтодобавитьявляется объектом функции, определенной пользователем.

for_p

для pтребуется четыре аргумента. Синтаксис это:

    for_p(init, condition, step)[body-parser]

Init и step должны быть 0-ary функциями. for_p возвращает парсер, который:

  1. вызывать
  2. Проверьте условие, если условие не выполнено, то матч возвращается. Матч будет охватывать все, что было успешно отыграно до этого момента.
  3. Пытается сопоставить тело-парсер. Неспособность сопоставить тело-парсер приведет к тому, что о несоответствии сообщит фор-парсер.
  4. Шаг шага
  5. Относится к 2.


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




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



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


реклама


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

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