Могу ли я получить дамп XML AST кода C / C ++ с помощью clang без использования компилятора? - PullRequest
23 голосов
/ 15 марта 2011

Мне удалось успешно скомпилировать clang для окон с помощью cmake и visual studio 10. Я хотел бы получить файл XML в качестве AST-представления исходного кода. Есть одна опция, которая предоставляет результат clang с gcc под linux (ubuntu), но не работает в окне windows:

clang -cc1 -ast-print-xml source.c

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

clang -emit-ast source.c

К сожалению, этот формат нельзя использовать напрямую для разбора. Есть ли какой-нибудь существующий метод для прямого генерирования дерева XML вместо двоичного в clang?

Цель состоит в том, чтобы использовать представление XML в других инструментах в среде .NET, поэтому мне нужно было бы обернуться вокруг собственной библиотеки clang для доступа к двоичному AST. Может быть, есть третий вариант, если кто-то уже написал какой-нибудь двоичный Clang-анализатор AST для .NET?

Возможно ли, что мне не хватает чего-то вроде того, если AST, сгенерированный интерфейсом clang, не эквивалентен тому, сгенерированному на этапе компиляции.

Ответы [ 3 ]

20 голосов
/ 18 марта 2011

Для вашей информации, принтер XML был удален из версии 2.9 Дугласом Грегором (ответственным за CLang FrontEnd).

Проблема заключалась в том, что отсутствовал принтер XML.Ряд узлов AST никогда не был реализован в принтере, а также ряд свойств некоторых узлов, что приводило к неточному представлению исходного кода.

Еще один момент, поднятый Дугласом, заключался в том, чтовывод должен быть пригоден не для отладки самого CLang (что и есть -emit-ast), а для потребления внешними инструментами.Это требует стабильности вывода от одной версии к другой.Примечательно, что это не должно быть внутреннее сопоставление CLang 1-на-1, а скорее перевод исходного кода на язык standardese .

Если на принтере нет значительной работы (для которой требуются добровольцы)) обратно не будет интегрировано ...

3 голосов
/ 02 июня 2014

Я работаю над собственной версией извлечения XML из AST Clang. Мой код использует Python-привязки libclang для обхода AST.

Мой код найден на https://github.com/BentleyJOakes/PCX

Редактировать: я должен добавить, что это довольно неполно с точки зрения создания правильных токенов исходного кода для каждого узла AST. К сожалению, это необходимо кодировать для каждого типа узла AST. Тем не менее, код должен дать основу для тех, кто хочет заниматься этим дальше.

1 голос
/ 08 января 2015

Использование пользовательского ASTDumper сделает эту работу без компиляции любого исходного файла.(остановите лязг в передней части).но вы должны иметь дело со всеми источниками кода на C и C ++ для llvm, чтобы достичь этого.

...