Парсер точки входа и выражений

Парсер точки входа и выражений #

Нужно написать парсер для разбора простейших программ, которые имеют:

  1. Одну точку входа
  2. Список инструкций, где инструкция — это выражение либо операция ввода/вывода
  3. Арифметические операции в выражениях

На основе парсера надо реализовать консольный интерпретатор.

Пример такой программы:

/* Сложение, умножение и унарный минус */
/* Ожидаемый результат: 80 */

class AddMultiply {
    public static void main(String [] a) {
        System.out.println(10 + 7 * (2 * 3 + 4) + 5 + -5);
    }
}

Соответствие спецификации #

Парсер должен соответствовать спецификации вашего языка:

  1. Спецификация должна появиться до начала кодирования — так же, как и в реальных проектах.
  2. Вы можете составлять спецификацию совместно или доверить это одному человеку.
  3. Ждать проверки спецификации преподавателем не нужно.

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

  1. Правила использования ИИ
  2. Соглашения о кодировании

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

  1. Парсер должен использовать рекурсивный спуск для разбора
  2. Один метод парсера соответствует одному правилу EBNF-грамматики из спецификации
    • название такого метода формируется из имени правила с префиксом parse, например: expression_list → ParseExpressionList
    • допускается выделять дополнительные методы, если это нужно для упрощения реализации
    • допускается встраивать в метод разбор другого правила, если это не усложняет реализацию
  3. Парсер следует писать без генераторов синтаксических анализаторов (таких как GNU Bison, ANTLR и так далее)
  4. Весь код, связанный с синтаксическим анализом, должен располагаться в отдельном модуле программы

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

  1. Не рекомендуется строить AST (Abstract Syntax Tree) — а если вы применяете AST, то на ревью могут возникнуть дополнительные замечания к реализации AST
  2. Если вы не используете VM, то выполняйте интерпретацию сразу по мере разбора кода
  3. Если вы используете VM, то дополняйте список инструкций сразу по мере разбора

Требования к реализации интерпретатора #

  1. Интерпретатор читает исходный код из переданного файла
  2. Интерпретатор читает ввод из стандартного потока ввода (stdin)
  3. Интерпретатор пишет вывод в стандартный поток вывода (stdout)
  4. Любая ошибка разбора исходного кода либо ошибка времени выполнения должна приводить к немедленной остановке интерпретатора с печатью ошибки в стандартный поток ошибок (stderr) и завершению процесса с возвратом ненулевого кода