![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Error HandlingBoost , ,
Механизм обработки исключений C++ идеально подходит для обработки ошибок в рамках. Представьте себе полный парсер как лабиринт. На каждой ветви вход диктует, куда мы повернем. При неправильном подходе мы можем зайти в тупик. Если мы когда-нибудь достигнем его, это будет пустой тратой времени, чтобы вернуться туда, откуда мы пришли. Вместо этого мы поставляем охрану в стратегические точки. Помимо определенного пункта, мы помещаем парсерные утверждения в места, куда не разрешается идти. Утверждения подобны пружинам, которые катапультируют нас обратно к охраннику. Если мы когда-нибудь достигнем кирпичной стены с определенным шаблоном входа, все быстро расслабится, и нас бросят обратно на стражу. Это может быть очень эффективной оптимизацией при разумном использовании. Вернувшись в караул, у нас есть шанс исправить ситуацию, если это возможно. Следующая иллюстрация описывает сценарий.
Parser ErrorsОшибкаКласс является общим классом исключения парсера, используемым Духом. Это базовый класс для всех парсерных исключений.
Исключением является положение итератора, где ошибка была обнаружена в его, гдепеременная члена. В дополнение к итераторуparser_errorтакже содержит информацию об ошибке (описатель ошибок) в своей переменнойописатель. Семантические действия могут свободно отбрасывать парсерные исключения, когда это необходимо. Функция полезностиthrow_может быть вызвана. Эта функция создает и выбрасываетparser_errorзаданный итератор и дескриптор ошибок:
Parser AssertionsУтверждения могут быть размещены в местах, где у нас нет другого выбора, кроме как ожидать успеха анализа. Если парсинг не удается, то выбрасывается определенный вид исключения. Прежде чем объявлять грамматику, мы объявляем некоторые объекты утверждения.утверждениеявляется классом шаблонов, параметризованным по типу ошибки, которая будет брошена, как только утверждение не сработает. Следующие утверждения параметризируются перечислением ошибок, определенным пользователем. Examples
В приведенном выше примере для хранения информации об ошибке используются перечисления, мы можем свободно использовать другие типы, такие как целые числа и строки. Например,утверждение
Преддекларированный объект утвержденияexpect_endможет теперь использоваться в грамматике в качестве оберток вокруг парсеров. Например:
Это приведет к исключению, если он не увидит "end" из ввода. The GuardОхранаиспользуется для улавливания определенного типаparser_error. Продолжим наш предыдущий пример:
Ошибки, в этом примере тип дескриптора ошибок, который мы хотим обнаружить. Это тот же список, что и выше.my_guardтеперь можно использовать в грамматическом заявлении:
гдеp— выражение, оценивающее парсер. Где-то внутрирпарсер может бросить парсерное исключение.error_handler- обработчик ошибок, который может быть функцией или функтором, совместимым с интерфейсом:
Когда сканирование указывает на состояние сканера до разбора и ошибки, возникает ошибка. Обработчику разрешается перемещать положение сканера по своему усмотрению, возможно, в попытке выполнить коррекцию ошибок. Затем обработчик должен вернуть объектerror_status
error_status<T>
ГдеT- тип атрибута, совместимый с атрибутом соответствияfallback_parser's Subject (по умолчаниюnil_t). Классerror_statusсообщает о результате обработчика ошибок. Этот результат может быть одним из:
Copyright © 1998-2003 Joel de Guzman
Статья Error Handling раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
||||||||||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |