commit 7b0d9ab09db5f0d81ba5e220dd6d93b4f8d8ef8c Author: MeexReay Date: Fri Jul 26 23:08:28 2024 +0300 init commit diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..9170141 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "sustlang" +version = "0.1.0" +edition = "2021" +readme = "README.md" + +[dependencies] diff --git a/README.md b/README.md new file mode 100644 index 0000000..83507e0 --- /dev/null +++ b/README.md @@ -0,0 +1,89 @@ +# Sust + +язык саст LOL + +код хеллоу ворлда: + +``` +INIT_VAR string text +SET_VAR text Hello World! +WRITE text cout +DROP_VAR text +``` + + +минимальный код для хеллоу ворлда: + +``` +TEMP_VAR string text Hello World! +WRITE text cout +``` + +## Команды + +| Команда | Параметры | Описание | +|--------------------------|------------|-------------| +| `INIT_VAR` | `type_var`, `name_var` | Инициализировать переменную `name_var` с типом `type_var` | +| `SET_VAR` | `name_var`, `value_var` | Установить значение переменной в `name_var` | +| `TEMP_VAR` | `type_var`, `name_var`, `value_var` | Переменная `name_var` инициализируется с типом `type_var` и присваивается `value_var`, переменная дропается после первого же использования | +| `MOVE_VAR` | `source_var`, `target_var` | Переместить значение переменной с `source_var` в `target_var` | +| `COPY_VAR` | `source_var`, `target_var` | Скопировать значение переменной с `source_var` в `target_var` | +| `TO_STR_VAR` | `source_var`, `target_var` | Скопировать значение переменной с `source_var` в `target_var`, переводя в строку | +| `DROP_VAR` | `name_var` | Дропнуть переменную `name_var` | +| `HAS_VAR` | `name_var`, `result_var` | В переменную `result_var` записывается `bool` существует ли переменная `name_var` | +| `ADD_INT` | `int_var1`, `int_var2` | Прибавить к числу `int_var1` значение `int_var2` | +| `ADD_FLOAT` | `float_var1`, `float_var2` | Прибавить к числу `float_var1` значение `float_var2` | +| `ADD_STR` | `str_var`, `value_var` | Прибавить к строке `str_var` значение `value_var` (может быть типа `string/char/list[char]`) | +| `SUB_STR` | `str_var`, `start_index`, `end_index` | Сделать подстроку из строки `str_var` и сохранить туда же | +| `SUB_LIST` | `list_var`, `start_index`, `end_index` | Сделать подсписок из списка `list_var` и сохранить туда же | +| `LIST_SIZE` | `list_var`, `result_var` | Получить размер списка и записать в переменную `result_var` типа `int` | +| `WRITE` | `name_var`, `stream_var` | Вывести переменную `name_var` в `stream_var` | +| `READ` | `name_var`, `size_var`, `stream_var` | Прочитать с `stream_var` ровно `size_var` байтов в переменную `name_var` типа `list[char]` | +| `READ_ALL` | `name_var`, `stream_var` | Прочитать с `stream_var` все имеющиеся байты в переменную `name_var` типа `list[char]` | +| `READ_STR` | `name_var`, `size_var`, `stream_var` | Прочитать с `stream_var` ровно `size_var` байтов в переменную `name_var` типа `string` | +| `READ_STR_ALL` | `name_var`, `stream_var` | Прочитать с `stream_var` все имеющиеся байты в переменную `name_var` типа `string` | +| `FOR` | `func`, `start_index`, `end_index` | Функция `func` (с единственным аргументом с типом `int`) вызывается с `start_index` до `end_index` включительно, `start_index` и `end_index` это названия переменных | +| `FOR_MAP` | `func`, `map_var` | Функция `func` (с двумя аргументами с типами мапы) вызывается для каждого `key`, `value` переменной `map_var` | +| `FOR_LIST` | `func`, `list_var` | Функция `func` (с единственным аргументом с типом списка) вызывается для каждого предмета переменной `list_var` | +| `WHILE` | `func` | Функция `func` (с результатом `bool`) вызывается, пока функция выдает `true` | +| `USE_FUNC` | `func`, `result_var`, `[arg_var1] ... [arg_varN]` | Функция `func` вызывается с переданными аргументами и устанавливает результат в переменную `result_var` | +| `OPEN_FILE_IN` | `path_var`, `stream_var` | Открыть файл по пути `path_var` (`path_var`, `stream_var` - переменные) для чтения и записать стрим для чтения в переменную `stream_var` | +| `OPEN_FILE_OUT` | `path_var`, `stream_var` | Открыть файл по пути `path_var` (`path_var`, `stream_var` - переменные) для записи и записать стрим для записи в переменную `stream_var` | +| `OPEN_TCP_CONNECTION` | `addr_var`, `port_var`, `in_stream`, `out_stream` | Подключиться по `addr_var:port_var` (`addr_var: string`, `port_var: int`, `in_stream: in_stream`, `out_stream: out_stream` - переменные) и записать стримы для чтения и записи в `in_stream` и `out_stream` | +| `OPEN_TCP_LISTENER` | `addr_var`, `port_var`, `accept_func` | Ожидание подключений с `addr_var:port_var` (`addr_var: string`, `port_var: int` - переменные), при подключениях вызывается функция `accept_func` с четырьмя аргументами `in_stream: in_stream` и `out_stream: out_stream` и `addr_var: string` и `port_var: int` | +| `HAS_OPTIONAL` | `optional_var`, `result_var` | Узнать, имеет ли данные опшнл `optional_var` и записать результат в `result_var: bool` | +| `WHEN_OPTIONAL` | `optional_var`, `func` | Когда опшнл `optional_var` имеет данные, вызывается `func` с единственным аргументом типа опшнла | + +## Типы переменных + +| Type | Example Command | Example Value | +|------------------------|------------------------------------|--------------------------| +| `bool` | `SET_VAR var true` | `true` / `false` | +| `string` | `SET_VAR var some_text` | `some_text` | +| `integer` | `SET_VAR var 123` | `123` | +| `float` | `SET_VAR var 14.48` | `14.48` | +| `char` | `SET_VAR var 255` | `0 - 255` | +| `list[type]` | `SET_VAR var.0 value` | `value` | +| `map[key_type value_type]` | `SET_VAR var.key value` | `value` | +| `optional[type]` | `SET_VAR var (value)` | `(value)` / `null` | +| `in_stream` | `OPEN_FILE_IN path var` | | +| `out_stream` | `OPEN_FILE_OUT path var` | | + +## Стандартные переменные + +| Переменная | Описание | Тип | +|------------|--------------------------------------|-------------| +| `args` | Аргументы при вызове программы | `list[string]` | +| `cout` | Вывод консоли | `out_stream` | +| `cin` | Ввод консоли | `in_stream` | + +## Создание функций + +example code: + +``` +FUNC result_type func_name arg_name type arg_name2 type # Создание функции +SET_VAR result value # Установить результат функции (value изменить, это просто пример) +RETURN # Для досрочного выхода из функции (тут это не надо, функция и так закончится, это просто пример) +FUNC_END +``` diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +}