В этом задании вам предстоит реализовать интерпретатор для lisp-подобного языка программирования, а именно некоторого подмножества scheme.
Язык будет состоять из:
- Примитивных типов: целых чисел, bool-ов и символов (идентификаторов).
- Составных типов: пар и списков.
- Переменных с синтаксической областью видимости.
- Функций и лямбда-выражений.
Ваша программа должна будет выполнять выражения языка и возвращать результат выполнения.
1 => 1
(+ 1 2) => 3
Обозначение =>
в примерах здесь и далее разделяет выражение и результат его выполнения.
Выполнение языка происходит в 3 этапа:
Токенизация - преобразует текст программы в последовательность атомарных лексем.
Синтаксический анализ - преобразует последовательность токенов в AST. AST в лисп-подобных языках программирования представляется в виде списков.
Вычисление - рекурсивно обходит AST программы и преобразует его в соответствии с набором правил.
Выражение
(+ 2 (/ -3 +4))
в результате токенизации превратится в список токенов:
{
OpenParen(),
Symbol("+"),
Number(2),
OpenParen(),
Symbol("/"),
Number(-3),
Number(4),
CloseParen(),
CloseParen()
}
Последовательность токенов в результате синтаксического анализа превратится в дерево:
Cell{
Symbol("+"),
Cell{
Number(2),
Cell{
Cell{
Symbol("/"),
Cell{
Number(-3),
Cell{
Number(4),
nullptr
}
}
}
nullptr
}
}
}
Результатом же выполнения выражения будет
(+ 2 (/ -3 +4)) => 1
Задача разделена на 4 подзадачи.
№ | Название | Стоимость | О чем пункт |
---|---|---|---|
1 | tokenizer | 2 балла | Здесь вы напишете токенизатор --- класс, который преобразует входной поток символов в последовательность токенов. |
2 | parser | 2 балла | В этом пункте вы реализуете парсер --- набор методов, который читает поток токенов и строит по ним синтаксическое дерево. |
3 | basic | 3 балла | Имея парсер, можно описывать процесс вычисления. В простой версии не будет переменных и лямбда-функций. |
4 | advanced | 3 балла | В последней части нужно поддержать условные выражения, создание переменных и лямбда-функции, которые будут уметь захватывать контекст. |
-
Видео-урок введение в scheme объяснит базовые конструкции языка.
-
Для погружения в язык стоит воспользоваться интерактивным интерпретатором. Такого рода среды программирования называются REPL (read-eval-print loop) и существуют для самых разных языков программирования. REPL для BiwaScheme - поэкспереминтируйте в нём с выполнением выражений, разберитесь с польской нотацией, синтаксисом языка. К сожалению, не существует каноничной реализации языка, все реализации обладают своим уникальным набором фичей и багов. Пример другого интерпретатора compile scheme online. Готовые интерпретаторы предлагаются только для ознакомления с языком, вам же предстоит написать свой язык.
-
Книга Build Your Own Lisp разбирает детали реализации интерпретатора на языке C.
-
Книга Crafting Interpreters разбирает реализацию интерпретатора для более сложного языка, чем lisp.