Лабораторная №3 — задание 3.2A #
Нужно описать грамматику выражений для своего языка программирования
Порядок выполнения #
- Создайте файл
docs/specification/expressions-grammar.md— там будет спецификация в формате Markdown с описанием грамматики выражений вашего будущего языка программирования - Составьте спецификацию, используя заголовки, списки, таблицы и примеры грамматики в нотации EBNF (диалект ISO)
- Проверьте EBNF грамматику на отсутствие левой рекурсии, поскольку левая рекурсия мешает реализации рекурсивного спуска
Предлагаемый шаблон:
# Грамматика выражений языка <НАЗВАНИЕ>
## Синтаксис выражений
Выражения могут содержать:
- Литералы чисел
- Операторы (бинарные и унарные)
- ...
## Операторы
Арифметические операторы:
| Символы | Операция |
| ------- | ------------------------ |
| `+` | Сложение или унарный "+" |
| ... | ... |
## Приоритет операторов
| Приоритет (по убыванию) | Операторы |
| ----------------------- | ------------- |
| 3 | `^` |
| 2 | `*`, `/`, `%` |
| ... | ... |
## Грамматика в нотации EBNF
...
Требования к грамматике языка #
1. Требования к оформлению #
Описание грамматики должно быть сделано в двух формах:
- Текстовое описание. Можно применять подзаголовки, списки и таблицы для читаемости.
- EBNF-грамматика. Следует использовать диалект ISO для EBNF.
2. Основные требования к языку #
Выражения могут содержать:
- Числовые литералы:
2025,3.14159265358 - Основные арифметические операции: сложение, вычитание, деление, умножение
- унарный минус, унарный плюс
- Вызовы встроенных функций со списком аргументов
- Скобки, содержащие вложенные выражения
3. Дополнительные требования к языку #
Чтобы сделать язык более оригинальным, вы должны внести на выбор три дополнения из списка, представленного ниже:
- Побитовые операции
- с помощью встроенных функций, например:
bitAnd(x, y),bitOr(x, y),bitXor(x, y),bitNot(x, y) - либо с помощью операторов
&,|,^,~
- с помощью встроенных функций, например:
- Встроенные функции для чисел:
abs(x)— возвращает модуль числаmin(x, y, ...)— возвращает наименьшее из переданных чиселmax(x, y, ...)— возвращает наибольшее из переданных чисел
- Операция возведения в степень
- с помощью встроенной функции, например:
pow(basis, degree) - с помощью оператора
^ - с помощью оператора
**
- с помощью встроенной функции, например:
- Встроенные тригонометрические функции:
sin(x)— возвращает синус углаcos(x)— возвращает косинус углаtan(x)— возвращает тангенс угла
- Встроенные функции округления:
round(x)— округляет число до ближайшего целогоceil(x)— возвращает ближайшее целое, большее или равное переданномуfloor(x)— возвращает ближайшее целое, меньшее или равное переданному
- Поддержка констант:
- Число «пи» (π) — можно обозначить его, например,
PiилиMathPi - Число «Эйлера» (e) — можно обозначить его, например,
EulerилиMathE - Константы должны быть идентификаторами или ключевыми словами, но не встроенными функциями
- Число «пи» (π) — можно обозначить его, например,
- Операции целочисленного деления и деления с остатком
- с помощью встроенных функций, например:
div(x, y),mod(x, y) - с помощью ключевых слов, например:
x div y,x mod y - с помощью спецсимволов, например:
x // y, x % y
- с помощью встроенных функций, например:
4. Допустимые вариации языка (по желанию) #
По желанию можно внести произвольные изменения в грамматике на свой вкус, например:
- Вместо инфиксной нотации использовать префиксную или постфиксную
- Использовать символы Unicode для операций
- пример:
×или⋅для умножения - пример:
÷для деления
- пример:
- Использовать ключевые слова вместо спецсимволов для некоторых операций
- пример:
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 грамматики рекомендуется использовать ИИ-модели в режиме чата.
Рекомендуемый подход:
- Составьте свой промпт и запустите его в подходящей ИИ-модели
- Вдумчиво и аккуратно перепишите правила грамматики
- Перепроверьте конспект — нет ли забытых вещей («слепых зон»), фактических ошибок или несущественных деталей?
Пример промпта:
Ты разработчик и разбираешься в порождающих грамматиках, компиляторах, синтаксическом и лексическом разборе.
Напиши EBNF грамматику для подмножества SQL:
1. Используй EBNF в диалекте стандарта ISO
2. Поддерживай только инструкцию SELECT без FROM, но с произвольными числовыми выражениями с арифметическими операторами, скобками, вызовами встроенных функций