Діагностика · Terra v0.1
⚠ Коди помилок
Живі приклади з тестового пакету. Кожен код — реальна ситуація що перевіряється компілятором.
Compile-time is always better than runtime.
Рівні діагностики
#levels
FATAL
Компіляція зупиняється негайно. Неможливо продовжити.
ERROR
Компіляція зупиняється. Бінарник не генерується.
WARNING
Компіляція продовжується. Бінарник генерується.
E1xx — Синтаксичні помилки
E100
▼
UNEXPECTED_TOKEN — Неочікуваний токен
Парсер зустрів токен якого не очікував у цьому місці
test_07d_no_name.terra
app (/intbyte, /var) = 14 ! відсутнє ім'я
E100 · Очікувалось ім'я змінної, отримано ASSIGN
test_07f_no_app.terra
(/intbyte, /var) CaseF = 12 ! відсутнє app
E100 · Неочікуваний токен: LPAREN
E102
▼
UNCLOSED_PAREN — Незакрита дужка
Очікувалась ) для закриття тегів або виразу
приклад
app (/intbyte, /var x = 12 ! немає )
E102 · Очікувалась ')' для закриття тегів
E104
▼
INVALID_SYNTAX — Синтаксична помилка [FATAL]
Структурно невалідна конструкція — компіляція зупиняється
test_02_outside_start.terra
app (/intbyte, /var) x = 12 x + (5) ! поза ::start::
[FATAL] E104 · Операція поза блоком ::start::
test_04_name_forbidden.terra
app (/intbyte, /var) x = 12 ::start:: /display(x(.name.)) ! .name. тільки для /shelf
[FATAL] E104 · '.name.' заборонено для 'x' — змінні не мають імен в runtime
.name.' доступно тільки для /shelf змінних.
🎨 Стилі /display
style_unknown_test.terra
/display(val(UNKNOWN_STYLE))
E104 · Стиль 'UNKNOWN_STYLE' не оголошений
style_duplicate / end_mismatch
/display::MY_STYLE ... end MY_STYLE /display::MY_STYLE ! E104: вже оголошений /display::STYLE_A ... end STYLE_B ! E104: end не збігається
RGB / size / flags
/background(276, 132, 476) ! E104: RGB > 255 /background(-132, 0, 0) ! E104: від'ємне /background(23, 67) ! E104: потрібно 3 компоненти /size(256) /size(-12) ! E104: 0..255 /normal, /italic ! E104: конфлікт
E104 · Значення RGB / розмір шрифту / флаги — помилки валідації
Детальна документація стилів і /replace:
→ styles.html
E107
▼
INVALID_TAG_ORDER — Неправильний порядок тегів
Модифікатор /var або /const стоїть перед типом
test_07b_wrong_order.terra
app (/var, /intbyte) x = 12
E107 · Модифікатор '/var' перед типом
Правило: спочатку тип, потім модифікатор: (/intbyte, /var)
E2xx — Помилки змінних
E200
▼
UNDEFINED_VARIABLE — Змінна не оголошена
Використання змінної до її оголошення через app
приклад
::start:: /display(ghost) ! 'ghost' не оголошено
E200 · Змінна 'ghost' не оголошена
E201
▼
DUPLICATE_VARIABLE — Змінна вже оголошена
Повторне оголошення з тим самим ім'ям (регістронечутливо)
приклад
app (/intbyte, /var) x = 10 app (/intbyte, /var) X = 20 ! x == X (регістронечутливо)
E201 · Змінна 'x' вже оголошена
E202
▼
RESERVED_WORD — Зарезервоване слово
Спроба використати ключове слово як ім'я змінної
test_07g_reserved_name.terra
app (/intbyte, /var) APP = 14
E202 · 'APP' — зарезервоване слово
E203
▼
CONST_WITHOUT_VALUE — Константа без значення
/const вимагає = значення при оголошенні
test_07e_no_value.terra
app (/intbyte, /const) CaseE ! немає = значення
E203 · Константа 'CaseE' повинна мати значення
Додайте = значення або змініть /const на /var
E204
▼
MODIFY_CONST — Спроба змінити константу
/const не може бути змінена після оголошення
err_E204_modify_const.terra
app (/intbyte, /const) limit = 100 ::start:: limit + (5) ! спроба змінити /const
E204 · Неможливо виконати модифікацію константи 'limit'
Для змінюваних значень використовуйте /var замість /const
E4xx — Помилки значень
E406
▼
VALUE_OUT_OF_RANGE — Значення виходить за межі типу
Парсер пропонує мінімальний тип що вміщує значення
err_E406_value_overflow.terra
app (/intbyte, /var) x = 300 ! /intbyte max = 255
E406 · Значення 300 виходить за межі /intbyte (0..255)
💡 Підказка: використайте /int2 (0..65535)
err_E406_negative_suggestion.terra
app (/intbyte, /var) x = -85231 ! від'ємне в беззнаковому
E406 · Значення -85231 виходить за межі /intbyte (0..255)
💡 Підказка: використайте /int4- (знаковий 32-біт)
E6xx — Помилки операцій
E600
▼
DIVISION_BY_NONE — Ділення на .None. змінну [FATAL]
.None. блокує ділення назавжди, навіть після присвоєння нового значення
err_E600_division_by_none.terra
app (/intbyte, /var) x = 84 app (/intbyte, /var) divisor = .None. ::start:: x / (divisor) ! divisor = .None. → заборонено
[FATAL] E600 · Ділення на неініціалізовану змінну 'divisor'
err_E600_none_after_assign.terra
app (/intbyte, /var) divisor = .None. ::start:: divisor (18) ! присвоєння — ОК x / (divisor) ! але .None. назавжди → E600
[FATAL] E600 · Ділення на неініціалізовану змінну 'divisor'
.None. — постійна властивість оголошення. Для дільника використовуйте:
divisor = 1
W1xx — Попередження
#warnings
W100
▼
UNUSED_VARIABLE — Змінна не використовується
Компіляція продовжується
test_02_outside_start.terra
app (/intbyte, /var) x = 12 ! x оголошено, але ніде не використовується
W100 · Змінна 'x' оголошена, але не використовується
W106
▼
DEFAULT_MODIFIER — Відсутній модифікатор → /var
Компіляція продовжується з /var за замовчуванням
test_07a_no_modifier.terra
app (/intbyte) CaseA = 12 ::start:: /display(CaseA)
W106 · Змінна 'CaseA' не має модифікатора — буде використано /var
output: 12
W107
▼
DEFAULT_NONE_VALUE — Ініціалізація як .None.
Участь у діленні заборонена назавжди → E600
приклад
app (/intbyte, /var) x ! немає = значення
W107 · Змінна 'x' буде ініціалізована як .None.