【问题标题】:Adding a keyword to standard C grammar向标准 C 语法添加关键字
【发布时间】:2012-07-03 07:27:27
【问题描述】:

我正在考虑一个源到源编译器想在标准 C 语法中添加一个关键字(比如 shared)。当一个指针被标记为 shared 时,它是一个特殊的指针,不能直接取消引用。相反,应该调用函数来安全地复制出该值。

如果所有变量都是原始类型,那么一个简单的 C++ 程序就会为我完成翻译。但是,我们有 struct 和 union,然后我们有可能包含共享指针的结构,包含指向共享指针的简单指针的结构等。这听起来像处理 volatile 关键字的严肃类型检查,可能重用或修改现有编译器将是更好的选择。但是我不知道哪个编译器更容易开始修改。你有什么建议吗?顺便说一句,我想查看翻译后的 C 代码,而不是中间代码。它会改变我们的选择吗?谢谢。

【问题讨论】:

  • 你将如何标记负责取消引用每个此类指针的函数?
  • @unwind:如果 shared 像提问者所建议的那样被视为 cv 限定符,那么大概是你投了。对提问者:这不能回答您的问题,但为什么不为您想要的每种类型 Foo 转发声明 struct shared_Foo; 呢?然后shared_Foo* 不能被取消引用,而是被任何应该取消引用的人转换为Foo*。通常,当人们需要不透明的指针时,他们很乐意拥有一些可以使用它们的 TU,而另一些则不能。所以他们甚至不需要shared_Foo,他们只需在标头中前向声明struct Foo 并在.c 文件中定义它。
  • “标准 C 语法”?实践中不存在:-{很多变种。
  • 至于关键字部分,我建议添加一个属性(和#define 你的“关键字”),这是一种更容易做到的方式。应该可以在 clang 级别实现您的分析,但使用中间代码 (llvm ir) 更容易,它本质上是一种逃逸分析。如果您(使用元数据)跟踪所有指针的来源,则可以将分析传播回 AST 级别并发出转换后的代码。

标签: c gcc clang


【解决方案1】:

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

typedef struct OpaqueType_s OpaqueType;

并在.c 文件中定义它:

struct OpaqueType_s {
   int value;
};

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

【讨论】:

    【解决方案2】:

    我们的DMS Software Reengineering Toolkit 及其C Front End 可能是合适的。

    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 必须扩展非结构化指令。

    【讨论】:

    • 我们有一个打了就跑的选民标记答案,但没有提供关于投诉的评论反馈。我得到了很多。我怀疑这是因为 DMS 的商业性质。虽然我知道有人可能出于个人原因不使用商业产品,但这似乎不是反对答案的糟糕理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多