gpt4 book ai didi

c - 是否可以一次通过在线确定对象的类型,包括宏?

转载 作者:太空宇宙 更新时间:2023-11-03 23:37:11 25 4
gpt4 key购买 nike

我有一个非常简单的解析器,它提供了 C 语言的一小部分;它会查看一个格式良好的翻译单元,并通过一次通过并在线确定全局符号和类型(函数、结构、 union 、变量)是什么,如果有人不想欺骗它的话。但是,在这个示例中,我无法确定它是 struct 还是函数,

#define CAT_(x, y) x ## y
#define CAT(x, y) CAT_(x, y)
#define F_(thing) CAT(foo, thing)

static struct F_(widget) { int i; }

F_(widget);

static struct F_(widget) a(void) { int i;
return i = 42, F_(widget).i = i, F_(widget); }

int main(void) {
a();
return 0;
}

它假定括号是一个函数并以这种方式解析它,

[ID<stati>, ID<struc>, ID<F_>, LPAR<(>, ID<widge>, RPAR<)>, LBRA<{>, RBRA<}>].
[ID<F_>, LPAR<(>, ID<widge>, RPAR<)>, SEMI<;>].
[ID<stati>, ID<struc>, ID<F_>, LPAR<(>, ID<widge>, RPAR<)>, ID<a>, LPAR<(>, ID<void>, RPAR<)>, LBRA<{>, RBRA<}>].
[ID<int>, ID<main>, LPAR<(>, ID<void>, RPAR<)>, LBRA<{>, RBRA<}>].

事实上,它认为顶部的函数实际上是一个 struct 声明,顶部两个应该连接起来。识别这一点的最简单方法是什么?

  • 两次,模拟宏替换中实际发生的情况;我必须构建 C 预处理器的一个子集;
  • 喜欢the C lexer hack ,除了宏;
  • 以分号结尾回溯;这似乎很难;
  • 以某种方式在开始时识别出差异,(可能需要我将 struct 添加到我的符号表中。)

最佳答案

如评论中所述,如果您希望能够处理预处理器宏,则需要实现(或借用)预处理器。

编写预处理器主要涉及接受 C 标准中的正式描述,但在其他方面并不是特别具有挑战性。它可以在线完成,并将生成的 token 流馈送到解析器中,因此实际上不需要第二次传递。

(我想这取决于您如何定义“通过”,但在我的使用中,一次性解析器只读取一次输入,而无需创建和重新读取临时文件。这绝对是可行的。)

关于c - 是否可以一次通过在线确定对象的类型,包括宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56623189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com