自动生成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) 
{ ... } 

谢谢!

+0

很多很多很多年以前,我尝试过一种使用类似于lex/yacc的文件格式的工具,并且应该与那些帮助创建和遍历AST的工具一起使用。不幸的是我不记得这个名字,我怀疑它会很容易找到。但至少存在(或已经存在)这样的工具。 – 2012-02-16 15:59:07

+0

如果您使用emacs或visual studio,您可以依靠片段来帮助您获得大量时间 – Eregrith 2012-02-16 16:02:45

那么,由于没有工具,我决定今天下午编写代码。 我开始看起来像一个不错的项目,我想继续它。

我在Haskell中编写了一个基于内置haskell类型的稍微简单的(只是一堆嵌套在IO monad中的嵌套折叠)代码生成器。

的AST类型声明:

http://pastebin.com/gF9xF1vf

C代码发生器,基于所述AST声明:

http://pastebin.com/83Z4GH38

并将所产生的结果是:

http://pastebin.com/jJPgm5PE

有人不爱Haskell? :)

ps:我编码,因为我目前正在研究的项目将在不久的将来承受巨大的变化,而这些变化将无效AST,因此迫使我编码另一个AST模块... 现在我可以做得非常快!

感谢您的答案。

+0

我真的没有时间学习Haskell(或类似的语言),但在我看来,函数式语言对于编译器来说是非常好的。 – 2012-02-17 06:19:27

+0

@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_TokenType1AST_TokenType2

上述源文件创建了两个函数:AST_TokenType1_new()AST_TokenType2_new(),它们分配正确的结构并设置结构成员kind

+0

感谢您的代码,我试图使用宏,但他们不会给我所需的所有“电源”。我刚刚用我今天编码的东西回答了我的问题。 – Victor 2012-02-17 02:30:31