/contracts-verification-task

Kotlin team test task. 2020.

Primary LanguageJava

Dummy language

Dummy language -- это очень простой язык, в котором есть всего несколько конструкций:

  • объявление функции
fun foo() {
    ...
}

fun bar(x, y) {
   ...
}
  • объявление локальных переменных, присванивание в них значение
var x = 1;
var y;
y = true;
  • возврат из функции
fun foo() {
    ...
    return 1;
}

fun bar() {
    ...
    return;
}
  • обращение к переменной
  • создание числовой или булевой константы
  • вызов функции
var x = foo();
var y;
y = bar(x, true);
  • условное выражение
if (true) {
    ...
}

if (b) {
    ...
} else {
    ...
}

Полную грамматику языка в формате ANTLR вы можете посмотреть в файле DummyLanguage.g4

Задача: Dummy language analyzer

Вашим заданием будет реализовать различные виды статического анализа для этого языка. Отталкиваться можно от системы, которая будет проверять, что ни к одной переменной не было обращения до того, как она была проинициализрованна. Переменная считается проинициализированной, если если она была проинициализированна на всех путях исполнения функции, которые могли привести к рассматриваемому обращению к переменной. После этого вы можете реализовать ещё какие-нибудь виды анализа, которые вам покажутся логичными и полезными.

В этом вам может помочь готовый шаблон системы анализа, который включает в себя:

Также в проекте предусмотрена тестовая система, которая включает в себя генератор тестов: в директории testData можно разместить сколько угодно файлов с исходным кодом на dummy language с расширением .dummy. После этого можно вызывать gradle task'у :generateTests, и для каждого файла из директории с тестовыми файлами будет сгенерирован тест в DummyLanguageTestGenerated.kt, который запустит систему анализа поверх соотвествующего тестового файла и сравнит ошибки, которые тот выявил с ошибками, которые записаны в соответствующий файл с расширением .txt.

Если вы создаёте новый тест, то можно запустить его, посмотреть, что выдал анализ, и, если его вывод корректен, вручную записать его в .txt файл, чтобы последующие запуски этого теста проходили успешно.

Больше подробностей про генератор тестов можно посмотреть в файле TestGenerator.kt