Лабораторная №3 — задание 3.2A #
Нужно описать грамматику выражений для своего языка программирования
Порядок выполнения #
- Создайте файл
docs/specification/expressions-grammar.md— там будет спецификация в формате Markdown с описанием грамматики выражений вашего будущего языка программирования - Составьте спецификацию, используя заголовки, списки, таблицы и примеры грамматики в нотации EBNF — см. EBNF для описания грамматик
- Проверьте 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или иное слово для деления с остатком
- пример: