Могу ли я получить дамп XML AST C/С++ с clang без использования компилятора?
Мне удалось успешно скомпилировать clang для окон с cmake и visual studio 10. Я хотел бы получить XML файл как представление AST исходного кода. Существует один вариант, который дает результат с clang с gcc под linux (ubuntu), но не работает в окне окна:
clang -cc1 -ast-print-xml source.c
Однако это вызывает этап компиляции (чего я бы хотел избежать). Копание в исходном коде не помогло мне, поскольку я совершенно новичок в clang. Мне удалось создать двоичную версию AST, используя:
clang -emit-ast source.c
К сожалению, этот формат неприменим непосредственно для разбора. Есть ли какой-нибудь существующий метод для прямого генерации дерева XML вместо двоичного в clang?
Цель состоит в том, чтобы использовать представление XML в других инструментах в среде .NET, поэтому мне нужно будет сделать некоторую обертку вокруг родной clang lib для доступа к бинарному AST. Может быть, есть третий вариант, если кто-то уже написал некоторый бинарный анализатор AST для .NET?
Возможно ли, что я упустил что-то вроде, если AST, созданный передним концом clang, не эквивалентен тому, который был сгенерирован на этапе компиляции.
Ответы
Ответ 1
Для вас информация, XML-принтер был удален из версии 2.9 Дугласом Грегором (ответственным за CLang FrontEnd).
Проблема заключалась в отсутствии XML-принтера. Ряд узлов AST никогда не был реализован в принтере, а также ряд свойств некоторых узлов, что привело к неточному представлению исходного кода.
Еще один момент, поднятый Дугласом, заключался в том, что вывод должен быть подходящим не для отладки самого CLang (что и есть -emit-ast
), а для потребления внешними инструментами. Для этого требуется, чтобы выход был стабильным с одной версии на другую. Примечательно, что это не должно быть однократное отображение CLang внутри, а скорее перевод исходного кода на стандартный язык.
Если на принтере нет существенной работы (что требует добровольцев), он не будет интегрирован обратно...
Ответ 2
Я работал над своей собственной версией извлечения XML из Clang AST. Мой код использует привязки Python libclang для прохождения AST.
Мой код находится в https://github.com/BentleyJOakes/PCX
Изменить: я должен добавить, что он довольно неполный с точки зрения создания правильных токенов исходного кода для каждого AST node. Это, к сожалению, необходимо кодировать для каждого типа AST node. Тем не менее, код должен дать основание для всех, кто хочет продолжить это.
Ответ 3
Использование пользовательского ASTDumper выполнит задание без компиляции любого исходного файла. (остановите clang в передней части). но для этого вам нужно иметь дело со всеми источниками кода C и С++ для llvm.