Подтвердить что ты не робот

Могу ли я получить дамп 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, не эквивалентен тому, который был сгенерирован на этапе компиляции.

4b9b3361

Ответ 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.