![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
IntroductionBoost , ,
Spirit - объектно-ориентированная рекурсивно-сценическая модель генератора парсера, реализованная с использованием методов мета-программирования шаблонов. Шаблоны экспрессии позволяют нам полностью приблизить синтаксис Расширенной формы Backus-Normal (EBNF) на C++. Рамки Духа позволяют писать целевую грамматику исключительно на C++. Инлайновые грамматические спецификации EBNF могут свободно смешиваться с другим кодом C++ и, благодаря генеративной силе шаблонов C++, сразу могут быть исполняемыми. В ретроспективе обычные компилятор-компиляторы или парсер-генераторы должны выполнять дополнительный шаг перевода от исходного кода EBNF до кода C или C++. Простой грамматический фрагмент EBNF:
приблизится к использованию объектов Духа, как видно из этого фрагмента кода:
Благодаря магии шаблонов выражения, это совершенно действительный и исполняемый код C++. Правило производства экспрессия на самом деле является объектом, который имеет деловую функцию члена, которая делает работу с исходным кодом, написанным в грамматике, которую мы только что объявили. Да, это калькулятор. На данный момент мы упростим, пропустив заявления типа и определение правила integer, на которое ссылается factor. Правило производства экспрессия в нашей грамматической спецификации, традиционно называемой символом старта, может распознавать входы, такие как:
Конечно, мы внесли некоторые изменения в оригинальный синтаксис EBNF. Это делается для соответствия правилам синтаксиса C++. В частности, мы видим обилие сдвига >> операторов. Поскольку в C++ нет «пустые» операторы, просто невозможно написать что-то вроде:
как видно в математическом синтаксисе, например, означает умножение или, в нашем случае, как видно в синтаксисе EBNF, означает последовательность (b должен следовать a). Рамки используют смену > оператора вместо этого. Мы принимаем оператора > с стрелками, указывающими на право, что означает "следует". Так мы пишем:
Альтернативный оператор | и скобки () остаются таковыми. Оператор уступки = используется вместо EBNF ::=. И последнее, но не менее важное: звезда Kleene *, которая раньше была оператором постфикса в EBNF, становится префиксом. Вместо:
мы пишем:
так как нет постфиксов, «*», в C/C++. Наконец, мы прекращаем каждое правило с вездесущим полуколоном, «;».
Copyright © 1998-2003 Joel de Guzman
Статья Introduction раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |