Clang 如何构造只使用语法的匹配查找工具?
我正在构建一个基于ASTMatcher的工具,我想在我的源代码中运行它:Clang 如何构造只使用语法的匹配查找工具?,clang,abstract-syntax-tree,clang-ast-matchers,Clang,Abstract Syntax Tree,Clang Ast Matchers,我正在构建一个基于ASTMatcher的工具,我想在我的源代码中运行它: int main(int argc, const char** argv) { CommonOptionsParser OptionsParser(argc, argv, MyToolCategory); ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList());
int main(int argc, const char** argv) {
CommonOptionsParser OptionsParser(argc, argv, MyToolCategory);
ClangTool Tool(OptionsParser.getCompilations(),
OptionsParser.getSourcePathList());
MatchFinder Finder;
// Repeated calls to Finder.addMatcher(...);
Tool.run(newFrontendActionFactory(&Finder).get());
// Handle the results of the matching.
}
在依赖于其他标头的源文件上运行此操作会产生以下错误:
~$ /path/to/my/tool /path/to/my/file.cpp --
/path/to/my/file.cpp:8:10: fatal error: 'string' file not found
#include <string>
^~~~~~~~
1 error generated.
Error while processing /path/to/my/file.cpp.
我注意到在中有一个clang::SyntaxOnlyAction
。然而,我一直无法理解如何将MatchFinder
和SyntaxOnlyAction
结合使用。同样,我已经能够从同一文件的命令行进行AST转储,没有问题,因此我知道这是可能的
是否可以将基于MatchFinder的工具配置为仅支持语法行为?语法检查是否仍会涉及处理
#include
?(如果标题显示typedef int foo;
与如果标题显示#define foo 3+
,则类似foo bar;
的内容的含义完全不同)@ruakh我可以使用foo
进行输出,而不知道其基本类型是什么。这就是仅语法检查的要点,据我所知:它能够验证语法,即使头包含解析器以前没有见过的类型。@ruakh我同意语法可能被误解。我感兴趣的是能够匹配和处理与-fsyntax only-ast dump
标志相同的遍历。您使用-fsyntax only-ast dump
标志看到的遍历将取决于包含的头的内容。我认为Clang不支持在不阅读标题的情况下尝试“猜测”如何解释语法。老实说,我不知道,但如果没有其他支持的话,您似乎应该能够通过检查Clang\u getCursorLocation
来筛选自己的匹配器代码,以确定您所在的文件。(您必须决定如何处理在包含中拆分的节点;希望这种情况很少发生。)
~$ /path/to/my/tool /path/to/my/file.cpp -- -fsyntax-only