EBNF грамматика в спецификации #
Нужно добавить в спецификацию EBNF-грамматику языка.
Кроме EBNF-грамматики в спецификацию надо добавить таблицу со списком операторов с указанием их приоритета и ассоциативности (левой/правой).
Требования к оформлению EBNF-грамматики #
- Добавляется в файл спецификации
docs/specification.md - Оформляется как блок кода на языке
ebnf - Используется диалект ISO EBNF — см. EBNF для описания грамматик
- Должны быть описаны правила для всех нетерминалов
- Не следует описывать правила для терминальных символов — они уже описаны в разделе про лексику
- Именование символов грамматики должно быть очевидным — однако можно добавлять комментарии для ясности
Требования к EBNF-грамматике #
- Нужно устранить левую рекурсию, поскольку по грамматике вы будете писать парсер на основе рекурсивного спуска
- Рекомендуется устранить левую факторизацию, чтобы упросить разработку парсера
Требования к языку #
На данном этапе надо описать грамматику в том объёме, который вы реализуете в этой же итерации:
- Весь код программы в одном файле
- Есть точка входа — функция main (как в C/C++), метод main (как в Java/C#), основной блок (как в Pascal) или что-то иное
- Программа состоит из списка инструкций
- Инструкция — это выражение либо операция ввода/вывода
- Один тип данных — целочисленный либо тип с плавающей точкой
- Есть поддержка арифметических операций
- Нет поддержки переменных
- Есть средства для вывода чисел — например, встроенная функция
println(x),printInt(x)или инструкцияprint x;
Особенности языка #
Язык должен иметь минимум 2 особенности из списка ниже:
- Оператор возведения в степень (
^либо**) - Оператор деления с остатком
% - Побитовые операции над целыми числами: побитовые “И”, “ИЛИ”
- Встроенные константы — например,
piилиe - Встроенные функции (не менее 3 функций) — например:
round(float): float— округление числаceil(float): float— округление числа вверхfloor(float): float— округление числа внизsqrt(float): float— извлечение квадратного корняabs(int): int— получение модуля числаsqr(int): int— вычисление квадрата числаmin(int, int): int— вычисление минимума из двух чиселmax(int, int): int— вычисление максимума из двух чисел
- Средства для ввода чисел — например, встроенная функция
readInt()
Требования к спецификации #
Эти требования аналогичны прошлой итерации.
Требования к содержанию:
- Полнота — текущие возможности языка описаны полностью и позволяют написать примеры
- Минимализм — в языке нет лишних возможностей и функций
- Непротиворечивость — всё написанное в во всех файлах спецификации не должно содержать противоречий
- Достижимость — проект может быть реализован студентом за семестр параллельно с другими курсами
Требования к тексту:
- Читаемость — текст легко читается человеком
- Грамотность — нет логических, фактических, грамматических, стилевых ошибок в тексте
- Лаконичность — текст краткий и ёмкий, нет «воды» и повторений одной и той же информации
Рекомендации #
- Для удобства редактирования EBNF можно использовать VSCode-плагин EBNF Tools
- Используйте облачные LLM для ревью грамматики — см. Правила использования ИИ