Работы велась с абстрактным синтаксисом языка L: https://github.com/kajigor/fl-2021-hse-win/blob/proj/lang/L.md
- Разработан конкретный синтаксис языка (описан ниже).
- Написан парсер языка (в папке Parser, инструкция ниже).
- Реализована поддержка языка в среде разработки VSCode (в папке lsp).
Язык имеет C-подобный синтаксис, представляет собой последовательность функций с одной функцией-входом main.
Объявление функции выглядит следующим образом:
fun function_name __args__ __body__
Здесь __args__
- набор переменных через запятую в виде (a_1, a_2,...)
.
__body__
- тело функции, состоящее из последовательности операторов через запятую.
Например:
fun nothing(a, b){}
Выражения могут являться следующими сущностями:
- Литералы:
- Натуральные числа в десятичной записи:
0, 10, 1234,...
- Натуральные числа в двоичной записи:
0x101010101
- Строчки в виде:
"string"
- Переменные
Переменные должны начинаться с латинской буквы, далее могут идти латинские буквы, цифры и знак _.
Например:a, lenStr, mySuper_important_123class
- Вызовы функций
Вызовы функций имеют вид:function_name __argsCall__
, где__argsCall__
- это наборы выражений через запятую, т.е.(expr1, expr2, expr3,...)
Например:nothing(a*b + 1, a - b + 3)
- Различные комбинации вышеперечисленных сущностей с помощью операций различной арности и ассоциативности.
Оператором может быть какая-то из перечесленных ниже сущностей. Каждый оператор должен оканчиваться символом ;
Далее __expr__
- некоторое выражение в круглых скобках, например (x < 1)
.
__body__
- последовательность операторов в фигурных скобках, например {x = 1;}
- skip
Данный оператор означает, что реализация соответствующей функции неопределена. - Условный оператор. Должен иметь следующий вид:
if __expr__ __body__
if __expr__ __body__ else __body__
- Цикл с предусловием. Должен иметь следующий вид:
while __expr__ __body__
- Связывание переменной. Слева от символа
=
находится имя переменной, справа выражение.
var = expr
- Последовательность операторов. Каждый должен заканчиваться символом
;
operator;
operator;
- Вызов функции. Аналогично вызову функции в случае выражения:
function_name __argsCall__
где __argsCall
это последовательность выражений (expr1, expr2, expr3,...)
##Комментарии :
Комментарии оборачиваются в символы #. Комментарием является любой текст между двумя соседними знаками #
Пример комментария: #comment#
- Чтение кода программы и построение по нему дерева
- Вывод дерева в текстовый файл *.txt и его отрисовка в *.png файл
- Обработка ошибок при парсинге
- Написание тестов для проверки корректности работы
Инструкция по сборке:
Устанавливаем antlr: https://github.com/antlr/antlr4/blob/master/doc/getting-started.md
Генерируем нужные файлы: antlr4 -Dlanguage=Python3 -visitor L.g4
Запускаем питоновский файл, передавая ему файл с кодом: python3 visitorL.py prog.L
После парсинга кода получаем на выходе представление дерева в текстовом виде в файле prog.txt
и в графическом виде в файле prog.png
. Для генерации графического файла необходима утилита Graphviz. Установка:
https://graphviz.org/
- Подсветка синтаксиса
- Snippetы с умным заполнением полей
- Диагностика на название функций в стиле не camelCase + QuickFix
- Диагностика использования функции без определения
- Автодополнение функциями и переменными в зависимости от положения каретки и области видимости
Совместными усилиями был придуман язык
- Написана вся грамматика для языка с помощью ANTLR
- Написан парсер на Python, который строит дерево
- Реализована поддержка языка в среде разработки VSCode
- Разобраться с новой технологией для лексера/парсера ANTLR, найти нужные классы в документации
- Выучить TypeScript
за 2 дня - Склеить из туториалов и репозиториев на GitHub работающее расширение
и не умереть в процессе