Axiom Справочник языка

Справочное приложение

Диагностика

Раздел диагностики объясняет сообщения о проблемах в исходной программе и во время выполнения. Каждое сообщение содержит код, описание и доступные сведения о месте ошибки.

Когда возникает сообщение

Сначала проверяется исходный текст: допустимые символы, запись литералов и структура конструкций. Затем проверяются имена, типы и контекст использования. Ошибки этих этапов препятствуют запуску.

Во время исполнения могут возникнуть ошибки, которые зависят от данных: деление на ноль, выход индекса за границы, недопустимый ввод или отказ файловой операции. Их можно обрабатывать средствами TRY, когда ошибка относится к поддержанному договору языка.

Код и место ошибки

Код позволяет найти точное условие в справочнике. Диапазон исходного текста указывает место, которое нужно проверить. Одна ошибочная запись может вызвать несколько связанных сообщений; исправляйте исходную причину и выполняйте проверку снова.

Префиксы MB0xxx, MB1xxx, MB2xxx и MB3xxx относятся соответственно к чтению текста, разбору, смысловой проверке и выполнению. Служебные сообщения инфраструктуры не расширяют пользовательский синтаксис.

Коды диагностики

Ошибки чтения и разбора

КодКогда возникает
MB0001При чтении текста программы встречен символ, который не используется в языке Axiom.
MB0002Строковый литерал не закрыт кавычкой до конца строки; то же правило действует для интерполированной строки $"...".
MB0003Числовой литерал содержит недопустимый символ или имеет формат, который не соответствует ни одному поддерживаемому числовому типу.
MB0004Числовой литерал выходит за допустимый диапазон своего типа: не помещается в LONG или выходит за диапазон конечных значений DOUBLE.
MB1001В записи конструкции не хватает ожидаемого ключевого слова или знака.
MB1002На месте имени переменной, процедуры или функции ожидается идентификатор.
MB1003На месте выражения конструкция не содержит допустимого выражения.
MB1004Встречен токен, который не допускается в текущем месте конструкции.
MB1005В конструкции IF допускается только один блок ELSE.
MB1006В конструкции SELECT CASE допускается только один блок CASE ELSE.

Смысловые ошибки

КодКогда возникает
MB2001Используется имя, которое не объявлено или уже вышло из области видимости. Если имя — CALL, к тексту добавляется подсказка: в Axiom нет оператора CALL, процедура вызывается просто как Foo().
MB2002Имя переменной, константы, процедуры или функции объявлено повторно в одной области видимости.
MB2003Используется значение несовместимого типа. В том числе этот код появляется, когда переменной-массиву пытаются присвоить скаляр или когда скалярной переменной пытаются присвоить массив. Если имя одновременно обозначает переменную и функцию, к тексту добавляется подсказка про ссылку на функцию.
MB2004Функция вызвана с неверным числом аргументов.
MB2005Имя используется как вызываемое, но не объявлено ни как функция, ни как процедура.
MB2006В SUB используется RETURN со значением.
MB2007В FUNCTION используется RETURN без выражения.
MB2008В условии используется выражение, которое не имеет тип BOOLEAN.
MB2009Счётчик FOR имеет неподдерживаемый тип (например STRING), либо занявшее имя принадлежит переменной неподходящего типа. Счётчик FOR всегда локальный.
MB2010Выполняется присваивание константе.
MB2011Оператор ERASE или REDIM применён к имени, которое не является массивом.
MB2012RETURN используется вне SUB или FUNCTION.
MB2013EXIT FOR используется вне ближайшего цикла FOR ... NEXT.
MB2014EXIT DO используется вне цикла DO ... LOOP.
MB2015В конструкции SELECT CASE диапазон или значение CASE указано неверно.
MB2016Новое имя затеняет уже существующее имя во внешней области видимости или в заголовке FOR. Для счётчика FOR это означает: имя уже занято (DIM, CONST, параметр, внешний цикл), а счётчик FOR всегда локальный — удалите объявление или переименуйте.
MB2017Группа в DIM не содержит ни явного типа, ни инициализатора для вывода типа.
MB2018Константное числовое значение не помещается в явно указанный целевой числовой тип.
MB2019Процедура SUB используется как значение в выражении.
MB2020Значение используется как вызываемое, но его тип не является функциональным.
MB2021Тип после AS не объявлен.
MB2022Поле внутри TYPE имеет неподдерживаемую форму или пользовательские типы образуют цикл вложенности.
MB2023В пользовательском типе отсутствует поле, к которому обращается программа. Если поле похоже на одно из существующих, к тексту добавляется подсказка «Возможно, вы имели в виду поле …».
MB2024Доступ через точку применён к значению, которое не является пользовательским TYPE.
MB2025Оператор ERASE или REDIM применён к фиксированному массивному полю записи TYPE.
MB2026Объявление фиксированной строки STRING * N указано с недопустимой длиной или в неподдерживаемом контексте.
MB2027Поле пользовательского типа TYPE имеет значение по умолчанию, которое несовместимо с типом поля.
MB2028Аргумент, передаваемый параметру BYREF, не является простой переменной подходящего типа.
MB2029Функция с параметром BYREF используется как функциональное значение.
MB2031В литеральной форме создания записи TypeName(...) смешаны именованные и позиционные аргументы.
MB2032Позиционная форма TypeName(...) получила неверное число аргументов.
MB2033Вызов конструктора или перегруженного метода записи TYPE оказался неоднозначным.
MB2034Обработчик оператора ON KEY не является подходящей процедурой SUB.
MB2035Обработчик оператора ON MOUSE не является подходящей процедурой SUB.
MB2036В операторе ON MOUSE указано недопустимое имя события мыши.
MB2037CONTINUE FOR используется вне цикла FOR ... NEXT.
MB2038CONTINUE WHILE используется вне цикла WHILE ... END WHILE.
MB2039CONTINUE DO используется вне цикла DO ... LOOP.
MB2040Оператор-выражение не содержит вызова процедуры или функции и не имеет эффекта. Если требовался вызов, укажите скобки, например FLUSH(f).
MB2044Внутри метода TYPE используется голое имя поля. Поле доступно только через SELF: напишите SELF.ИмяПоля.
MB2045Предупреждение: имя используется и как переменная, и как процедура (SUB/FUNCTION). Это не ошибка — разные классы имён могут совпадать, — но компилятор советует проверить, не опечатка ли это.
MB2046Графическая операция находится в заведомо неподходящем режиме: графическая поверхность ещё не создана, выбран текстовый SCREEN 0 или оператору требуется CANVAS, а выбран SCREEN (либо наоборот). Компилятор учитывает порядок операторов, константные номера режимов, ветви и прямые вызовы процедур. Ошибка блокирует запуск.
MB2049Модуль IMPORT отсутствует в составе программы или не найден в папке точки входа. Проверьте имя модуля и наличие файла .axm. Отказ чтения найденной зависимости в CLI отличается от отсутствующего модуля и описан кодом MB4004.
MB2050Несколько исходных документов задают одинаковое имя модуля.
MB2051В явно переданном наборе модулей отсутствует точка входа.
MB2052Обнаружен цикл IMPORT, в том числе импорт файлом самого себя. Запрет действует и для модулей без исполняемых инструкций.
MB2053Другой модуль обращается к закрытому имени объявления. PRIVATE ограничивает имя, а не поля уже полученной записи.
MB2054Несколько импортов предоставляют одно и то же открытое имя.
MB2055Импортированное имя конфликтует с другим доступным объявлением. Правила IMPORT.
MB2048Имя после NEXT не совпадает со счётчиком закрываемого FOR. Имя можно опустить; если оно указано, оно должно совпадать без учёта регистра. Для вложенных циклов проверяется ближайший открытый FOR. Правила FOR … NEXT.
MB2047Переменная объявлена, но её значение нигде не читается. В Electron IDE сообщение отображается как совет с мягким выделением имени переменной, а не оператора DIM; в панели сообщений советы отделены от ошибок и предупреждений. Одно присваивание или ввод через INPUT не считается использованием результата. Проверьте имя переменной; используйте значение либо уберите ненужную переменную, сохранив необходимые действия её инициализатора. При правке устаревший совет сразу снимается и уточняется новым анализом. Совет не блокирует запуск; в модели диагностики компилятора сохраняется уровень предупреждения. Запускаемый пример.

