我在考虑源到源编译器想要在标准C语法中添加关键字(比如 shared )。当指针被标记为 shared 时,它是一个特殊的指针,不能直接解除引用。相反,应该进行函数调用以安全地复制该值。
如果所有变量都是原始类型,那么一个简单的C ++程序就可以为我做翻译。但是,我们有结构和联合,然后我们有可能像struct包含共享指针,struct包含指向共享指针的简单指针等。这听起来像一个严重的类型检查,如处理 volatile 关键字,可能重用或修改现有的编译器是一个更好的选择。但我不知道哪个编译器更容易开始修改。你有什么建议吗?顺便说一句,我想看到翻译的C代码,而不是中间代码。它会改变我们的选择吗?谢谢。
答案 0 :(得分:2)
您是否了解不透明类型?在.h
文件中声明一个类型:
typedef struct OpaqueType_s OpaqueType;
并在.c
文件中定义:
struct OpaqueType_s {
int value;
};
然后你可以在.c
文件中取消引用它的指针
你定义它,但只将它们传递给其他文件中的其他函数
(有点像void
)。
答案 1 :(得分:-1)
我们的DMS Software Reengineering Toolkit及其C Front End可能合适。
DMS提供通用解析/ AST构造,符号表构造,控制和数据流分析工具,程序API和AST修改的表面语法重写规则,以及AST到可编译的文本重新生成(包括注释重新生成)。前端将DMS专用于特定语言(例如,C; DMS支持许多其他语言)。前端由BNF驱动;一切都建立在它之上(使用属性语法等)。方言管理使语言前端能够专门用于特定方言(对于C,目前包括GCC2 / 3/4,MS Visual C,ANSI C,GreenHills C,C99等)。
为了执行OP的任务,他将为他的C版本定义一个方言,修改前端提供的符号表机制以捕获指针上的新属性,并修改类型检查以验证新的指针类型不是被他的定义误用了。通过类型检查,他可以编写源到源的转换,将shared-ptrC转换为vanilla C,以获得可运行的代码。
替代方案可能是使用Clang或GCC,但我的理解是它们都没有语法,所以对解析器的更改必须实现为代码。两者都没有提供任何源到源的重写。 Clang我认为提供源补丁但我不确定你可以在修补后对一个地方应用一系列重写。 GCC我认为会让你在程序上修改AST,但不能重新生成源代码。
所有这些解决方案在预处理方面都存在一些问题。 Clang和GCC我认为必须扩展预处理器指令。 DMS必须扩展非结构化指令。