SrcML
SrcML — это документно-ориентированное XML-представление исходного кода. Проект был создан в результате совместной работы Майкла Л. Колларда (Michael L. Collard) и Джонатана И. Малетика (Jonathan I. Maletic). Аббревиатура SrcML расшифровывается как Source Markup Language («язык разметки исходного кода»). SrcML оборачивает текст исходного кода структурной информацией из абстрактного синтаксического дерева (AST) в виде XML-тегов внутри одного документа. Вся исходная текстовая информация сохраняется, так что оригинальный файл исходного кода можно полностью восстановить по файлу SrcML, за исключением возможной нормализации символов перевода строки.
Что важно знать
| SrcML | |
|---|---|
| Разработчики | Michael L. Collard, Jonathan I. Maletic |
| Написана на | C, C++, Java |
| Лицензия | GPL |
| Сайт | srcml.org |
Описание
Цель 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.



