libclang解析生成错误的输出

时间:2011-03-29 09:58:21

标签: parsing llvm clang

我正在尝试使用libclang构建一个小的解析程序。

要解析的源文件(Node.h):

#pragma once

struct Node {
    int value;
    struct Node *next;
};

主程序simple调用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)

这是从哪里来的?

删除pragma时,没有任何变化。一个完全空的头文件要解析也是如此。

我是否必须绕过AST中所有找到的节点,直到我得到“第一个语句” - 或“第一个表达式”-node?

1 个答案:

答案 0 :(得分:0)

我得到了这样的TU:

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

我认为结果是正确的。你可以这样试试。