Files
tverd-plus-tokenizer/docs/grammar.md

263 lines
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Грамматика языка Ъ+ (EBNF)
Формальное описание грамматики языка «Ъ+» в форме Бэкуса — Наура (EBNF).
## Основные принципы
- **Кириллица обязательна** для ключевых конструкций (блоков)
- **Латинский алфавит опционален**, используется только для имен переменных
- **Конвейерный стиль** (`|>`) — основной способ передачи данных
- **Префиксация сущностей** (`@`, `:`, `?`) для однозначного разбора
- **Разделение мутации и вычисления** — разные операторы для сдвигов и записи в буфер
## Базовые символы
```ebnf
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
hex_digit = digit | "a" | "b" | "c" | "d" | "e" | "f" | "A" | "B" | "C" | "D" | "E" | "F";
binary_digit = "0" | "1";
cyrillic_letter = "а".."я" | "А".."Я" | "ё" | "Ё";
latin_letter = "a".."z" | "A".."Z";
letter = cyrillic_letter | latin_letter;
```
## 1. Структура программы
```ebnf
program = { item };
item = function_definition | constant_definition | type_definition;
type_definition = "!:ТИП", identifier_body, "=", ...
constant_definition = "!:КОНСТ", identifier_body, "=", ...
```
## 2. Идентификаторы
```ebnf
variable_identifier = "@", identifier_body;
label_identifier = ":", identifier_body;
predicate_identifier = "?", identifier_body;
identifier_body = letter, {letter | digit | "_"};
```
## 3. Литералы
### 3.1. Числовые литералы
```ebnf
integer_literal = (decimal_literal | hex_literal | binary_literal), [type_suffix];
decimal_literal = digit, [{digit | "_"}, digit];
hex_literal = "0x", hex_digit, [{hex_digit | "_"}, hex_digit];
binary_literal = "0b", binary_digit, [{binary_digit | "_"}, binary_digit];
type_suffix = "_", type_suffix_raw;
type_suffix_raw =
"б8" | "ц8" |
"б16" | "ц16" |
"б32" | "ц32" |
"б64" | "ц64" |
"бр" | "цр" |
"в32" | "в64";
float_literal = (decimal_literal, ".", [decimal_literal] | ".", decimal_literal), [type_suffix];
```
### 3.2. Строки и коллекции
```ebnf
string_literal = '"', {string_char | escape_sequence}, '"';
string_char = ? любой символ Unicode, кроме '"' и '\' ?;
escape_sequence = "\", ("n" | "t" | "r" | "\\" | '"' | "0", hex_digit, hex_digit | "u{", hex_digit, {hex_digit}, "}");
array_literal = array_fixed | array_list;
array_fixed = "[", expression, ";", expression, "]";
array_list = "[", [expression, {",", expression}, [","]], "]";
tuple_literal = "(", [expression, {",", expression}, [","]], ")";
```
## 4. Операторы
### 4.1. Арифметические и логические
```ebnf
arithmetic_operator = "+" | "-" | "*" | "/" | "%";
logical_operator = "&&" | "||" | "!";
comparison_operator = "==" | "!=" | "<" | ">" | "<=" | ">=";
```
### 4.2. Битовые операторы
```ebnf
bitwise_operator = "&" | "|" | "^" | "~" | "<<<" | ">>>";
```
### 4.3. Специальные операторы
```ebnf
special_operator = "|>" | "<<" | "=";
```
## 5. Управляющие конструкции
### 5.1. Блоки и инструкции
```ebnf
block_start = "Ъ+";
block_end = "Ъ-";
block = block_start, {statement}, block_end;
statement =
binding_statement
| mutation_statement
| (expression, [";"]);
binding_statement = variable_identifier, "=", expression, ";";
mutation_statement = variable_identifier, "<<", expression, ";";
```
### 5.2. Условие (Предикативное ветвление)
```ebnf
conditional_expr = "?", expression, ( block_branch | arrow_branch );
block_branch = block, [":", block];
arrow_branch = "->", expression, [":", expression];
```
### 5.3. Цикл (Итеративный предикат)
```ebnf
loop_expr = "?*", expression, block;
```
### 5.4. Сопоставление с образцом
```ebnf
match_expr = "?", variable_identifier, "{", match_arm, {match_arm}, "}";
match_arm = "|", pattern, "->", (expression | block), [","];
pattern = literal | variable_identifier | "_" ;
```
## 6. Функции и Типы
### 6.1. Определение функции и Типов
```ebnf
function_definition = ":", identifier_body, [parameter_list], ["->", type_descriptor], block;
parameter_list = variable_identifier, {",", variable_identifier};
type_descriptor = type_suffix_raw | "@пусто" | array_type | tuple_type | function_type | variable_identifier;
array_type = "[", type_descriptor, ";", expression, "]";
tuple_type = "(", [type_descriptor, {",", type_descriptor}], ")";
function_type = ":", "(", [type_descriptor, {",", type_descriptor}], ")", ["->", type_descriptor];
```
### 6.2. Вызовы
```ebnf
function_call = label_identifier, "(", [argument_list], ")";
argument_list = expression, {",", expression};
```
### 6.3. Лямбды
```ebnf
lambda = "@", "(", [parameter_list], "->", (expression | block), ")";
```
## 7. Выражения и Приоритеты
```ebnf
expression = mutation_expr;
(* 13: Мутация *)
mutation_expr = binding_expr, [ "<<", mutation_expr ];
(* 12: Связывание *)
binding_expr = pipeline_expr, [ "=", binding_expr ];
(* 11: Конвейер *)
pipeline_expr = logical_or_expr, { "|>", (function_call | lambda | label_identifier) };
(* 10: Логическое ИЛИ *)
logical_or_expr = logical_and_expr, { "||", logical_and_expr };
(* 9: Логическое И *)
logical_and_expr = comparison_expr, { "&&", comparison_expr };
(* 8: Сравнение *)
comparison_expr = bitwise_or_expr, [ comparison_operator, bitwise_or_expr ];
(* 7: Битовое ИЛИ *)
bitwise_or_expr = bitwise_xor_expr, { "|", bitwise_xor_expr };
(* 6: Битовое XOR *)
bitwise_xor_expr = bitwise_and_expr, { "^", bitwise_and_expr };
(* 5: Битовое И *)
bitwise_and_expr = shift_expr, { "&", shift_expr };
(* 4: Сдвиги *)
shift_expr = additive_expr, { ("<<<" | ">>>"), additive_expr };
(* 3: Сложение / Вычитание *)
additive_expr = multiplicative_expr, { ("+" | "-"), multiplicative_expr };
(* 2: Умножение / Деление / Остаток (Уровень power_expr удален) *)
multiplicative_expr = unary_expr, { ("*" | "/" | "%"), unary_expr };
(* 1: Унарные операторы и Постфиксные выражения *)
unary_expr = ("-" | "!" | "~"), unary_expr | postfix_expr;
(* 0: Постфиксные (Индексация, Доступ к полям) и Первичные *)
postfix_expr = primary_expr, { index_access | member_access };
index_access = "[", expression, "]";
member_access = ".", identifier_body;
primary_expr =
literal
| variable_identifier
| function_call
| lambda
| parenthesized_expr
| block
| conditional_expr
| match_expr
| loop_expr;
parenthesized_expr = "(", expression, ")";
literal = integer_literal | float_literal | string_literal | array_literal | tuple_literal;
```
## 8. Комментарии
```ebnf
comment = "<[", {comment_content | comment}, "]>";
comment_content = ? любой символ, кроме последовательности "]>" и начала вложенного "<[" ?;
```
## 9. Пример кода (Валидация по грамматике)
```rust
<[ Пример функции вычисления CRC ]>
:ВычислитьРЦ @данные, @длина -> @црц Ъ+
@црц = 0xFFFFFFFF_бр;
@и = 0_бр;
?* (@и < @длина) Ъ+
@байт = @данные[@и];
@црц = @црц ^ @байт;
@к = 0_б8;
?* (@к < 8_б8) Ъ+
? (@црц & 1_бр) -> (@црц >>> 1) ^ 0xEDB88320_бр : (@црц >>> 1);
@к << @к + 1_б8;
Ъ-
@и << @и + 1_бр;
Ъ-
@црц = ~@црц;
Ъ-
```
## Примечания
- **Кодировка**: UTF-8 (ISO/IEC 10646)
- **Отслеживание позиций**: Каждый токен имеет координаты (строка, столбец) для сквозного аудита
- **Детерминизм**: Язык предназначен для создания детерминированного системного ПО
- **Безопасность**: Минимизация вектора атак, использование no_std окружения
- **Аппаратная поддержка**: Оптимизация для архитектур «Эльбрус» (предикатное исполнение) и x86