Реализация прерываний и обработки ошибок
Чтобы не усложнять обработку ошибок и не разделять их на внутренние и внешние, реализовано всего два класса для сообщения об ошибоках, накопительные и непосредственные + возврат значений.
Накопительные ошибки и их реализация
Накопительные ошибки используются при обработке исходного текста программы при его парсинге, анализа или компиляции. Накопительнность данных ошибок заключается в том, что процесс обработки исходного текста прерывается не сразу после возникновения первой ошибки, а только после превышения определнного лимита (по умолчанию –nlc-error-limit=10).
Для логирования места возникновения ошибки используется макрос LOG_ERROR и при необходиости инкремент количества ошибок, или без оного (LOG_WARNING, LOG_INFO, LOG_DEBUG, LOG_DUMP) и обязательной пометкой термина TermPtr как причины её возникновения.
После превышения лимита накопительных ошибок или при их наличии и завершении исходного текста программы, генерируется обычное исключение std::exception с описанием причины (последней ошибки).
Непосредственные ошибки и их реализация
Непосредственные ошибки применяются при выполнении (интерпретции) тела программы и предназнчены для информирования пользователя о возникновении ошибки прерывания работы программы. Так как контекст (текущий термин или строка в исходном файла) как правило не доступны, то сразу генерируется обычное исключение std::exception с описанием причины возникновения, а идентификация места её возникновения с конкретным исходным местом в тексте программы возлагается на обработчик прерываний.
Возврат знечений
Для обработки перываний потока выполения, используются отдельные С++ классы, которые не являются наследниками std::exception, чтобы специально разделить код обработки возврата значений от обработки ошибок, а при выполнении (генерации кода) именованные прерывания могут быть реализованы вообще без использования исключений (return, break, continue или goto)!
:IntAny --+-> :IntPlus
(ObjPtr) |
|
+-> :IntMinus