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 に答える