C++ 使用clang作为库来解析用一些C++;元素

C++ 使用clang作为库来解析用一些C++;元素,c++,parsing,clang,opencl,C++,Parsing,Clang,Opencl,我目前正在开发一个源代码到源代码编译器,它将OpenCL超集中的代码wirtten转换为“普通”OpenCL。我真的很想使用clang作为一个库来解析和分析源代码。特别是,我真的需要所有可用的类型信息,我希望有一个AST来利用clang的重写功能 幸运的是,需要解析的OpenCL超集实际上是OpenCL和C++之间的“混合”,即代码基本上是用一些C++的东西扩展OpenCL。具体来说,函数定义之前可能有模板注释,也可能有包含方法(包括运算符定义)的结构 我希望我可以使用clang来解析这种语言,

我目前正在开发一个源代码到源代码编译器,它将OpenCL超集中的代码wirtten转换为“普通”OpenCL。我真的很想使用clang作为一个库来解析和分析源代码。特别是,我真的需要所有可用的类型信息,我希望有一个AST来利用clang的重写功能

幸运的是,需要解析的OpenCL超集实际上是OpenCL和C++之间的“混合”,即代码基本上是用一些C++的东西扩展OpenCL。具体来说,函数定义之前可能有模板注释,也可能有包含方法(包括运算符定义)的结构

我希望我可以使用clang来解析这种语言,因为clang解析器能够解析所有这些结构。然而,我不知道如何(如果可能的话)告诉CLAN,以立即解析OpenCL和C++的构造。如果可能的话,我真的希望避免接触到clang代码库,但是我更喜欢使用clang作为库。也许可以为clang的LangOptions类设置一个适当的实例,告诉clang解析所有这些构造


对如何在OpenCL和C++之间进行混合解析有什么想法?感谢您的帮助,并提前表示感谢

您试图混合使用两种不同的前端,包括解析和名称解析

我想你的旅行会很艰难。关键的问题是,你正在试图把那些不费吹灰之力的东西粘在一起,使它们可以粘合。这通常会导致集成地狱。你不知道人们用FORTRAN和C++做同样的原因。

首先,您将发现您必须定义C++扩展与OPENCL的交互方式的语义。如果你检查C++标准,你会发现600页的结果,关于C++如何与自身交互的委员会争论。因此,除非您能够定义一个非常简单的交互,否则您将很难了解混合OpenCL/C++程序的含义

您的第二个问题是将C++的CLAN解析机制(AAFAIK手写代码)与OpenCL的CLAN解析机制交错(不知道它,但假设它遵循C++风格)。没有明显的好理由相信你可以简单地挑选它们进行交错。它可能会很好;只是我不想打赌

您可能遇到的下一个问题是为联合语言构建AST。可能是Clang已经以C++的形式定义了AST节点,并且很容易将其组合成一个联合CLAN/OpenCL树。由于节点类型是手工选择的,并且没有具体的理由将它们设计为一起工作,因此也不清楚它们是否能够很好地组合

您的最后一个任务是,给定一个“有效”的OpenCL/C++树,将其转换为OpenCL。事实上,你如何将C++模板(或任何通用C++代码)扩展到OpenCL代码?

检查我的BIO为另一个系统,DMS,这可能会对这个任务有点好;它提供了统一语言的基础设施,使一些更容易。有些类似于你正在尝试做的,我们使用DMS混合C++与F90和APL概念,以便于在矢量C++原型中容易地表达向量操作,但是出于上述原因,我们没有完全保留F90和APL语法和语义]


我的目的不是要冒昧地进行游行,而是由不讲理的人来做。只是要确保你理解你的任务有多大。< / P>解析器的工作方式是,它是一个大的分析器,它有部分检查语言是C++,处理一些C++特定的东西,或者当前语言是C11,然后处理。ME C11具体的东西,等等,我觉得在CLAN中同时启用C++和OpenCL是可能的。问题是它可能根本没有在那个配置中被测试。@ BAMES53:这正是我所希望的……我已经读过了CLAN的手写体分析器的一部分,正如你所说的。然而,Ira Baxter已经提到了一些有效的理由,为什么解析OpenCL和C++同时可能是相当复杂的,为什么CLAN可能不支持它以任何有意义的方式…