![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
The GrammarBoost , ,
грамматикаинкапсулирует набор правил. Классграмматикиявляется базовым классом протокола. По сути, это интерфейсный контракт.Грамматика— это класс шаблонов, который параметризируется его производным классоми его контекст,Контекст. Параметр шаблона ContextT по умолчанию соответствуетparser_context, предопределенному контексту. Вам не нужно беспокоиться о параметре шаблона ContextT, если вы не хотите изменить поведение грамматики на низком уровне. Подробная информация о параметре шаблона ContextT представленав другом месте. Грамматикаопирается на шаблонный параметр DerivedT, подкласс грамматики для определения фактических правил. Ниже представлен публичный API. ПослеContextTможет быть больше параметров шаблона. Все послеContextTне должно беспокоить клиента и предназначено исключительно для внутреннего использования.
Grammar definitionКонкретный подкласс, наследующий отграмматики, как ожидается, будет иметь вложенный класс шаблонов (или структуру), названныйопределением:
Grammar skeleton
Отделение типа сканера от правил, которые формируют грамматику, позволяет использовать грамматику в разных контекстах. Нам все равно, с каким сканером мы имеем дело. Пользовательскийmy_grammarможет быть использован слюбымтипом сканера. В отличие от правила, грамматика не привязана к определенному типу сканера. См."Scanner Business", чтобы понять, почему это важно, и получить дальнейшее понимание этой проблемы связи между сканером и управлением. Instantiating and using my_grammarНаша грамматика выше может быть начата и приведена в действие:
my_grammarIS-Aпарсер и может использоваться в любом месте, где ожидается парсер, даже ссылаясь на другое правило:
Full Grammar ExampleВспоминая наш оригинальный пример калькулятора, здесь он теперь переписан с помощью грамматики:
Grammar CapsulesПоскольку грамматика усложняется, рекомендуется группировать части в логические модули. Например, при написании языка было бы разумно поместить выражения и утверждения в отдельные грамматические капсулы. Грамматика использует преимущества свойств инкапсуляции классов C++. Декларативный характер классов делает его идеально подходящим для определения грамматики. Поскольку грамматика - это не что иное, как объявление класса, мы можем удобно публиковать ее в файлах заголовков. Идея заключается в том, что после написания и полного тестирования грамматика может быть повторно использована во многих контекстах. Теперь у нас есть понятие грамматических библиотек. Reentrancy and multithreadingПример грамматики может использоваться в разных местах несколько раз без каких-либо проблем. Реализация настроена на то, чтобы позволить это за счет некоторых накладных расходов. Однако мы можем сэкономить значительные циклы и байты, если уверены, что грамматика будет иметь только один экземпляр. Если это необходимо, просто определитеBOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCEперед включением любых файлов заголовка духов.
С другой стороны, если грамматика предназначена для использования в многопоточном коде, мы должны определитьBOOST_SPIRIT_THREADSAFE.перед включением любых файлов заголовка духов. В этом случае он также должен быть связан сBoost. Толчки #define BOOST_SPIRIT_THREADSAFE Using more than one grammar start ruleИногда желательно иметь более одной видимой точки входа в грамматику (кроме правила начала). Чтобы обеспечить дополнительные начальные точки, Spirit предоставляет шаблон помощникаgrammar_def, который может использоваться в качестве базового класса для определенияподкласса вашейграмматики. Вот пример:
Шаблонgrammar_defдолжен быть инстанцирован с типами всех правил, которые вы хотите сделать видимыми извнеgrammar:
Сокращенное обозначениетого жеиспользуется для обозначения того же типа, который используется в соответствии с предыдущим параметром шаблона (например,<
Используя класс грамматики_def, больше нет необходимости предоставлять функциюstart(). Вместо этого вам нужно будет вставить вызов наэто->start_parsers()(который является частью шаблонаgrammar_def), чтобы определить начальные символы для вашейграмматики.
Точка входа в грамматику может быть определена с использованием следующего синтаксиса:
Эта выборка показывает, как использоватьтерминправило изкалькулятора2грамматики выше:
Параметр шаблона дляuse_parser<>шаблонного типа должен быть нулевым индексом в списке правил, указанных в вызове функцииstart_parsers().
Максимальное количество полезных правил запуска ограничено константой препроцессора: BOOST_SPIRIT_GRAMMAR_STARTRULE_TYPE_LIMIT // defaults to 3
Copyright © 1998-2003 Joel de Guzman
Статья The Grammar раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |