Интегрированные среды разработки (Integrated Development Environment, IDE) являются неотъемлемой частью современного программирования и разработки программных продуктов. Появившись в 1970-х годах, они прошли длительный путь развития и совершенствования. В наши дни типичная среда разработки включает в себя текстовый редактор, компилятор и/или интерпретатор, средства автоматической сборки, отладчик и другие инструменты. Популярными IDE для языка Java являются Eclipse1 и IntelliJ IDEA2. Они так же имеют средства для работы с системами контроля версий, рефакторинга, форматирования кода. Кроме того, существует возможность расширения функциональности этих IDE со стороны пользователей путем создания плагинов — программных компонентов, добавляющих новые возможности. В частности, плагины могут добавлять поддержку новых языков в IDE. Для разработки подобного плагина необходимо в большинстве случаев реализовать синтаксический анализатор целевого языка, который в случае IntelliJ IDEA можно получить с помощью плагина Grammar-Kit по грамматике этого языка в форме БэкусаНаура. Так же, при реализации поддержки нового целевого языка, часто возникает потребность в реализации форматера для программ на этом языке.
Задача автоматического форматирования текстов программ является классической в контексте различных языковых процессоров. Она подразумевает построение текста программы по ее синтаксическому дереву или дереву разбора. Для каждого дерева существует множество различных текстовых представлений. Так, на рис. 1 приведен пример синтаксического дерева оператора ветвления языка C, а на рис. 2 различные текстовые представления этого дерева. Программный компонент, занимающийся форматированием, мы будем называть принтером. некоторому стандарту кодирования (СК, coding convension) — набору правил и соглашений, используемых при написании кода на соответствующем языке программирования. Так, стандарт кодирования для языка Java задает расположение фигурных скобок и операторов внутри тела функции, размер и формат отступов и др.
Одним из способов форматирования программных текстов является метод, основанный на синтаксических шаблонах [7]. Под шаблоном понимаются данные, сопоставление которых с элементом синтаксического дерева дает текстовое представление этого элемента (и его потомков).
На рис. 3, а представлен шаблон форматирования, который может быть применен к дереву разбора с рис. 1. На рис. 3, б представлен результат применения шаблона к этому дереву.
Список поддерживаемых принтер-плагином языков можно расширять. Для этого необходимо создать языкозависимую прослойку между ядром платформы и представлением синтаксического дерева, полученного в результате работы анализатора. Метод, описанный в [7], позволяет генерировать такую прослойку по языкозависимому описанию компонент принтера — классов, описывающих, как форматировать соответствующие элементы синтаксического дерева. Описание каждой компоненты принтера (component) является XML-файлом. Грамматика языка, которая используется в Grammar-Kit и по которой генерируется код синтаксического анализатора, содержит большую часть необходимой информации для создания этой языкозависимой прослойки. Поэтому принтер для целевого языка можно получать по грамматике этого языка.
В рамках этой работы были достигнуты следующие результаты:
• Предложен метод генерации декларативных принтеров по грамматике в форме Бэкуса-Наура.
• Реализован генератор принтеров в рамках проекта Grammar-Kit9.
• Добавлена возможность интеграции сгенерированных принтеров с принтер-плагином для IDE IntelliJ IDEA.
• Получен принтер для языка While, позволяющий форматировать программы на этом языке.
• Установлено, что не по любой грамматике языка можно получить корректный принтер. Представлены требования к грамматике.
1] F. Corbo, C. Del Grosso, M. Di Penta. Smart Formatter: Learning
Coding Style from Existing Source Code. –– ICSM, 2007.
[2] Klint P. A Meta-environment for Generating Programming
Environments. –– ACM Trans. Softw. Eng. Meth. 2, 2, p176-201,
1993.
[3] M.G.J. van den Brand, Visser E. Generation of Formatters for Contextfree Languages. –– ACM Trans. Softw. Eng. Meth. 5, 1, p1-41, 1996.
[4] Nielson F., Nielson H.R., Hankin C. Principles of Program Analysis. ––
Springer-Verlag New York Inc., 1999.
[5] Utkin A., Shein R., Kazakova A. Applying Genetic Algorithms to
Automatic Code Formatting. –– URL: https://blog.jetbrains.com/clion/
2015/11/applying-genetic-algorithms-to-automatic-code-formatting/
(online; accessed: 09.05.2016).
[6] Vollebregt T., Lennart C.L. Kats, Visser E. Declarative Specification
of Template-Based Textual Editors. –– Proceedings of the Twelfth
Workshop on Language Descriptions, Tools, and Applications. Article
No. 8, 2012.
[7] Подкопаев А.В., Коровянский А.Ю., Озерных И.С. Языконезависимое форматирование текстов программ на основе сопоставления с
образцом и синтаксических шаблонов. –– Научно-технические ведомости СПбГПУ 4’ (224), 2015.
[8] Хопкрофт Д., Мотвани Р., Ульман Д. Введение в теорию автоматов,
языков и вычислений, 2-е изд. : Пер. с англ. –– Москва, Издательский
дом «Вильямс», 2002