libclang:如何获取令牌语义

libclang仅定义了5种令牌:

  • CXToken_Punctuation
  • CXToken_Keyword
  • CXToken_Identifier
  • CXToken_Literal
  • CXToken_Comment
  • 是否有可能获得有关令牌的更详细信息? 例如,对于以下源代码:

    struct Type;
    void foo(Type param);
    

    我希望输出如下所示:

  • 结构 - 关键字
  • 类型 - 类型名称
  • ; - 标点符号
  • 无效 - 类型/关键字
  • foo - 函数名称
  • ( - 标点符号
  • Type - 函数参数的类型
  • 参数 - 函数参数名称
  • ) - 标点符号
  • ; - 标点符号
  • 我还需要将这些实体映射到文件位置。


    首先,你可能需要一些关于解析工作的背景知识。 关于编译器的教科书将是一个有用的资源。 首先,该文件被转换成一系列令牌; 它给你标识符,标点符号等。这样做的代码称为词法分析器。 然后,解析器运行; 这将令牌列表转换为AST(结构化声明/表达式/等)。

    铿锵确实跟踪了声明和表达的各个部分,但不像你所描述的那样。 对于给定的函数声明,它会跟踪诸如函数名称的位置和参数列表的起始位置等事物,但它会根据文件中的位置而不是令牌来记录它们。

    CXToken只是一个令牌; 除了您列出的五种类型之外,没有任何其他关联的语义信息。 (你可以得到令牌的实际文本clang_getTokenSpelling ,并与位置clang_getTokenExtent 。) clang_annotateTokens给你CXCursor s,这让你检查的相关声明。

    请注意,一些细节不会被libclang API公开; 如果您需要更多细节,则可能需要使用clang的C ++ API。


    您正在寻找由libclang公开的令牌spellinglocation属性。 在C ++中,这些可以使用函数clang_getTokenLocation和clang_getTokenSpelling来检索。 这些函数的最小化使用(使用它们的python等价物将是:

    s = '''
    struct Type;
    void foo(Type param);
    '''
    
    idx = clang.cindex.Index.create()
    tu = idx.parse('tmp.cpp', args=['-std=c++11'],  unsaved_files=[('tmp.cpp', s)],  options=0)
    for t in tu.get_tokens(extent=tu.cursor.extent):
        print t.kind, t.spelling, t.location
    

    得到:

    TokenKind.KEYWORD struct <SourceLocation file 'tmp.cpp', line 2, column 1>
    TokenKind.IDENTIFIER Type <SourceLocation file 'tmp.cpp', line 2, column 8>
    TokenKind.PUNCTUATION ; <SourceLocation file 'tmp.cpp', line 2, column 12>
    TokenKind.KEYWORD void <SourceLocation file 'tmp.cpp', line 3, column 1>
    TokenKind.IDENTIFIER foo <SourceLocation file 'tmp.cpp', line 3, column 6>
    TokenKind.PUNCTUATION ( <SourceLocation file 'tmp.cpp', line 3, column 9>
    TokenKind.IDENTIFIER Type <SourceLocation file 'tmp.cpp', line 3, column 10>
    TokenKind.IDENTIFIER param <SourceLocation file 'tmp.cpp', line 3, column 15>
    TokenKind.PUNCTUATION ) <SourceLocation file 'tmp.cpp', line 3, column 20>
    TokenKind.PUNCTUATION ; <SourceLocation file 'tmp.cpp', line 3, column 21>
    
    链接地址: http://www.djcxy.com/p/94581.html

    上一篇: libclang: how to get token semantics

    下一篇: Exporting class with const member methods