自动生成C结构构造函数?

时间:2012-02-16 15:52:14

标签: c compiler-construction constructor code-generation abstract-syntax-tree

我想实现一种新语言,我想用C语言,用着名的flex + yacc组合。嗯,问题是,编写整个AST代码非常耗时。是否有一个工具可以自动生成结构的构造函数?

我想要一些具有以下行为的东西:

输入:

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)
{ ... }

谢谢!

2 个答案:

答案 0 :(得分:2)

您可能能够巧妙地使用预处理器宏。

首先是头文件:

#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

答案 1 :(得分:1)

好吧,因为没有工具我今天下午决定编码。 我开始看起来像一个很好的项目,我想继续它。

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

AST类型声明:

http://pastebin.com/gF9xF1vf

C代码生成器,基于AST声明:

http://pastebin.com/83Z4GH38

生成的结果:

http://pastebin.com/jJPgm5PE

有人不喜欢Haskell吗? :)

ps:我编写了这个,因为我正在进行的项目在不久的将来会遭受大量的更改,而这些更改将使AST失效,从而迫使我编写另一个AST模块... 现在我可以很快地完成它!

感谢您的回答。