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

8.7 KiB
Raw Permalink Blame History

Грамматика языка Ъ+ (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