自动生成C结构体构造函数吗?
我想实现一种新的语言,我想用C语言来完成它,着名的flex + yacc组合。嗯,事情是,编写整个AST代码非常耗时。有没有一种工具可以自动生成结构的构造函数?自动生成C结构体构造函数吗?
我想有以下行为的东西:
输入:
enum AgentKind {A_KIND1, A_KIND2};
typedef struct Agent_st
{
enum AgentKind kind;
union {
struct {int a, b, c} k1;
struct {int a, GList* rest} k2;
} u;
} Agent;
输出:
Agent* agent_A_KIND1_new(int a, b, c)
{
Agent* a = (Agent*)malloc(sizeof(Agent));
a->kind = A_KIND1;
a->k1.a = a;
...
...
return a;
}
Agent* agent_A_KIND2_new(int a, GList* rest)
{ ... }
谢谢!
那么,由于没有工具,我决定今天下午编写代码。 我开始看起来像一个不错的项目,我想继续它。
我在Haskell中编写了一个基于内置haskell类型的稍微简单的(只是一堆嵌套在IO monad中的嵌套折叠)代码生成器。
的AST类型声明:
C代码发生器,基于所述AST声明:
并将所产生的结果是:
有人不爱Haskell? :)
ps:我编码,因为我目前正在研究的项目将在不久的将来承受巨大的变化,而这些变化将无效AST,因此迫使我编码另一个AST模块... 现在我可以做得非常快!
感谢您的答案。
我真的没有时间学习Haskell(或类似的语言),但在我看来,函数式语言对于编译器来说是非常好的。 – 2012-02-17 06:19:27
@JoachimPileborg,不完全正确。一些非常简单的任务,例如全局累加器,可能会在函数式编程中出现令人头痛的问题,但对于简单或任何通过复杂数据结构遍历的任何事情来说,这都非常好! – Victor 2012-02-17 10:52:14
您可能可以通过巧妙使用预处理器宏来获得某些东西。
第一头文件:
#ifndef AST_NODE
# define AST_NODE(token) \
struct AST_ ## token \
{ \
int kind; \
};
#endif
AST_NODE(TokenType1)
AST_NODE(TokenType2)
然后将源文件:
#define AST_NODE(token) \
struct AST_ ## token *AST_ ## token ## _new() \
{ \
struct AST_ ## token *node = malloc(sizeof(AST_ ## token); \
node->kind = token; \
return node; \
}
#include "ast.h"
如果您在任何其它文件中的 “ast.h” 文件,你将有两种结构:AST_TokenType1
和AST_TokenType2
。
上述源文件创建了两个函数:AST_TokenType1_new()
和AST_TokenType2_new()
,它们分配正确的结构并设置结构成员kind
。
感谢您的代码,我试图使用宏,但他们不会给我所需的所有“电源”。我刚刚用我今天编码的东西回答了我的问题。 – Victor 2012-02-17 02:30:31
很多很多很多年以前,我尝试过一种使用类似于lex/yacc的文件格式的工具,并且应该与那些帮助创建和遍历AST的工具一起使用。不幸的是我不记得这个名字,我怀疑它会很容易找到。但至少存在(或已经存在)这样的工具。 – 2012-02-16 15:59:07
如果您使用emacs或visual studio,您可以依靠片段来帮助您获得大量时间 – Eregrith 2012-02-16 16:02:45