Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用clang AST解析器忽略缺少的头_C++_Clang_Abstract Syntax Tree - Fatal编程技术网

C++ 使用clang AST解析器忽略缺少的头

C++ 使用clang AST解析器忽略缺少的头,c++,clang,abstract-syntax-tree,C++,Clang,Abstract Syntax Tree,我在Windows上,使用MSVC编译我的项目,但我需要clang作为其整洁的AST解析器,它允许我编写一个小代码生成器。 问题是,clang无法解析MSVC头(这是一个众所周知且可以理解的问题) 我尝试了两种选择: 我包含MSVC头文件夹,解析代码中包含的内置头将在某个时候导致致命错误,阻止我正确解析所需的部分 我之前所做的只是不提供任何内置的头文件,而是向前声明我需要的类型。它工作得很好,但不知何故,它不再与最新的叮当声。我真的不知道是否丢失头的解析器策略发生了变化,但每次包含之类的内容并且

我在Windows上,使用MSVC编译我的项目,但我需要clang作为其整洁的AST解析器,它允许我编写一个小代码生成器。
问题是,clang无法解析MSVC头(这是一个众所周知且可以理解的问题)

我尝试了两种选择:

  • 我包含MSVC头文件夹,解析代码中包含的内置头将在某个时候导致致命错误,阻止我正确解析所需的部分
  • 我之前所做的只是不提供任何内置的头文件,而是向前声明我需要的类型。它工作得很好,但不知何故,它不再与最新的叮当声。我真的不知道是否丢失头的解析器策略发生了变化,但每次包含
    之类的内容并且没有太多的内容被解析时,它都会导致完全失败
  • 我使用Python绑定(LIbCLAN),但是如果有解决方案,我会考虑切换到C/C++ API。


    无论如何,我可以改变这个行为,即使在没有找到一些头时也能继续CLAN继续解析吗?< /P> < P>所以你想处理使用MS头的C++代码,并且你想要访问AST,这样你就可以生成代码了。而Clang不会处理MS头文件。 因此,除非它得到彻底升级,否则叮当声不可能是答案

    你问的是“任何能让这一切成功的解决方案”

    我们的智能手机可以做到这一点

    DMS提供一般解析、AST构造/检查/转换/生成和反向解析(将AST转换回可编译代码),这些都由语言定义参数化

    C++前端提供完整的C++ 14解析器、预处理器处理、AST构造、全名和类型解析。它已经用GCC和MS VS 2013头文件进行了测试;我们现在正在测试2015个头文件。 (它还处理MS VS 2013语法)

    完全处理了棘手的解析案例,包括C++著名的“最令人烦恼的解析”。您可以在中看到解析树

    DMS不提供Python绑定,也不提供直接C++接口。相反,它是一个独立的工具,旨在支持定制工具的构建(例如,您的“小代码生成器”)。它有自己非常广泛的内部API集,用类似LISP的元编程语言PARLANSE编码。DMS的其他方面通过使用DSL进行词法、语法和转换来管理。见下文

    一个警告词:任何处理C++的工具都是复杂的。DMS相对来说是复杂的,学习使用它需要一段时间,所以你不会马上得到答案。这里有个好消息 有些事情更容易做。您的代码生成问题 很可能是“读取一个骨架文件,然后用特定于问题的代码替换其中的关键条目”。如果是这样的话,一个带有以下代码的DMS工具(简化后在这里演示)可能会起到作用:

        ...
        (= myAST (Registry:ParseFile (. filename)  (. `CppVisualStudio2013') ...)
        (Registry:ApplyTransforms myAST (. `MyTransforms.rsl'))
        (Registry:PrettyPrint myAST (concat filename `.modified'))
        ...
    

    使用一个转换文件<强> MyToals.RSL<强>包含源表单语法(E.g,C++语法)概念表单

    的转换规则
            rule rulename if_you_see THIS then replace_by ("-->") THAT
    

    一个实际的C++规则可能看起来像这样(因为我不这样做) 了解您的实际代码生成目标)

    上面的ApplyTransforms调用将应用此文件中的所有规则,直到不再应用任何规则为止

    编写表面语法转换(如果可以的话)要比调用过程库(与Clang一样,DMS提供了过程库)简单得多

    您可以使用PARLANSE编写更复杂的元程序,在一个地方应用一些规则,在另一个地方应用其他规则,并且您可以将源代码到源代码的转换与直接在树上进行的过程转换混合使用(如果需要)


    如果您想了解有关转换的更多详细信息,请询问,我将提供一个链接。

    使用SetSuppressIncludeNotFoundError。我花了一个小时才找到!你可以想象我找到它是多么高兴


    忽略由于缺少标题而导致的错误的一种方法是在ASTFrontendAction的定义中将SetSuppressIncludeNotFoundError设置为true。下面给出了一个相同的示例

    {
    public:
        virtual std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(
            clang::CompilerInstance &Compiler, llvm::StringRef InFile)
        {
            Compiler.getPreprocessor().SetSuppressIncludeNotFoundError(true);
            return std::unique_ptr<clang::ASTConsumer>(
                new CustomASTConsumer(&Compiler.getASTContext()));
        }
    };
    
    {
    公众:
    虚拟std::唯一的\u ptr CreateASTConsumer(
    clang::CompilerInstance&Compiler,llvm::StringRef infle)
    {
    编译器.getPreprocessor().SetSuppressIncludeNotFoundError(true);
    返回std::unique\u ptr(
    新的CustomASTConsumer(&Compiler.getASTContext());
    }
    };
    

    有关使用ASTFrontendAction的完整示例,请访问

    您想知道可以解析MS标头的解决方案吗?任何解决方案都可以使其正常工作是的!那太好了,现在我要检查这个选项是否在python bindingshey@Martin中公开,我遇到了与头相同的问题,我遵循本教程创建一个重构工具。您知道我可以在哪里或如何使用
    ClangTool
    设置
    setuppressincludenotfounderror
    选项吗?@Andrespch问题的任何答案?
    {
    public:
        virtual std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(
            clang::CompilerInstance &Compiler, llvm::StringRef InFile)
        {
            Compiler.getPreprocessor().SetSuppressIncludeNotFoundError(true);
            return std::unique_ptr<clang::ASTConsumer>(
                new CustomASTConsumer(&Compiler.getASTContext()));
        }
    };