Парсер точки входа и выражений #
Нужно написать парсер для разбора простейших программ, которые имеют:
- Одну точку входа
- Список инструкций, где инструкция — это выражение либо операция ввода/вывода
- Арифметические операции в выражениях
На основе парсера надо реализовать консольный интерпретатор.
Пример такой программы:
/* Сложение, умножение и унарный минус */
/* Ожидаемый результат: 80 */
class AddMultiply {
public static void main(String [] a) {
System.out.println(10 + 7 * (2 * 3 + 4) + 5 + -5);
}
}
Соответствие спецификации #
Парсер должен соответствовать спецификации вашего языка:
- Спецификация должна появиться до начала кодирования — так же, как и в реальных проектах.
- Вы можете составлять спецификацию совместно или доверить это одному человеку.
- Ждать проверки спецификации преподавателем не нужно.
Требования к коду #
Требования к реализации парсера #
- Парсер должен использовать рекурсивный спуск для разбора
- Один метод парсера соответствует одному правилу EBNF-грамматики из спецификации
- название такого метода формируется из имени правила с префиксом parse, например:
expression_list→ParseExpressionList - допускается выделять дополнительные методы, если это нужно для упрощения реализации
- допускается встраивать в метод разбор другого правила, если это не усложняет реализацию
- название такого метода формируется из имени правила с префиксом parse, например:
- Парсер следует писать без генераторов синтаксических анализаторов (таких как GNU Bison, ANTLR и так далее)
- Весь код, связанный с синтаксическим анализом, должен располагаться в отдельном модуле программы
Требования к продукции парсера #
- Не рекомендуется строить AST (Abstract Syntax Tree) — а если вы применяете AST, то на ревью могут возникнуть дополнительные замечания к реализации AST
- Если вы не используете VM, то выполняйте интерпретацию сразу по мере разбора кода
- Если вы используете VM, то дополняйте список инструкций сразу по мере разбора
Требования к реализации интерпретатора #
- Интерпретатор читает исходный код из переданного файла
- Интерпретатор читает ввод из стандартного потока ввода (stdin)
- Интерпретатор пишет вывод в стандартный поток вывода (stdout)
- Любая ошибка разбора исходного кода либо ошибка времени выполнения должна приводить к немедленной остановке интерпретатора с печатью ошибки в стандартный поток ошибок (stderr) и завершению процесса с возвратом ненулевого кода