Можно ли извлечь информацию препроцессора из дерева разбора clang?

Рассмотрим следующий простой заголовок demo.h:

#define PERSIST
struct Serialised
{
int someTransientValue ;
PERSIST int aNumberToPersist ;
};

Я использую следующий код и Python API Clang для перебора заголовка:

import sys, clang.cindex
def callexpr_visitor(node, parent, userdata):
if node.location.file: print node.location.file, node.displayname, node.kind
return 2
tu = clang.cindex.Index.create().parse(sys.argv[1], args=['-x', 'c++'])
clang.cindex.Cursor_visit(tu.cursor, clang.cindex.Cursor_visit_callback(callexpr_visitor), None)

Это распечатывает элементы AST Clang, производя следующий вывод:

demo.h Serialized CursorKind.STRUCT_DECL
demo.h someTransientValue CursorKind.FIELD_DECL
demo.h aNumberToPersist CursorKind.FIELD_DECL

Кто-нибудь знает, как я могу извлечь объявление препроцессора, связанное с переменной-членом, называемой «aNumberToPersist»? Есть ли лучший способ «помечать» переменные таким образом, который четко проявляется в дереве разбора?

Xubuntu 12.04, clang версия 3.1 (tags / RELEASE_31 / final), цель: x86_64-unknown-linux-gnu
Модель резьбы: посикс.

6

Решение

Я бы, наверное, сказал: не так.

Макросы не представлены в AST как таковые. Типы, атрибуты и т.д … все те элементы, которые имеют семантический значения представлены (и комментарии), и при желании вы можете запросить, были ли некоторые из них расширены из макроса, и получить обратно это первоначальное написание макроса; однако сами по себе макросы в AST вообще не отображаются.

Если бы вы могли, это может быть более интересно простираться Лязг с новым атрибут, особенно в C ++ 11: [[gearoid::persist]], C ++ 11 требует, чтобы компиляторы игнорировали атрибуты, о которых они не знают, поэтому, «пространству имен» своих собственных атрибутов вы в значительной степени гарантируете, что только вы позаботитесь об их значении.

К сожалению, я не знаю, нужно ли вам обучать Clang своим атрибутам, чтобы они были представлены в AST (Майкл Хан работает над их запоминанием). В любом случае вы можете получить более полезные ответы на Clang DEV список рассылки (к сожалению, нет списка рассылки Clang Users).

РЕДАКТИРОВАТЬ: Просто приземлился сегодня! Clang теперь сохраняет все атрибуты (даже те, которые он не понимает) в своем AST.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector