Система предназначена для разбора, семантического анализа и выполнения математических выражений и алгоритмов, описанных в текстовом виде. Система должна поддерживать три уровня сложности:
- базовый калькулятор,
- язык с динамической типизацией,
- язык со статической типизацией.
- Синтаксис: Поддержка арифметических операторов (
+,-, ``,/, `^`), унарных операторов, скобок и факториала. - Переменные: Поддержка именованных переменных. Присваивание значений. Повторное присваивание разрешено.
- Типизация: Динамическая. Система самостоятельно определяет тип данных (целое число или вещественное число) на этапе выполнения.
- Поведение: Использование переменной до ее инициализации должно приводить к остановке выполнения с сообщением об ошибке.
- Группирование:
- скобки
(...); - абсолютные скобки
| ... |
- скобки
- Постфиксный факториал
! - Возведение в степень
^- операция правоассоциативная
- Унарные префиксные операторы
+,-- операции правоассоциативные
- Умножение и деление ``,
/- операции левоассоциативные
- Сложение и вычитание
+,-- операции левоассоциативные
- Переменная создается оператором присваивания
- Использование переменной до первого присваивания является ошибкой
- Повторное присваивание разрешено
-
Клонирование репозитория
git clone <URL_РЕПОЗИТОРИЯ> cd nolang
-
Сборка проекта
mvn clean package
-
Запуск
-
Интерактивный режим (REPL):
java -jar target/nolang-1.0-SNAPSHOT.jar
-
Выполнение из файла:
java -jar target/nolang-1.0-SNAPSHOT.jar algebraic src/test/resources/algebraic/statements.txt
-
- Логические операции: Поддержка операторов сравнения (
>,<,==,!=) и логических связок (AND,OR,NOT). - Управление потоком: Реализация условных конструкций (
if/else) и циклов (while). - Функции: Возможность объявления пользовательских функций, передача аргументов, поддержка рекурсии.
- Встроенные функции: Предоставление набора стандартных математических функций (например,
sin,abs,pow).
- Объявление типов: Переменные и параметры функций должны иметь явно указанный тип (
int,float,bool). - Проверка типов: Система должна отклонять выполнение программы на этапе компиляции (до начала выполнения) при попытке присвоить значение несовместимого типа или передать аргумент неверного типа в функцию.
- Область видимости: Поддержка вложенных областей видимости переменных.
- Обработка ошибок: Синтаксические ошибки должны фиксироваться с указанием номера строки и позиции символа.
- Расширяемость: Архитектура синтаксического анализатора должна позволять добавлять новые синтаксические конструкции без модификации ядра системы.
- Независимость: Система не должна зависеть от внешних сетевых ресурсов или файловых систем во время выполнения вычислений.
Настройка для работы с antlr без maven плагина
# ANTLR4 в .shellrc
export ANTLR_JAR=~/.local/share/java/antlr-4.13.2-complete.jar
antlr() {
java -jar "$ANTLR_JAR" "$@"
}
grun() {
java -cp "$ANTLR_JAR:target/classes" org.antlr.v4.gui.TestRig "$@"
}# Компиляция грамматики без плагина (в /tmp, для отладки)
mvn clean compile
# see how ANTLR translates your left-recursive rules
antlr -o /tmp -Xlog src/main/antlr4/com/nokhrin/interpreter/StaticTyped.g4
# сгенерирует классы лексер, парсер, слушатель в /tmp/src/main/antlr4/com/nokhrin/interpreter
# Визуализация
# дерево в консоль
grun com.nokhrin.nolang.StaticTyped prog -tree < src/test/resources/StaticTyped/possible_problems.txt
# дерево в gui
grun com.nokhrin.nolang.StaticTyped prog -gui < src/test/resources/StaticTyped/possible_problems.txt
# токены
grun com.nokhrin.nolang.StaticTyped tokens -tokens < src/test/resources/StaticTyped/possible_problems.txtmvn spotless:apply
mvn spotless:check
mvn checkstyle:check