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
Вашим заданием будет реализовать различные виды статического анализа для этого языка. Отталкиваться можно от системы, которая будет проверять, что ни к одной переменной не было обращения до того, как она была проинициализрованна. Переменная считается проинициализированной, если если она была проинициализированна на всех путях исполнения функции, которые могли привести к рассматриваемому обращению к переменной. После этого вы можете реализовать ещё какие-нибудь виды анализа, которые вам покажутся логичными и полезными.
В этом вам может помочь готовый шаблон системы анализа, который включает в себя:
- ANTLR грамматика, описанная в DummyLanguage.g4
- Парсер
- Промежуточное представление, покрывающее все конструкции языка и Visitor для него
- Шаблон, для системы проверок инициализации переменных
Также в проекте предусмотрена тестовая система, которая включает в себя генератор тестов: в директории testData можно разместить сколько угодно файлов с исходным кодом на dummy language с расширением .dummy
. После этого можно вызывать gradle task'у :generateTests
, и для каждого файла из директории с тестовыми файлами будет сгенерирован тест в DummyLanguageTestGenerated.kt, который запустит систему анализа поверх соотвествующего тестового файла и сравнит ошибки, которые тот выявил с ошибками, которые записаны в соответствующий файл с расширением .txt
.
Если вы создаёте новый тест, то можно запустить его, посмотреть, что выдал анализ, и, если его вывод корректен, вручную записать его в .txt
файл, чтобы последующие запуски этого теста проходили успешно.
Больше подробностей про генератор тестов можно посмотреть в файле TestGenerator.kt