Skip to content

Latest commit

 

History

History
144 lines (106 loc) · 6.68 KB

File metadata and controls

144 lines (106 loc) · 6.68 KB

Разработка интерпретатора языка программирования Nolang

Система предназначена для разбора, семантического анализа и выполнения математических выражений и алгоритмов, описанных в текстовом виде. Система должна поддерживать три уровня сложности:

  • базовый калькулятор,
  • язык с динамической типизацией,
  • язык со статической типизацией.

Этап 1: Алгебраический калькулятор

Функциональные требования

  • Синтаксис: Поддержка арифметических операторов (+, -, ``, /, `^`), унарных операторов, скобок и факториала.
  • Переменные: Поддержка именованных переменных. Присваивание значений. Повторное присваивание разрешено.
  • Типизация: Динамическая. Система самостоятельно определяет тип данных (целое число или вещественное число) на этапе выполнения.
  • Поведение: Использование переменной до ее инициализации должно приводить к остановке выполнения с сообщением об ошибке.

Приоритеты и ассоциативность

  1. Группирование:
    • скобки (...);
    • абсолютные скобки | ... |
  2. Постфиксный факториал !
  3. Возведение в степень ^
    • операция правоассоциативная
  4. Унарные префиксные операторы +, -
    • операции правоассоциативные
  5. Умножение и деление ``, /
    • операции левоассоциативные
  6. Сложение и вычитание +, -
    • операции левоассоциативные

Переменные

  • Переменная создается оператором присваивания
  • Использование переменной до первого присваивания является ошибкой
  • Повторное присваивание разрешено

Выполнение

  1. Клонирование репозитория

    git clone <URL_РЕПОЗИТОРИЯ>
    cd nolang
  2. Сборка проекта

    mvn clean package
  3. Запуск

    • Интерактивный режим (REPL):

      java -jar target/nolang-1.0-SNAPSHOT.jar
    • Выполнение из файла:

      java -jar target/nolang-1.0-SNAPSHOT.jar algebraic src/test/resources/algebraic/statements.txt

Этап 2: Транслятор: динамическая типизация

Функциональные требования

  • Логические операции: Поддержка операторов сравнения (>, <, ==, !=) и логических связок (AND, OR, NOT).
  • Управление потоком: Реализация условных конструкций (if/else) и циклов (while).
  • Функции: Возможность объявления пользовательских функций, передача аргументов, поддержка рекурсии.
  • Встроенные функции: Предоставление набора стандартных математических функций (например, sin, abs, pow).

Этап 3: Транслятор: статическая типизация

Функциональные требования

  • Объявление типов: Переменные и параметры функций должны иметь явно указанный тип (int, float, bool).
  • Проверка типов: Система должна отклонять выполнение программы на этапе компиляции (до начала выполнения) при попытке присвоить значение несовместимого типа или передать аргумент неверного типа в функцию.
  • Область видимости: Поддержка вложенных областей видимости переменных.

Нефункциональные требования и ограничения

  • Обработка ошибок: Синтаксические ошибки должны фиксироваться с указанием номера строки и позиции символа.
  • Расширяемость: Архитектура синтаксического анализатора должна позволять добавлять новые синтаксические конструкции без модификации ядра системы.
  • Независимость: Система не должна зависеть от внешних сетевых ресурсов или файловых систем во время выполнения вычислений.

Cheatsheet разработчика

Настройка для работы с 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.txt

Стиль кода

mvn spotless:apply
mvn spotless:check
mvn checkstyle:check