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

Lexer Semantic Actions

Boost , Spirit 2.5.2 , Abstracts

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Основная задача лексера обычно заключается в распознавании токенов во входе. Традиционно это дополняется возможностью выполнения произвольного кода при обнаружении определенного токена.Spirit.Lexбыл разработан для поддержки этого режима работы. Мы позаимствованы из понятия семантических действий для парсеров (Spirit.Qi) и генераторов (Spirit). карма. Семантические действия Лексера могут быть прикреплены к любому определению токена. Это функции C++ или объекты функций, которые называются всякий раз, когда определение токена успешно распознает часть ввода. Скажем, у вас есть определение токена<D>и функция C++<f>, вы можете сделать вызов лексера<f>всякий раз, когда он соответствует входу, прикрепив<f>:

D[f]

Выражение выше связывает<f>с определением токена<D>. Требуемый прототип<f>:

void f (Iterator& start, Iterator& end, pass_flag& matched, Idtype& id, Context& ctx);

where:

Iterator& start

Это итератор, указывающий на начало согласованного диапазона в базовой входной последовательности. Тип итератора совпадает с указанным при определении типа<lexertl::actor_lexer<...>>(его первого шаблонного параметра). Семантическое действие позволяет изменить значение этого итератора, воздействующего на согласованную входную последовательность.

Iterator& end

Это итератор, указывающий на конец согласованного диапазона в базовой входной последовательности. Тип итератора совпадает с указанным при определении типа<lexertl::actor_lexer<...>>(его первого шаблонного параметра). Семантическое действие позволяет изменить значение этого итератора, воздействующего на согласованную входную последовательность.

pass_flag& matched

Это значение предварительно/инициализировано до<pass_normal>. Если семантическое действие устанавливает его<pass_fail>, это ведет себя так, как если бы токен не был подобран в первую очередь. Если семантическое действие устанавливает это на<pass_ignore>лексер игнорирует текущий токен и пытается сопоставить следующий токен с входом.

Idtype& id

Это идентификатор токена типа Idtype (в большинстве случаев это будет<std::size_t>) для соответствующего токена. Семантическое действие позволяет изменить значение этого идентификатора токена, влияя на то, был ли создан токен.

Context& ctx

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

При использовании функции C++ в качестве семантического действия допускаются следующие прототипы:

void f (Iterator& start, Iterator& end, pass_flag& matched, Idtype& id);
void f (Iterator& start, Iterator& end, pass_flag& matched);
void f (Iterator& start, Iterator& end);
void f ();
[Important] Important

Для того, чтобы использовать семантические действия лексера, необходимо использовать тип<lexertl::actor_lexer<>>в качестве класса лексера (вместо типа<lexertl::lexer<>>, как описано в более ранних примерах).

The context of a lexer semantic action

Последний параметр, переданный любому семантическому действию лексера, является ссылкой на неопределенный тип (см. тип<Context>в таблице выше). Этот тип не определен, потому что он зависит от типа токена, возвращаемого лексером. Он реализуется во внутренних элементах типа итератора, открытых лексером. Тем не менее, любой тип контекста, как ожидается, выявит несколько функций, позволяющих влиять на поведение лексера. В следующей таблице приводится обзор и краткое описание имеющейся функциональности.

Table 8. Functions exposed by any context passed to a lexer semantic action

Имя

Описание

<Iteratorconst&get_eoi()const>

Функция<get_eoi()>может быть использована для доступа к конечному итератору входного потока, который был инициализирован лексером

.

<voidmore()>

Функция<more()>сообщает лексеру, что в следующий раз, когда она соответствует правилу, соответствующий токен должен быть добавлен к текущему значению токена, а не заменять его.

<Iteratorconst&less(Iterator const& it, intn)>

Функция<less()>возвращает итератор, расположенный к n-му входному символу за пределами итератора запуска токена тока (т.е., передавая возвращаемое значение параметру<end>, можно вернуть все, кроме первых n символов токена тока обратно во входной поток).

