Использование libclang для разбора в C++ в Python
После некоторого исследования и нескольких вопросов я закончил изучать библиотеку libclang для анализа исходных файлов C++ в Python.
Учитывая источник C++
int fac(int n) {
return (n>1) ? n∗fac(n−1) : 1;
}
for (int i = 0; i < linecount; i++) {
sum += array[i];
}
double mean = sum/linecount;
Я пытаюсь идентифицировать токены fac
как имя функции, n
как имя переменной, i
как имя переменной, mean
в качестве имени переменной вместе с каждой позицией. Я заинтересован в том, чтобы со временем их пометить.
Я прочитал несколько очень полезных статей ( Эли, Гаэтана), а также некоторые вопросы о переполнении стека 35113197, 13236500.
Тем не менее, учитывая, что я новичок в Python и изо всех сил пытаюсь понять основы libclang, я был бы очень признателен за пример кода, который реализует вышеупомянутое, чтобы я мог его понять и понять.
1 ответ
Из API libclang не сразу становится ясно, какой подход к извлечению токена является подходящим. Однако редко когда вам понадобится (или вы захотите) опуститься до этого уровня - слой курсора, как правило, гораздо полезнее.
Однако, если это то, что вам нужно - минимальный пример может выглядеть примерно так:
import clang.cindex
s = '''
int fac(int n) {
return (n>1) ? n*fac(n-1) : 1;
}
'''
idx = clang.cindex.Index.create()
tu = idx.parse('tmp.cpp', args=['-std=c++11'],
unsaved_files=[('tmp.cpp', s)], options=0)
for t in tu.get_tokens(extent=tu.cursor.extent):
print t.kind
Который (для моей версии Clang) производит
TokenKind.KEYWORD
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.KEYWORD
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.PUNCTUATION
TokenKind.KEYWORD
TokenKind.PUNCTUATION
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.LITERAL
TokenKind.PUNCTUATION
TokenKind.PUNCTUATION
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.IDENTIFIER
TokenKind.PUNCTUATION
TokenKind.LITERAL
TokenKind.PUNCTUATION
TokenKind.PUNCTUATION
TokenKind.LITERAL
TokenKind.PUNCTUATION
TokenKind.PUNCTUATION