Docs #3
@@ -1,2 +0,0 @@
|
|||||||
# Интерфейс компилятора
|
|
||||||
|
|
||||||
@@ -1,2 +1,40 @@
|
|||||||
# Операторы
|
# Операторы
|
||||||
|
|
||||||
|
FZLang поддерживает арифметические, логические и унарные операции.
|
||||||
|
Во время работы бинарные операции достают со стека два значения, и обратно кладут результат на стек.
|
||||||
|
Унарные операции достают одно значение со стека, а затем кладут результат обратно на стек.
|
||||||
|
|
||||||
|
## Арифметические операции
|
||||||
|
|
||||||
|
| Операция | Допустимые типы | Описание |
|
||||||
|
| -------- | --------------- | -------- |
|
||||||
|
| `N + N` | *все числовые* | Сложение двух операндов |
|
||||||
|
| `N - N` | *все числовые* | Вычитание правого операнда из левого |
|
||||||
|
| `N * N` | *все числовые* | Переменожение двух операндов |
|
||||||
|
| `N / N` | *все числовые* | Деление левого операнда на правый |
|
||||||
|
| `N % N` | *все числовые* | Получение остатка от деления левого операнда на правый |
|
||||||
|
| `N ^ N` | *все числовые* | Возведение левого операнда в степень правого |
|
||||||
|
| `-N` | *все числовые* | Инверсия операнда |
|
||||||
|
|
||||||
|
## Операции сравнения
|
||||||
|
|
||||||
|
| Операция | Допустимые типы | Описание |
|
||||||
|
| -------- | --------------- | -------- |
|
||||||
|
| `N == N` | *все числовые*, булевы, объекты, строки | Сравнить равенство операндов |
|
||||||
|
| `N != N` | *все числовые*, булевы, объекты, строки | Сравнить неравенство операндов |
|
||||||
|
| `N > N` | *все числовые* | Проверить, что левый операнд больше правого |
|
||||||
|
| `N >= N` | *все числовые* | Проверить, что левый операнд больше или равен правому |
|
||||||
|
| `N < N` | *все числовые* | Проверить, что левый операнд меньше правого |
|
||||||
|
| `N <= N` | *все числовые* | Проверить, что левый операнд меньше или равен правому |
|
||||||
|
| `!N` | булевы | Инвертировать операнд |
|
||||||
|
|
||||||
|
> Важно:
|
||||||
|
> В случае сравнения объектов (`==`, `!=`), сравниваются адреса, а не значения!
|
||||||
|
|
||||||
|
## Логические операции
|
||||||
|
|
||||||
|
| Операция | Допустимые типы | Описание |
|
||||||
|
| -------- | --------------- | -------- |
|
||||||
|
| `N && N` | булевы | Логическое **И** двух операндов |
|
||||||
|
| `N || N` | булевы | Логическое **ИЛИ** двух операндов |
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +1,54 @@
|
|||||||
# Система типов
|
# Система типов
|
||||||
|
|
||||||
|
FZLang имеет две основы для типов: примитивы и объекты.
|
||||||
|
|
||||||
|
Примитивами являются строки, числовые типы, булевы и скрытый тип - "объект".
|
||||||
|
Объектами на данный момент являются экземпляры классов, а также литерал `null`.
|
||||||
|
|
||||||
|
## Таблица типов
|
||||||
|
|
||||||
|
| Внутреннее имя | Синтаксическое имя | Описание |
|
||||||
|
| --------------- | ------------------ | -------- |
|
||||||
|
| FZL_TYPE_NULL | *отстутсвует* | *на данный момент не используется* |
|
||||||
|
| FZL_TYPE_OBJECT | *отстутсвует* | экземпляр класса или литерал `null` |
|
||||||
|
| FZL_TYPE_STRING | `str` | строка |
|
||||||
|
| FZL_TYPE_CHAR | `char` | *на данный момент не используется* |
|
||||||
|
| FZL_TYPE_BOOL | `bool` | булева |
|
||||||
|
| FZL_TYPE_INT8 | `i8` | 8-битное знаковое число |
|
||||||
|
| FZL_TYPE_UINT8 | `u8` | 8-битное беззнаковое число |
|
||||||
|
| FZL_TYPE_INT16 | `i16` | 16-битное знаковое число |
|
||||||
|
| FZL_TYPE_UINT16 | `u16` | 16-битное беззнаковое число |
|
||||||
|
| FZL_TYPE_INT32 | `i32` | 32-битное знаковое число |
|
||||||
|
| FZL_TYPE_UINT32 | `u32` | 32-битное беззнаковое число |
|
||||||
|
| FZL_TYPE_INT64 | `i64` | 64-битное знаковое число |
|
||||||
|
| FZL_TYPE_UINT64 | `u64` | 64-битное беззнаковое число |
|
||||||
|
| FZL_TYPE_INT | `int` | знаковое число размером с машинное слово |
|
||||||
|
| FZL_TYPE_UINT | `uint` | беззнаковое число размером с машинное слово |
|
||||||
|
|
||||||
|
|
||||||
|
## Совместимость
|
||||||
|
|
||||||
|
При проверке совместимости типов работают следующие правила:
|
||||||
|
|
||||||
|
1. Если оба типа - объекты (`FZL_TYPE_OBJECT`), то:
|
||||||
|
1. Если один из типов имеет имя класса `<nullptr>`, проверка **пройдена**;
|
||||||
|
2. Если оба типа имеют одинаковое имя класса, проверка **пройдена**;
|
||||||
|
3. В ином случае проверка **не пройдена**.
|
||||||
|
2. Если типы равны, проверка **пройдена**;
|
||||||
|
3. Если оба типа - числовые (`u8`..`uint`, `i8`..`int`), проверка **пройдена**;
|
||||||
|
4. Если ни одно правило из вышеперечисленных не сработало, то проверка **не пройдена**.
|
||||||
|
|
||||||
|
**пройдена** = типы совместимы, **не пройдена** - не совместимы.
|
||||||
|
|
||||||
|
## Работа в рантайме
|
||||||
|
|
||||||
|
Для примитивов (т.е., не `FZL_TYPE_OBJECT`), значения используются прямо.
|
||||||
|
Это значит, что они все операции, работающие со значениями используют для работы то значение, что лежит в контейнере на стеке.
|
||||||
|
|
||||||
|
Объектные типы хранятся на стеке как **ссылки на объект**.
|
||||||
|
Для них валидные такие операции, как:
|
||||||
|
|
||||||
|
- `FZL_OPCODE_ESCAPE_OBJECT` (эвакуация объекта в родительское окружение)
|
||||||
|
- `FZL_OPCODE_GET_FIELD N` (чтение поля с индексом `N` из объекта)
|
||||||
|
- `FZL_OPCODE_SET_FIELD N` (запись значения в поле объекта с индексом `N`)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user