Я пытаюсь создать небольшую программу для синтаксического анализа с использованием libclang.
Исходный файл для анализа (Node.h):
#pragma once
struct Node {
int value;
struct Node *next;
};
Простая основная программа вызывает парсер clang и обходит все элементы в AST:
int main(int argc, char *argv[]) {
CXIndex index = clang_createIndex(0, 0);
const char *filename = "Node.h";
CXTranslationUnit TU = clang_parseTranslationUnit(index, filename, NULL, 0, NULL, 0, CXTranslationUnit_None);
CXCursor rootCursor = clang_getTranslationUnitCursor(TU);
clang_visitChildren(rootCursor, printVisitor, NULL);
clang_disposeTranslationUnit(TU);
clang_disposeIndex(index);
return 0;
}
Посетитель:
CXChildVisitResult printVisitor(CXCursor cursor, CXCursor parent, CXClientData client_data) {
CXSourceRange range = clang_getCursorExtent(cursor);
CXSourceLocation startLocation = clang_getRangeStart(range);
CXSourceLocation endLocation = clang_getRangeEnd(range);
CXFile file;
unsigned int line, column, offset;
clang_getInstantiationLocation(startLocation, &file, &line, &column, &offset);
printf("Start: Line: %u Column: %u Offset: %u\n", line, column, offset);
clang_getInstantiationLocation(endLocation, &file, &line, &column, &offset);
printf("End: Line: %u Column: %u Offset: %u\n", line, column, offset);
return CXChildVisit_Recurse;
}
Однако в выводе отображаются некоторые странные детали:
Start: Line: 99 Column: 9 Offset: 3160
End: Line: 99 Column: 122 Offset: 3273
Kind: A field (in C) or non-static data member (in C++) in a struct.
Filename: (null)
Откуда это взялось?
При удалении прагмы ничего не меняется,То же самое происходит с полностью пустым файлом заголовка для разбора.
Нужно ли обходить все найденные узлы в AST, пока я не получу "первый оператор" - или "первое выражение" - узел?