我目前正在研究一种源到源编译器,它将OpenCL超集中的代码转换为"普通" OpenCL的。我真的想用clang作为库来解析和分析源代码。特别是,我真的需要所有可用的类型信息,我希望有一个AST来使用clang的重写功能。
幸运的是,需要解析的OpenCL超集实际上是一个"混合物"在OpenCL和C ++之间,即代码基本上是用一些C ++扩展的OpenCL。详细地说,在函数定义之前可能存在模板注释,并且可能存在包含方法的结构(包括运算符定义)。
我希望我可以使用clang来解析这种语言,因为clang解析器能够解析所有这些结构。但是,我不确定如何(如果可能的话)告诉clang立即解析OpenCL和C ++构造。如果可能的话,我真的想避免触及clang代码库,但我更喜欢使用clang代替库。也许有可能设置一个clang的LangOptions类的适当实例,告诉clang解析所有这些结构?
关于如何让clang在OpenCL和C ++之间解析这种混合的任何想法?任何帮助表示赞赏,并提前感谢!
答案 0 :(得分:2)
你试图混合两个不同的前端,包括解析和名称解析。
我认为你是一个艰难的旅程。关键问题是你试图将没有花费的东西粘在一起,使它们变得可胶合。这通常会导致整合地狱。你没有看到人们出于同样的原因使用Fortran和C ++这样做。
首先,您将发现必须定义C ++扩展如何与OpenCL交互的语义。如果您查看C ++标准,您将从委员会论证中发现600页的结果,了解C ++如何与自身交互。因此,除非您能够定义极其简单的交互,否则您将很难知道混合的OpenCL / C ++程序意味着什么。
你的第二个问题是将C ++的Clang解析机制(AFAIK手写代码)与OpenCL的Clang解析机制交错(对它没有任何了解,但假设它遵循C ++风格)。没有明显的理由相信你可以选择这些来轻松交错。它可能会很好;这不是我想要做的赌注。
您可能遇到麻烦的下一个地方是为联合语言构建AST。也许是这样的情况,Clang已经为C ++和OpenCL定义了AST节点,其方式很容易组成一个联合的Clang / OpenCL树。由于节点类型是手工选择的,并且没有特定的理由将它们设计为一起工作,因此它们的组合也不是很明显。
给定“有效”OpenCL / C ++树的最后一项任务是将其转换为OpenCL。实际上你如何将C ++模板(或任何通用C ++代码)扩展为OpenCL代码?
[检查我的生物体系中的另一个系统,DMS,这可能对这个任务更好一点;它为多种语言提供统一的基础设施,使其中的一些更容易。与您尝试做的有些类似,我们使用DMS将C ++与F90和APL概念混合,以便在原型Vector C ++中轻松表达向量操作,但我们并未尝试为所有人保留F90和APL语法和语义。以上原因]。
在你的游行中下雨不是我的目的;无理的人取得了进步。只要确保你了解自己正在承担多大的任务。