SrcML

SrcML — это документно-ориентированное XML-представление исходного кода. Проект был создан в результате совместной работы Майкла Л. Колларда (Michael L. Collard) и Джонатана И. Малетика (Jonathan I. Maletic). Аббревиатура SrcML расшифровывается как Source Markup Language («язык разметки исходного кода»). SrcML оборачивает текст исходного кода структурной информацией из абстрактного синтаксического дерева (AST) в виде XML-тегов внутри одного документа. Вся исходная текстовая информация сохраняется, так что оригинальный файл исходного кода можно полностью восстановить по файлу SrcML, за исключением возможной нормализации символов перевода строки.

Что важно знать

Описание

Цель SrcML — предоставить полный доступ к исходному коду на лексическом, документарном, структурном и синтаксическом уровнях. Формат также упрощает извлечение информации (fact extraction) и трансформацию кода. За поддержкой продукта и набором утилит следят разработчики на официальном сайте, демонстрируя масштабируемые и легковесные решения для анализа и преобразования кода.[1]

Набор инструментов srcML

В состав набора инструментов srcML входит консольная программа srcml, которая конвертирует исходный код в формат srcML при указании файла с кодом или выполняет обратное преобразование из srcML-файла в исходный код при подаче архива srcml на вход. Программа поддерживает прямые запросы и преобразования архивов srcML с использованием утилит XPath, XSLT и RELAXNG. Набор активно развивается и поддерживает языки программирования C, C++, C# и Java.

Формат srcML

Формат srcML включает в себя весь исходный текстовый контент файла плюс XML-теги. Текст оборачивается в элементы srcML, детерминирующие синтаксическую структуру кода; таким образом явно маркируются все синтаксические конструкции.

Ниже приведён список категорий тегов srcML и соответствующих элементов:

Категория Элементы srcML
Файл/Проект unit
Оператор asm, block, break, case, comment, condition, constraint, continue, decl, decl_stmt, default, do, else, empty_stmt, enum, expr, expr_stmt, extern, for, goto, if, incr, index, init, label, macro, name, namespace, range, requires, switch, template, then, type, typedef, using, while
Функция/Метод argument, argument_list, call, function, function_decl, param, parameter_list, return, specifier
Класс class, class_decl, constructor, constructor_decl, destructor, destructor_decl, friend, member_list, private, protected, public, super
Структура и объединение struct, struct_decl, union, union_decl
Исключения catch, throw, throws, try
Препроцессор C cpp:define, cpp:directive, cpp:elif, cpp:endif, cpp:error, cpp:file, cpp:if, cpp:ifdef, cpp:ifndef, cpp:include, cpp:line, cpp:pragma, cpp:undef
K&R C krparam, krparameter_list
Java extends, finally, implements, import, package
Дополнительная разметка lit:literal, type:modifier, op:operator
Отладка marker, mode, parse
Разное escape

SrcML использует пространства имён XML. Префиксы и соответствующие пространства имён приведены ниже:

Префикс Пространство имён
src http://www.srcml.org/srcML/src
cpp http://www.srcml.org/srcML/cpp
pos http://www.srcml.org/srcML/position
lit http://www.srcml.org/srcML/literal
err http://www.srcml.org/srcML/srcerr

Примечание: для архива srcML весь проект размещён внутри корневого элемента unit, а каждый файл — в отдельном элементе unit внутри корня.

Конвертация одиночного файла

Пример использования srcml для конвертации отдельного файла:

Следующая команда преобразует файл main.cpp (C++) в файл srcML main.cpp.xml:

srcml main.cpp -o main.cpp.xml

Следующая команда извлекает исходный код из файла main.cpp.xml в файл main.cpp:

srcml main.cpp.xml -o main.cpp

Конвертация проекта

Пример использования srcml для конвертации всего проекта:

Команда для преобразования проекта с каталогом project в файл srcML project.xml:

srcml project -o project.xml

Следующая команда извлекает исходные файлы проекта из project.xml в директорию project:

srcml —to-dir project project.xml

Трансформация программ с помощью srcML

SrcML позволяет использовать большинство современных XML-API и инструментов для написания трансформаций, включая прямое применение XSLT с помощью аргумента —xslt={имя}.xsl для инструмента srcml2src. Разметка srcML и XSLT позволяют осуществлять преобразования программ по структурам на основе XML, затем возвращая результат обратно в исходный код через srcml2src. Применение srcML к трансформациям программ описано в работе Колларда и др.

Пример с XSLT: выполнение XSLT-программы program.xsl над архивом srcML project.xml:

srcml —xslt program.xsl project.xml

Извлечение информации (fact extraction) с помощью srcML

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

Пример команды для XPath-запроса к архиву srcML project.xml:

srcml —xpath "xpath" project.xml

Разрабатываются и более удобные расширения.

Анализ различий исходного кода с использованием srcML

SrcML предоставляет широкий спектр возможностей для анализа различий в исходном коде, в том числе для сравнения отдельных разделов и разных версий проектов. Применение srcML для дифф-анализа рассматривается у Малетика и др.

Примеры

Пример выражения XPath для нахождения всех классов в исходном файле:

//src:class

Пример запроса на поиск всех комментариев внутри функций:

/src:function//src:comment

Поскольку srcML построен на основе XML, совместимы все стандартные инструменты для работы с XML.

Примечания

Ссылки