EBNF грамматика в спецификации

EBNF грамматика в спецификации #

Нужно добавить в спецификацию EBNF-грамматику языка.

Кроме EBNF-грамматики в спецификацию надо добавить таблицу со списком операторов с указанием их приоритета и ассоциативности (левой/правой).

Требования к оформлению EBNF-грамматики #

  1. Добавляется в файл спецификации docs/specification.md
  2. Оформляется как блок кода на языке ebnf
  3. Используется диалект ISO EBNF — см. EBNF для описания грамматик
  4. Должны быть описаны правила для всех нетерминалов
  5. Не следует описывать правила для терминальных символов — они уже описаны в разделе про лексику
  6. Именование символов грамматики должно быть очевидным — однако можно добавлять комментарии для ясности

Требования к EBNF-грамматике #

  1. Нужно устранить левую рекурсию, поскольку по грамматике вы будете писать парсер на основе рекурсивного спуска
  2. Рекомендуется устранить левую факторизацию, чтобы упросить разработку парсера

Требования к языку #

На данном этапе надо описать грамматику в том объёме, который вы реализуете в этой же итерации:

  1. Весь код программы в одном файле
  2. Есть точка входа — функция main (как в C/C++), метод main (как в Java/C#), основной блок (как в Pascal) или что-то иное
  3. Программа состоит из списка инструкций
  4. Инструкция — это выражение либо операция ввода/вывода
  5. Один тип данных — целочисленный либо тип с плавающей точкой
  6. Есть поддержка арифметических операций
  7. Нет поддержки переменных
  8. Есть средства для вывода чисел — например, встроенная функция println(x), printInt(x) или инструкция print x;

Особенности языка #

Язык должен иметь минимум 2 особенности из списка ниже:

  1. Оператор возведения в степень (^ либо **)
  2. Оператор деления с остатком %
  3. Побитовые операции над целыми числами: побитовые “И”, “ИЛИ”
  4. Встроенные константы — например, pi или e
  5. Встроенные функции (не менее 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 — вычисление максимума из двух чисел
  6. Средства для ввода чисел — например, встроенная функция readInt()

Требования к спецификации #

Эти требования аналогичны прошлой итерации.

Требования к содержанию:

  1. Полнота — текущие возможности языка описаны полностью и позволяют написать примеры
  2. Минимализм — в языке нет лишних возможностей и функций
  3. Непротиворечивость — всё написанное в во всех файлах спецификации не должно содержать противоречий
  4. Достижимость — проект может быть реализован студентом за семестр параллельно с другими курсами

Требования к тексту:

  1. Читаемость — текст легко читается человеком
  2. Грамотность — нет логических, фактических, грамматических, стилевых ошибок в тексте
  3. Лаконичность — текст краткий и ёмкий, нет «воды» и повторений одной и той же информации

Рекомендации #

  1. Для удобства редактирования EBNF можно использовать VSCode-плагин EBNF Tools
  2. Используйте облачные LLM для ревью грамматики — см. Правила использования ИИ