8.7 KiB
8.7 KiB
Грамматика языка Ъ+ (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. Структура программы
program = { item };
item = function_definition | constant_definition | type_definition;
type_definition = "!:ТИП", identifier_body, "=", ...
constant_definition = "!:КОНСТ", identifier_body, "=", ...
2. Идентификаторы
variable_identifier = "@", identifier_body;
label_identifier = ":", identifier_body;
predicate_identifier = "?", identifier_body;
identifier_body = letter, {letter | digit | "_"};
3. Литералы
3.1. Числовые литералы
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. Строки и коллекции
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. Арифметические и логические
arithmetic_operator = "+" | "-" | "*" | "/" | "%";
logical_operator = "&&" | "||" | "!";
comparison_operator = "==" | "!=" | "<" | ">" | "<=" | ">=";
4.2. Битовые операторы
bitwise_operator = "&" | "|" | "^" | "~" | "<<<" | ">>>";
4.3. Специальные операторы
special_operator = "|>" | "<<" | "=";
5. Управляющие конструкции
5.1. Блоки и инструкции
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. Условие (Предикативное ветвление)
conditional_expr = "?", expression, ( block_branch | arrow_branch );
block_branch = block, [":", block];
arrow_branch = "->", expression, [":", expression];
5.3. Цикл (Итеративный предикат)
loop_expr = "?*", expression, block;
5.4. Сопоставление с образцом
match_expr = "?", variable_identifier, "{", match_arm, {match_arm}, "}";
match_arm = "|", pattern, "->", (expression | block), [","];
pattern = literal | variable_identifier | "_" ;
6. Функции и Типы
6.1. Определение функции и Типов
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. Вызовы
function_call = label_identifier, "(", [argument_list], ")";
argument_list = expression, {",", expression};
6.3. Лямбды
lambda = "@", "(", [parameter_list], "->", (expression | block), ")";
7. Выражения и Приоритеты
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. Комментарии
comment = "<[", {comment_content | comment}, "]>";
comment_content = ? любой символ, кроме последовательности "]>" и начала вложенного "<[" ?;
9. Пример кода (Валидация по грамматике)
<[ Пример функции вычисления CRC ]>
:Вычислить_ЦРЦ @данные, @длина -> @црц Ъ+
@црц = 0xFFFFFFFF_бр;
@и = 0_бр;
?* (@и < @длина) Ъ+
@байт = @данные[@и];
@црц = @црц ^ @байт;
@к = 0_б8;
?* (@к < 8_б8) Ъ+
? (@црц & 1_бр) -> (@црц >>> 1) ^ 0xEDB88320_бр : (@црц >>> 1);
@к << @к + 1_б8;
Ъ-
@и << @и + 1_бр;
Ъ-
@црц = ~@црц;
Ъ-
Примечания
- Кодировка: UTF-8 (ISO/IEC 10646)
- Отслеживание позиций: Каждый токен имеет координаты (строка, столбец) для сквозного аудита
- Детерминизм: Язык предназначен для создания детерминированного системного ПО
- Безопасность: Минимизация вектора атак, использование no_std окружения
- Аппаратная поддержка: Оптимизация для архитектур «Эльбрус» (предикатное исполнение) и x86