0

我想使用 clang 标记 cpp 文件:

// range = all the file
CXSourceLocation beginning = clang_getLocationForOffset(TU, file, 0);
CXSourceLocation end = clang_getLocationForOffset(TU, file, 53); // TODO : set actual file length
CXSourceRange range = clang_getRange(beginning, end);

clang_tokenize(TU, range, &tokens, &numTokens);

该代码有效,我可以看到实际的令牌。

我需要为此设置 CXSourceRange。就我而言,从头到尾始终是“所有文件”。是否有任何特殊值表示“所有文件”?否则我必须获取文件大小或硬编码任何实际值,如上例所示。

4

2 回答 2

4

你可以做

CXSourceRange range = clang_getCursorExtent(clang_getTranslationUnitCursor(TU));

获得覆盖整个翻译单元的范围。请参阅clang_getTranslationUnitCursor(...)clang_getCursorExtent(...)

例如,这个程序对作为参数给出的文件进行标记:

#include <clang-c/Index.h>
#include <iostream>

int main (int argc, char *argv[])
{
    if (argc != 2) {
        std::cerr << "Usage: tokenize <file>" << std::endl;
        return 1;
    }

    CXIndex index = clang_createIndex(0, 0);
    CXTranslationUnit TU = clang_parseTranslationUnit(index, 0, argv, argc, 0, 0, CXTranslationUnit_None);
    CXSourceRange range = clang_getCursorExtent(clang_getTranslationUnitCursor(TU));

    // Tokenize.
    CXToken *tokens;
    unsigned int numTokens;
    clang_tokenize(TU, range, &tokens, &numTokens);

    for (int i = 0; i < numTokens; ++i) {
        CXToken token = tokens[i];
        switch (clang_getTokenKind(token)) {
            case CXToken_Punctuation:
                std::cout << "CXToken_Punctuation" << std::endl;
                break;
            case CXToken_Keyword:
                std::cout << "CXToken_Keyword" << std::endl;
                break;
            case CXToken_Identifier:
                std::cout << "CXToken_Identifier" << std::endl;
                break;
            case CXToken_Literal:
                std::cout << "CXToken_Literal" << std::endl;
                break;
            case CXToken_Comment:
                std::cout << "CXToken_Comment" << std::endl;
                break;
            default:
                std::cout << "Unknown" << std::endl;
        }
    }

    clang_disposeTokens(TU, tokens, numTokens);
    clang_disposeTranslationUnit(TU);
    clang_disposeIndex(index);

    return 0;
}
于 2013-11-01T15:03:37.797 回答
1

任何大于文件大小的行号都可以使用。

CXSourceLocation end = clang_getLocationForOffset(TU, file, std::numeric_limits<unsigned>::max(), 1); 
于 2019-01-04T17:40:58.107 回答