![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
DebuggingBoost , ,
Природа Spirit сверху вниз позволяет легко отлаживать генерируемый парсер с помощью стандартного отладчика в комплекте с компилятором C++, который мы используем. С рекурсивным спуском, прохождение разбора использует аппаратный стек через механизмы вызова функций C++. Нет никаких сложно отладочных таблиц или государственных машин, которые заслоняют логический поток анализа. След стека, который мы видим в отладчике, точно следует иерархической структуре грамматики. Поскольку любое производственное правило может инициировать прохождение разбора, гораздо легче определить ошибки, сосредоточившись на одном или нескольких правилах. Для относительно сложных задач разбора, так же, как мы пишем надежные программы на C++, рекомендуется разрабатывать грамматику итеративно на основе каждого модуля, где каждый модуль является небольшим подмножеством полной грамматики. Таким образом, мы можем тестировать отдельные модули по частям, пока не достигнем самого верхнего модуля. Например, при разработке языка сценариев мы можем начать с выражений, затем перейти к утверждениям, затем функциям, вверх, пока у нас не будет полной грамматики. В какой-то момент, когда грамматика становится довольно сложной, желательно визуализировать прохождение разбора и посмотреть, что происходит. Есть некоторые средства в рамках, которые помогают в визуализации пересечения разреза с целью отладки. Следующие макросы позволяют эти функции. Debugging MacrosBOOST_SPIRIT_ASSERT_EXCEPTIONДух содержит утверждения, которые могут активироваться, когда дух используется неправильно. По умолчанию эти утверждения используют макрос утверждения из стандартной библиотеки. Если вы хотите, чтобы дух бросил исключение, определитеBOOST_SPIRIT_ASSERT_EXCEPTIONк названию класса, который вы хотите бросить. Конструктор этого класса будет переданconst char*строгая версия файла, строка и условие утверждения, когда он брошен. Если вы хотите полностью отключить утверждение,#define NDEBUG. BOOST_SPIRIT_DEBUGОпределите это, чтобы обеспечить отладку. При включенной отладке в ключевых точках процесса разбора генерируется специальный выход с использованием стандартного оператора выводаоператора.<<сBoost_SPIRIT_DEBUG_OUT(по умолчаниюstd::cout, см. ниже) как его левый операнд.
По умолчанию, если определен макросBOOST_SPIRIT_DEBUG, генерируется весь доступный выход отладки. Чтобы точно настроить количество сгенерированного текста, вы можете определитьBOOST_SPIRIT_DEBUG_FLAGSпостоянная равна комбинации следующих флагов:
BOOST_SPIRIT_DEBUG_OUTОпределите это, чтобы перенаправить распечатку диагностики отладки в другое место (например, файл или поток).[править править код] BOOST_SPIRIT_DEBUG_TOKEN_PRINTERBOOST_SPIRIT_DEBUG_TOKEN_PRINTERМакро позволяет переопределить способ печати символов в потоке. ЕслиBOOST_SPIRIT_DEBUG_OUTимеет типStreamT, тип символаCharTиBOOST_SPIRIT_DEBUG_TOKEN_PRINTERопределяется какfoo, он должен быть совместим с этим использованием:
По умолчанию принтер требует определения оператора[StreamT, CharT]. Дополнительно, еслиCharTконвертируется в обычный тип символовchar,wchar_tилиint, он печатает управляющие символы в дружественной манере (например, когда он получает'n', он фактически печатает\иn, вместо новой строки). BOOST_SPIRIT_DEBUG_PRINT_SOMEBOOST_SPIRIT_DEBUG_PRINT_SOMEконстанта определяет количество символов из потока, который должен быть напечатан для диагностики. Это соответствует первым 20 символам. BOOST_SPIRIT_DEBUG_TRACENODEПо умолчанию все узлы парсера отслеживаются. Эта константа может быть использована для переопределения этого по умолчанию. Если это1истинно, то трассировка включена по умолчанию, если эта постоянная0ложно, трассировка отключена по умолчанию. Эта константа препроцессора устанавливается на1истиннопо умолчанию. Обратите внимание, что следующиеBOOST_SPIRIT_DEBUG_...Макросы должны использоваться только в области функций. BOOST_SPIRIT_DEBUG_NODE(p)Определите это, чтобы напечатать некоторые отладочные диагностики для парсера. Этот макро
Предварительная подготовка: Перед вводом правила печатается название правила, за которым следует заглянуть в данные в текущем положении итератора. Пост-парс: После разбора правила печатается имя правила, за которым следует заглянуть в данные в текущем положении итератора. Здесь'/'перед именем правила знаменует успешный матч, а'#'перед именем правила знаменует неудачный матч. Ниже приведены синонимыBOOST_SPIRIT_DEBUG_NODE
BOOST_SPIRIT_DEBUG_TRACE_NODE(p, flag)BOOST_SPIRIT_DEBUG_NODE. Кроме того, позволяет проводить выборочную отладку. Это полезно в ситуациях, когда мы хотим отлаживать только ручной набор узлов. Ниже приведены синонимыBOOST_SPIRIT_DEBUG_TRACE_NODE
BOOST_SPIRIT_DEBUG_TRACE_NODE_NAME(p, name, flag)BOOST_SPIRIT_DEBUG_NODE. Дополнительно допускается выборочная отладка и позволяет указать имя, используемое при отладке распечатки. Это полезно в ситуациях, когда мы хотим отладить только ручной набор узлов. Имяможет быть переопределено в ситуациях, когда параметр парсера не отражает имя парсера для отладки. Ниже приведены синонимыBOOST_SPIRIT_DEBUG_TRACE_NODE
Вот оригинальный калькулятор с включенными функциями отладки:
Мы напечатали в "1 + 2". Обратите внимание, что есть две успешные ветви от верхнего правилаexpr. Красный текст генерируется семантическими действиями парсера, в то время как остальные генерируются отладкой-диагностикой наших правил. Обратите внимание, как первоецелое числоправило взяло "1", первыйтерминправило взяло "+", и, наконец, второецелое числоправило взяло "2". Обратите внимание на особое значение первых символов, появляющихся на печатных линиях:
Проверьтеcalc_debug.cpp, чтобы увидеть отладку в действии.
Copyright © 1998-2003 Joel de Guzman
Статья Debugging раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
||||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |