Clang 如何构造只使用语法的匹配查找工具?

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());

我正在构建一个基于ASTMatcher的工具,我想在我的源代码中运行它:

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