Enr*_*ico 5 parsing llvm clang
我正在尝试使用 libclang 构建一个小型解析程序。
要解析的源文件(Node.h):
#pragma once
struct Node {
int value;
struct Node *next;
};
Run Code Online (Sandbox Code Playgroud)
主程序简单地调用 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;
}
Run Code Online (Sandbox Code Playgroud)
访客:
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;
}
Run Code Online (Sandbox Code Playgroud)
然而,输出显示了一些奇怪的部分:
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)
Run Code Online (Sandbox Code Playgroud)
这是从哪里来的?
删除该编译指示时,没有任何变化。对于要解析的完全空的头文件也会发生同样的情况。
我是否必须绕过 AST 中找到的所有节点,直到获得“第一个语句”或“第一个表达式”节点?
我得到的 TU 是这样的:
CXTranslationUnit TU = clang_parseTranslationUnit(索引, 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
我认为结果是正确的。你可以这样尝试一下。
| 归档时间: |
|
| 查看次数: |
1321 次 |
| 最近记录: |