Проектная лаборатория
Собственный интерпретатор
Этап 67 · Разрешение и связывание имён
Разрешение идентификаторов
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы добавите поддержку разрешения и связывания идентификаторов во время компиляции.
Вам потребуется реализовать механизм разрешения имён, который обходит AST и сопоставляет идентификаторы с соответствующими привязками, а затем запускать его отдельным проходом по AST.
Мы говорим о разрешении идентификаторов, потому что на этом этапе вы будете разрешать объявления переменных, присваивания переменным, объявления функций и все остальные узлы AST.
Ссылка на книгу
Код для этого этапа реализован в разделе 11.3: Класс разрешения имён.
Проверки
Тестирующая система выполнит серию проверок с файлами test.lox, содержащими программы с разрешением и связыванием идентификаторов.
Например, если test.lox содержит следующее:
var variable = "global";
{
fun f() {
print variable;
}
f();
var variable = "local";
f();
}Тестирующая система запустит вашу программу следующим образом:
$ ./your_program.sh run test.lox
global
globalТестирующая система выполнит несколько таких проверок со случайными выражениями, например:
Тестовый случай 1:
Входные данные:
fun global() {
print "global";
}
{
fun f() {
global();
}
f();
fun global() {
print "local";
}
f();
}Ожидаемый вывод:
global
globalТестовый случай 2:
Входные данные:
var x = "global";
fun outer() {
var x = "outer";
fun middle() {
fun inner() {
print x;
}
inner();
var x = "middle";
inner();
}
middle();
}
outer();Ожидаемый вывод:
outer
outerТестовый случай 3:
Входные данные:
var count = 0;
{
fun makeCounter() {
fun counter() {
count = count + 1;
print count;
}
return counter;
}
var counter1 = makeCounter();
counter1();
counter1();
var count = 0;
counter1();
}Ожидаемый вывод:
1
2
3Тестирующая система проверит, что stdout вашей программы соответствует приведённому выше формату, а код завершения равен 0.
Примечания
- Этот формат вывода соответствует спецификации в репозитории книги
- Механизм разрешения имён должен обеспечивать сопоставление переменных с правильными областями видимости во время компиляции
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init interpreter ./my-interpreter --language go2. Откройте папку в IDE
cd ./my-interpreterРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage de8Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.