2

I am thinking of a source-to-source compiler would like to add a keyword to the standard C grammar (say shared). When a pointer is being marked as shared, it is a special one not to be dereferenced directly. Instead, a function call should be made to copy out the value safely.

If all variables were primitive types, a simple C++ program would do the translation for me. However, we have struct and union, and then we have possibilities like struct containing shared pointers, struct containing simple pointers to shared pointers, etc. It sounds a serious type checking like handling the volatile keyword, probably reusing or modifying an existing compiler would be a better option. But I do not know which compiler is easier to start modifying. Do you have any suggestions? By the way, I want to see the translated C code, not the intermediate code. Would it change our choice? Thank you.

4

2 回答 2

2

你知道不透明类型吗?在文件中声明一个类型.h

typedef struct OpaqueType_s OpaqueType;

并将其定义在一个.c文件中:

struct OpaqueType_s {
   int value;
};

然后您可以在定义它的文件中取消引用指向它的指针.c,但只将它们传递给其他文件中的其他函数(有点像void)。

于 2012-07-03T08:18:18.300 回答
-1

我们的带有C 前端的DMS 软件再造工具包可能是合适的。

DMS 提供通用解析/AST 构造、符号表构造、控制和数据流分析工具、用于 AST 修改的过程 API 和表面语法重写规则,以及 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 必须扩展非结构化指令。

于 2012-07-03T08:03:44.290 回答