libclang:如何获取令牌语义

pio*_*kg2 10 c++ libclang

libclang只定义了5种类型的令牌:

  • CXToken_Punctuation
  • CXToken_Keyword
  • CXToken_Identifier
  • CXToken_Literal
  • CXToken_Comment

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

struct Type;
void foo(Type param);
Run Code Online (Sandbox Code Playgroud)

我希望输出如下:

  • struct - keyword
  • 类型 - 类型名称
  • ; - 标点符号
  • void - 类型/关键字
  • foo - 函数名称
  • ( - 标点符号
  • 类型 - 函数参数的类型
  • param - 函数参数名称
  • ) - 标点符号
  • ; - 标点符号

我还需要将这些实体映射到文件位置.

Eli*_*man 7

首先,您可能需要一些关于解析如何工作的背景知识.关于编译器的教科书将是一种有用的资源.首先,将文件转换为一系列令牌; 它为您提供标识符,标点符号等.执行此操作的代码称为词法分析器.然后,解析器运行; 这会将令牌列表转换为AST(结构化声明/表达式等).

clang确实跟踪声明和表达式的各个部分,但不是你所描述的方式.对于给定的函数声明,它会跟踪函数名称的位置和参数列表的开头之类的内容,但它会根据文件中的位置保留这些内容,而不是令牌.

A CXToken只是一个象征; 除了列出的五种类型之外,没有任何其他相关的语义信息.(您可以获取令牌的实际文本clang_getTokenSpelling,并使用位置clang_getTokenExtent.) clang_annotateTokens为您提供CXCursors,它可以让您检查相关的声明.

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