Разбор libclang создает неправильный вывод - PullRequest
4 голосов
/ 29 марта 2011

Я пытаюсь создать небольшую программу для синтаксического анализа с использованием 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, пока я не получу "первый оператор" - или "первое выражение" - узел?

1 Ответ

0 голосов
/ 19 мая 2014

Я получил ТУ так:

CXTranslationUnit TU = clang_parseTranslationUnit (Index, 0, argv, argc, 0, 0, CXTranslationUnit_None);

И затем я запускаю ваш тестовый пример (Node.h), получаю результат:

Начало: Строка: 3 Колонка: 1 Смещение: 14

Конец: Строка: 6 Колонка: 2 Смещение: 67

Начало: Строка: 4 Колонка: 5 Смещение: 32

Конец: Строка: 4 Колонка: 14 Смещение: 41

Начало: Строка: 5 Колонка: 5 Смещение: 47

Конец: Строка: 5 Колонка: 22 Смещение: 64

Начало: Строка: 5 Колонка: 12 Смещение: 54

Конец: Строка: 5 Колонка: 16 Смещение: 58

Я думаю, что результат правильный. Вы можете попробовать это так.

...