![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
PrimitivesBoost , ,
Рамка предопределяет некоторые парсерные примитивы. Это самые основные строительные блоки, которые клиент использует для создания более сложных парсеров. Эти примитивные парсеры являются шаблонными классами, что делает их очень гибкими. Эти примитивные парсеры могут быть инстанцированы непосредственно или через временную функцию помощника. Как правило, с функцией помощника гораздо проще справиться, поскольку она включает в себя меньше набора текста. До этого мы видели буквальный парсер символов через функцию генератораch_p.Это не парсер, а генератор парсера. Классchlit
Использование функции генератораchlitch_pупрощает использование классаchlit< >(это верно для большинства классов парсеров Spirit, поскольку большинство из них имеют соответствующие функции генератора). Функцию удобно называть, потому что компилятор выведет для нас тип шаблона посредством аргументного вывода. Приведенный выше пример можно выразить менее многословно, используя функцию помощникаch_p.
Следующий фрагмент грамматики показывает эти формы в действии:
chlit and ch_pСоответствует одному персонажу буквально.chlitимеет один параметр типа шаблона, который по умолчанию равенchar(т.е.chlit<>эквивалентенchlit
Вернемся к нашему первоначальному примеру:
Буквальные буквы,,«+»,«-»,«*»и«/»в грамматическом декларировании являютсяобъектами, которые неявно создаются за кулисами.
Можно предпочесть прямо заявить об этом как:
range and range_pдиапазонсимволов создается из пары низких/высоких символов. Такой парсер соответствует одному персонажу, который находится в диапазоне, включая обе конечные точки. Подобноchlit,диапазонимеет один параметр типа шаблона, который по умолчанию равенchar. Конструктор классадиапазонапринимает два параметра: диапазон символовотидовключительно. Версия генератора функций —range_p. Примеры:
Обратите внимание, что первый символ должен быть «до» второго, в соответствии с кодирующими символами. Диапазон, как и хлит, представляет собой одиночный парсер персонажей.
strlit and str_pЭтот парсер соответствует строке буквально.Стритимеет один параметр шаблонного типа: тип итератора. ВнутриСтритсодержит пару итератора начала/конца, указывающую на строку или контейнер символов. Стритпытается сопоставить текущий входной поток с этой строкой. Параметр шаблонного типа по умолчаниюchar const*.strlitимеет два конструктора. Первый принимает нулевой указатель персонажа. Этот конструктор может быть использован для построенияполосиз цитируемых струнных букв. Второй конструктор принимает первую/последнюю пару итераторов. Версия генератора функцийstr_p. Примеры:
chseq and chseq_pСоответствует последовательности персонажей.chseqимеет те же параметры шаблонного типа и параметры конструктора, что и Стрит. Версия генератора функцийchseq_p. Примеры:
strlit— неявная лексема. То есть работает исключительно на уровне персонажа.chseq,strlitблизнец, с другой стороны, может работать как на уровне персонажа, так и на уровне фразы. Это просто означает, что он может игнорировать белые пространства между струнными символами. Например:
Можно разобрать: ABCDEFG More character parsersТакже фреймворк предопределяет полный репертуар односимвольных парсеров:
negation ~Одиночные парсеры символов, такие какchlit,range,anychar_p,alnum_pи т.д., могут быть отрицаемы. Например:
Сравнение с любым персонажем, кроме'x'. Двойное отрицание парсера персонажа отменяет отрицание.~~alpha_pэквивалентноalpha_p. eol_pСоответствует концу строки (CR/LF и их комбинациям). nothing_pНикогда ничего не сравнится и всегда провалится. end_pСоответствует концу ввода (возвращает успешное совпадение с длиной 0, когда вход исчерпан) eps_pEpsilonepsilon_pиeps_p— многоцелевой парсер, возвращающий совпадение нулевой длины. См.Эпсилондля деталей.
Copyright © 1998-2003 Joel de Guzman
Статья Primitives раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||||||||||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |