![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Confix ParsersBoost , ,
Парсеры Confix распознают последовательность из трех независимых элементов: открытие, выражение и закрытие. Примером может служить комментарий C:
которые можно разобрать с помощью следующего определения правила:< rule<> c_comment_rule = confix_p("/*", *anychar_p, "*/") ; Confix_pГенератор парсера должен использоваться для генерации требуемого Confix Parser. Три параметра дляconfix_pмогут быть одиночные символы (как указано выше), строки или, если требуется более сложная логика разбора, вспомогательные парсеры, каждый из которых автоматически преобразуется в соответствующий тип парсера, необходимый для успешного разбора. Полученный парсер эквивалентен следующему правилу:
Если expr parser являетсяaction_parser_categoryтипа parser (парсер с прилагаемым семантическим действием), мы должны сделать что-то особенное. Это происходит, если пользователь написал что-то вроде:
где<
В большинстве случаев это не то, что ожидает пользователь. (Если этото, что вы ожидали, то, пожалуйста, используйтеconfix_pфункцию генератораdirect()), который будет препятствовать парсерному рефакторингу. Чтобы приставка-парсер вела себя так, как ожидалось:
Прикрепленный к парсеру<
которые без какого-либо рефакторинга привели бы к
и не даст ожидаемого результата (*anychar_p съест весь вход до конца входного потока). Поэтому мы должны переделать это в:< >то, что даст правильный результат. Случай, когда expr parser является комбинацией двух упомянутых проблем (т.е. expr parser является унарным парсером с прилагаемым действием), обрабатывается соответствующим образом, поэтому:
Будут разобраны, как и ожидалось:
Необходимый рефакторинг осуществляется здесь с помощьюРефакторинговых парсеров.
Шаблон генератора комментариев Parsercomment_pпомогает создать правильныйConfix Parserиз вспомогательных параметров, который способен анализировать конструкции комментариев следующим образом:
В качестве параметров поддерживаются следующие типы: парсеры, одиночные символы и строки (см. as_parser). Если он используется с одним параметром, то сопоставляется комментарий, начинающийся с заданного первого параметра парсера до конца строки. Например, следующий парсер соответствует комментариям в стиле C++:
Если он используется с двумя параметрами, то сопоставляется комментарий, начинающийся с первого парсерного параметра до второго парсерного параметра. Например, парсер комментариев в стиле C может быть сокращен как:
Генератор парсераcomment_pпозволяет генерировать парсеры для сопоставления невложенных комментариев (как для комментариев C/C++). Иногда необходимо разбирать вложенные комментарии, как, например, разрешено в Паскале.
Такие вложенные комментарии можно разбирать с помощью парсеров, генерируемых функтором шаблона шаблонаcomment_nest_p. В следующем примере показан парсер, который можно использовать для разбора двух различных (нестабильных) стилей комментариев Паскаля:
Обратите внимание, что комментарий анализируется неявно, как если бы веськомментарий_p(...)Заявление было встроено вlexeme_d[]директива, то есть во время разбора комментария не произойдет пропуска токена, даже если вы определили пропуск парсера для всего процесса разбора.
Это часть духовного распределения.
Copyright © 2001-2002 Hartmut Kaiser Статья Confix Parsers раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |