Задание 3.2A

Лабораторная №3 — задание 3.2A #

Нужно описать грамматику выражений для своего языка программирования

Порядок выполнения #

  1. Создайте файл docs/specification/expressions-grammar.md — там будет спецификация в формате Markdown с описанием грамматики выражений вашего будущего языка программирования
  2. Составьте спецификацию, используя заголовки, списки, таблицы и примеры грамматики в нотации EBNF (диалект ISO)
  3. Проверьте EBNF грамматику на отсутствие левой рекурсии, поскольку левая рекурсия мешает реализации рекурсивного спуска

Предлагаемый шаблон:

# Грамматика выражений языка <НАЗВАНИЕ>

## Синтаксис выражений

Выражения могут содержать:

- Литералы чисел
- Операторы (бинарные и унарные)
- ...

## Операторы

Арифметические операторы:

| Символы | Операция                 |
| ------- | ------------------------ |
| `+`     | Сложение или унарный "+" |
| ...     | ...                      |

## Приоритет операторов

| Приоритет (по убыванию) | Операторы     |
| ----------------------- | ------------- |
| 3                       | `^`           |
| 2                       | `*`, `/`, `%` |
| ...                     | ...           |

## Грамматика в нотации EBNF

...

Требования к грамматике языка #

1. Требования к оформлению #

Описание грамматики должно быть сделано в двух формах:

  1. Текстовое описание. Можно применять подзаголовки, списки и таблицы для читаемости.
  2. EBNF-грамматика. Следует использовать диалект ISO для EBNF.

2. Основные требования к языку #

Выражения могут содержать:

  • Числовые литералы: 2025, 3.14159265358
  • Основные арифметические операции: сложение, вычитание, деление, умножение
  • унарный минус, унарный плюс
  • Вызовы встроенных функций со списком аргументов
  • Скобки, содержащие вложенные выражения

3. Дополнительные требования к языку #

Чтобы сделать язык более оригинальным, вы должны внести на выбор три дополнения из списка, представленного ниже:

  1. Побитовые операции
    • с помощью встроенных функций, например: bitAnd(x, y), bitOr(x, y), bitXor(x, y), bitNot(x, y)
    • либо с помощью операторов &, |, ^, ~
  2. Встроенные функции для чисел:
    • abs(x) — возвращает модуль числа
    • min(x, y, ...) — возвращает наименьшее из переданных чисел
    • max(x, y, ...) — возвращает наибольшее из переданных чисел
  3. Операция возведения в степень
    • с помощью встроенной функции, например: pow(basis, degree)
    • с помощью оператора ^
    • с помощью оператора **
  4. Встроенные тригонометрические функции:
    • sin(x) — возвращает синус угла
    • cos(x) — возвращает косинус угла
    • tan(x) — возвращает тангенс угла
  5. Встроенные функции округления:
    • round(x) — округляет число до ближайшего целого
    • ceil(x) — возвращает ближайшее целое, большее или равное переданному
    • floor(x) — возвращает ближайшее целое, меньшее или равное переданному
  6. Поддержка констант:
    • Число «пи» (π) — можно обозначить его, например, Pi или MathPi
    • Число «Эйлера» (e) — можно обозначить его, например, Euler или MathE
    • Константы должны быть идентификаторами или ключевыми словами, но не встроенными функциями
  7. Операции целочисленного деления и деления с остатком
    • с помощью встроенных функций, например: div(x, y), mod(x, y)
    • с помощью ключевых слов, например: x div y, x mod y
    • с помощью спецсимволов, например: x // y, x % y

4. Допустимые вариации языка (по желанию) #

По желанию можно внести произвольные изменения в грамматике на свой вкус, например:

  1. Вместо инфиксной нотации использовать префиксную или постфиксную
  2. Использовать символы Unicode для операций
    • пример: × или для умножения
    • пример: ÷ для деления
  3. Использовать ключевые слова вместо спецсимволов для некоторых операций
    • пример: mod или иное слово для деления с остатком

Справочные материалы #

Символы в нотации EBNF #

Стандарт ISO для EBNF определяет такие символы:

Символ EBNFЗаписьОписание
definition=Правило, то есть определение нетерминального символа через ряд других символов
concatenation,Конкатенация символов
termination;Конец правила
alternation|Альтернативные варианты правила
optional[ … ]Опциональная часть правила (0 или 1 раз)
repetition{ … }Повторяющаяся часть правила (0, 1 или много раз)
grouping( … )Атомарная группа символов
terminal string" … "Терминальный символ (строка или символ Unicode)
comment(* … *)Комментарий, не входит в определение
exception-Исключение ряда символов из числа допустимых

EBNF для выражений в SQL #

(* Список выражений *)
expressions_list = expression, { ",", expression } ;

(* Выражения *)
expression = term_expression, { ("+" | "-"), term_expression } ;
term_expression = factor_expression, { ("*" | "/" | "%"), factor_expression } ;
factor_expression = [ "+" | "-" ], exponentiation_expression ;
exponentiation_expression = simple_expression, { ("^"), exponentiation_expression } ;
simple_expression = number | function_call | "(", expression, ")" ;

(* Функции *)
function_call = function_name, "(", [ expression_list ], ")" ;
function_name = identifier ;

Применение ИИ #

Для генерации черновой версии EBNF грамматики рекомендуется использовать ИИ-модели в режиме чата.

Рекомендуемый подход:

  1. Составьте свой промпт и запустите его в подходящей ИИ-модели
    • Можно выбрать DeepSeek в режиме “DeepThink”
    • Можно выбрать Qwen3-Max в обычном режиме
    • Можно выбрать иную ИИ-модель
  2. Вдумчиво и аккуратно перепишите правила грамматики
  3. Перепроверьте конспект — нет ли забытых вещей («слепых зон»), фактических ошибок или несущественных деталей?

Пример промпта:

Ты разработчик и разбираешься в порождающих грамматиках, компиляторах, синтаксическом и лексическом разборе.
Напиши EBNF грамматику для подмножества SQL:
1. Используй EBNF в диалекте стандарта ISO
2. Поддерживай только инструкцию SELECT без FROM, но с произвольными числовыми выражениями с арифметическими операторами, скобками, вызовами встроенных функций