<boollookahead(std::size_t id)>

Функция<lookahead()>может быть использована для реализации переднеприводных лексеров, не поддерживающих конструкции типа flex'<a/b>(совпадение<a>, но только тогда, когда за ним следует<b>). Он вызывает лексера на входе после текущего токена, фактически не продвигаясь вперед во входном потоке. Функция возвращает, смог ли лексер сопоставить токен с данным токен-идом<id>

.

<std::size_tget_state()const>и<voidset_state(std::size_t state)>

Функции<get_state()>и<set_state()>могут использоваться для интроспекции и изменения текущего состояния лексера.

<token_value_typeget_value() const>и<voidset_value(Value const&)>

Функции<get_value()>и<set_value()>могут использоваться для интроспекции и изменения текущего значения токена.


Lexer Semantic Actions Using Phoenix

Даже если возможно написать собственные реализации объектов функций (т.е. используя Boost.Lambda или Boost.Bind), предпочтительным способом определения семантических действий лексера является использованиеBoost.Phoenix. В этом случае вы можете получить доступ к параметрам, описанным выше, используя предварительно заданные заполнителиSpirit:

Table 9. Predefined Phoenix placeholders for lexer semantic actions

владелец

Описание

<_start>

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

<_end>

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

<_pass>

Ссылки на значение, сигнализирующее о результате семантического действия. Это было сделано заранее<lex::pass_flags::pass_normal>. Если это установлено на<lex::pass_flags::pass_fail>, лексер будет вести себя так, как если бы токен не был сопоставлен, если установлено на<lex::pass_flags::pass_ignore>, лексер будет игнорировать текущее соответствие и продолжать пытаться сопоставить токены с входом.

<_tokenid>

относится к идентификатору токена генерируемого токена. Любые изменения этого значения будут отражены в генерируемом токене.

<_val>

Относится к значению, из которого будет инициализирован следующий токен. Любые изменения этого значения будут отражены в генерируемом токене.

<_state>

Относится к состоянию лексера, в котором вход был согласован. Любые изменения этого значения будут отражены в самом лексере (следующий матч начнется в новом состоянии). В настоящее время генерируемый токен не зависит от изменений этой переменной.

<_eoi>

Ссылки на конечный итератор общего ввода лексера. Это значение не может быть изменено.


Объект контекста, переданный в качестве последнего параметра любому семантическому действию лексера, недоступен напрямую при использовании выраженийBoost.Phoenix. Мы скорее предоставляем заранее определенные функции Phoenix, позволяющие задействовать различные функции поддержки. В следующей таблице перечислены доступные функции поддержки и описаны их функциональные возможности:

Table 10. Support functions usable from Phoenix expressions inside lexer semantic actions

Простая функция

Функция Феникса

Описание

<ctx.more()>

<more()>

Функция<more()>сообщает лексеру, что в следующий раз, когда она соответствует правилу, соответствующий токен должен быть добавлен к текущему значению токена, а не заменять его.

<ctx.less()>

<less(n)>

Функция<less()>принимает один целочисленный параметр<n>и возвращает итератор, расположенный к n-му входному символу за пределами итератора запуска токена тока (т.е. путем присвоения возвращаемого значения заполнителю<_end>можно вернуть все, кроме первых<n>символов токена тока обратно во входной поток).

<ctx.lookahead()>

<lookahead(std::size_t)>или<lookahead(token_def)>

Функция<lookahead()>принимает один параметр, определяющий токен для соответствия во входе. Функция может быть использована, например, для реализации передней панели для лексеров, не поддерживающих конструкции, такие как flex'<a/b>(совпадение<a>, но только тогда, когда за ним следует<b>). Он вызывает лексера на входе после текущего токена, фактически не продвигаясь вперед во входном потоке. Функция возвращает, смог ли лексер соответствовать указанному токену.



PrevUpHomeNext

Статья Lexer Semantic Actions раздела Spirit 2.5.2 Abstracts может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:10:25/0.0087990760803223/0