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

Epsilon

Boost , ,

Epsilon

Эпсилон(epsilon_pиeps_p) — многоцелевой парсер, возвращающий совпадение нулевой длины.

Simple Form

В своей простейшей форме epsilon_p соответствует нулевой струне и всегда возвращает матч нулевой длины:

    epsilon_p // always returns a zero-length match

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

    r = A | B | C | eps_p[error]; // error if A, B, or C fails to match

Semantic Predicate

Семантические предикаты позволяют прикрепить функцию в любом месте грамматики. В этой роли эпсилон принимает 0-арную (нулярную) функцию/функтор. Функция/функтор времени выполнения обычно является тестом, который призван устранить неоднозначность в грамматике. О сбое анализа будет сообщено, когда результат функции/функтора будет оценен как ложный. В противном случае будет объявлен пустой матч. Общая форма:

    eps_p(f) >> rest;

Нулярная функцияfвызывается для выполнения семантического теста (скажем, проверки, находится ли символ в таблице символов). Если жеистинно, топокойбудет оценен. В противном случае производство вернется раньше без матча, никогда не касаясьотдыха.

Syntactic Predicate

Подобно семантическим предикатам, синтаксические предикаты утверждают, что определенный условный синтаксис должен быть удовлетворен, прежде чем оценивать другую продукцию. На этот раз epsilon_p принимает (условный) парсер. Общая форма:

    eps_p(p) >> rest;

Еслирсовпадает с входным потоком, то попытайтесь распознатьпокой. Парсерpвызывается для проверки синтаксиса. Несмотря на успехp,eps_p(p)всегда возвращает совпадение нулевой длины (т.е. вход не потребляется). Если жеистинно, топокойбудет оценен. В противном случае производство вернется раньше без матча, никогда не касаясьотдыха.

Пример:

    eps_p('0') >> oct_p // note that '0' is actually a ch_p('0') 

Эпсилон здесь используется в качестве синтаксического предиката.oct_p(см.цифры) разбирается только в том случае, если мы видим ведущую'0'. Обертывание ведущего'0'внутри эпсилона заставляет парсер ничего не потреблять из входа. Если'0'видно,epsilon_pсообщает об успешном матче с нулевой длиной.

Primitive arguments

Epsilon allows primitive type arguments such as char, int, wchar_t, char const*, wchar_t const* and so on. Examples:

eps_p("hello") // same as eps_p(str_p("hello"))
eps_p
('x') // same as eps_p(ch_p('x'))

Inhibiting Semantic Actions

В синтаксическом предикатеeps_p(p)любое семантическое действие, прямо или косвенно прикрепленное к условному парсеруp, называться не будет. Однако семантические действия, прилагаемые к самому эпсилону, всегда будут называться. Следующие фрагменты кода иллюстрируют поведение:

    eps_p(c[f])  // f not called
eps_p(c)[f] // f is called
eps_p[f] // f is called

Фактически, условный парсерpнеявно завернут в директивуno_actions_d:

    no_actions_d[p]

Условный парсер должен быть свободен от побочных эффектов (семантических действий).<>Цель условного парсера состоит в том, чтобы разрешить двусмысленность, заглядывая вперед во входной поток для определенного шаблона. Неоднозначность и семантические действия плохо сочетаются. На двусмысленной грамматике происходит обратный путь. И когда это происходит, мы не можем отменить последствия семантических действий.

Negation

Оператор~определен для парсеров, построенных поepsilon_p/eps_p. Он выполняет отрицание, дополняя сообщенные результаты.~~eps_p(x)идентиченeps_p(x).



 

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




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



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


реклама


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

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