Ошибки загрузки зависимостей

КодКогда возникает
MB4004CLI не смог прочитать зависимость точки входа из-за отказа файловой системы. Команды check и run завершаются с кодом 2. Команда check --json по-прежнему выдаёт JSON с диагностикой MB4004; сообщение о причине отказа также выводится в стандартный поток ошибок. Если модуль не найден, применяется MB2049.

Ошибки во время выполнения

КодКогда возникает
MB3001Во время вычисления произошло деление на ноль.
MB3002Выполнено обращение к элементу массива вне допустимых границ.
MB3003INPUT не смог преобразовать введённое значение или получил неверное число значений.
MB3004Цикл FOR запущен со значением STEP 0.
MB3005Во время выполнения потребовалось состояние, которое ещё не создано, например обращение к динамическому массиву до его выделения.
MB3006FUNCTION завершилась по выполненной ветви без возвращаемого значения.
MB3007Во встроенной функции или операции получено недопустимое фактическое значение, например аргумент вне допустимой области. Код также означает превышение предела строкового значения в 16 777 216 единиц UTF-16.
MB3008Во время выполнения произошло числовое переполнение или получен недопустимый неконечный результат.
MB3009Значение функционального типа не содержит функции и не может быть вызвано.
MB3010При выполнении графической операции не оказалось подходящего активного SCREEN или CANVAS. Эта защита нужна, когда режим зависит от данных и компилятор не может заранее установить состояние. Заведомо неподходящий режим обнаруживается раньше через MB2046.
MB3011Превышена максимальная глубина стека вызовов. Возможно, программа содержит бесконечную рекурсию.
MB3012Математическая операция не определена для указанных значений: оператор ^ нельзя применять к отрицательному основанию с нецелой степенью.
MB3013Не удалось выделить массив: превышен предел 67 108 864 элементов, произошло переполнение произведения длин измерений или не хватило памяти. Ошибку можно перехватить оператором TRY. Подробности приведены в разделе ошибок массивов.
MB3014Программа читает или изменяет устаревшее представление массива после изменения формы корневого массива, например операторами REDIM или ERASE. Создайте представление заново. Ошибку можно перехватить оператором TRY. Подробности приведены в разделе ошибок массивов.

Если ошибка возникла внутри локальной процедуры или функции, в тексте диагностики появится блок Цепочка вызовов с перечнем активных вызовов, их местами вызова и внешней процедурой или функцией, где объявлена локальная.

Запускаемые примеры

Откройте нужный файл в IDE и запустите его. Примеры с ошибкой предназначены для проверки сообщения компилятора или выполнения.

См. также