Примеры студенческих проектов /

Плагин для языка Fortran для IntelliJ Platform

Участники проекта

Сергей Шульман

Сергей Шульман

Выпуск 2018

Руководитель

Семён Атамась

Семён Атамась

JetBrains

Введение

Fortran – очень старый язык, на котором написано довольно много научного и инженерного кода. В весеннем семестре 2016-2017 учебного года я под руководством Семёна Атамась взялся за реализацию плагина для Фортрана для IntelliJ IDEA. Я решил, что этот проект мне хорошо подходит и будет очень интересным: у меня был опыт программирования на Фортране и мне был интересен процесс создания плагина к IDE, хотя я и знал, что придётся столкнуться с заметными трудностями, связанными с грамматикой Фортрана. В результате, я занимался разработкой плагина почти целый год в рамках двух семестровых практик и летней стажировки в JetBrains.

Работа над проектом

У IntelliJ IDEA существует очень удобное API для создания плагинов. Кроме того, плагин Grammar Kit позволяет генерировать код парсера из bnf грамматики. В итоге можно сравнительно легко создать парсер для своего языка. Но уже на данном этапе возникли некоторое сложности с объёмной и запутанной грамматикой Фортрана, в которой есть контекстно зависимые участки (не поддающиеся обработке в grammar kit) и две формы записи исходного кода: ориентированная на перфокарты фиксированная форма записи кода, в которой важно, в какой именно позиции на строке стоят символы, и свободная форма записи, аналогичная тому, что мы обычно видим в других языках программирования. Из-за этого пришлось частично написать парсер вручную, а Fortran представить как язык с двумя диалектами, использующими различные модификации лексера, в одной из которых пришлось сделать дополнительный просмотр кода для правильного определения токенов и возвращение лишних символов, которые не являются частью данного токена, но помогают его правильно распознать.

Следующий интересный момент был связан с правильной подсветкой кода и определением конца блоков кода. В Фортране конец блока кода заканчивается ключевым словом end, возможно, с какими то дополнительными ключевыми словами (end do, end if, end function etc). Кроме того, любое ключевое слово может быть использовано как имя переменной. В итоге подсветку синтаксиса пришлось реализовывать не на этапе лексера, а уже после построения дерева синтаксического разбора. К сожалению, это немного тормозит её работу. В парсере пришлось реализовать проверки, то встреченное слово end действительно является ключевым словом, а не именем переменной или массива (что встречается в реальном коде).

Аналогичная сложность была с реализацией Brace Matcher: ключевые слова должны быть распознаны как скобки сразу же после работы лексера (т.е. до работы парсера). А значит, мы не могли определить, в каком узле дерева синтаксического разбора находится наше ключевое слово и является ли оно ключевым словом вообще. Поэтому пришлось написать определение смысловой нагрузки конкретных ключевых слов по соседним токенам без использования парсера.

Разные интересные особенности языка выявлялись практически на каждом этапе работы. Среди них были и несколько способов организации пространства имён, и удивительные нестандартные расширения языка, и странная грамматика ООП. Но дольше всего пришлось возиться с корректным отображением массивов в отладчике. Мы реализовали поддержку работы GDB с Фортраном в CLion. В Фортране массив может начинаться с любого целого числа, а в pretty printers, написанных в CLion для GDB было зашито, что массивы всегда начинаются с нуля. Мы потратили довольно много времени, чтобы найти это место и изменить его.

Результаты работы

Мы начали разрабатывать плагин с нуля. К концу работы мы получили языковой плагин с заметными возможностями. В нём реализованы лексер, парсер, подсветка синтаксиса, комментер, форматтер, фолдер, брейс мэтчер, смарт энтер процессор, навигация (переход к определению и поиск использований), отладчик и ряд инспекций. Мне было очень приятно, что данный проект не является чисто учебным: наш плагин доступен для использования. В данный момент у нас есть уже несколько сотен пользователей.

Это был очень интересный опыт работы с IntelliJ IDEA и устройствами языка. Я многому научился в работе с плагинами для IDE и узнал ряд особенностей устройства языков.

Я надеюсь, плагин продолжит развиваться. В нём появится больше инспекций и возможностей для рефакторинга кода. Я благодарен CSC и JetBrains за этот бесценный опыт и Семёну за потрясающее время, проведённое за разработкой плагина.

Текст написал

Сергей Шульман

Сергей Шульман