Рівні діагностики #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.