首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动生成C结构构造函数?

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

Stack Overflow用户
提问于 2012-02-16 23:52:14
回答 2查看 769关注 0票数 0

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

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

输入:

代码语言:javascript
复制
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;

输出:

代码语言:javascript
复制
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)
{ ... }

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-17 10:28:49

好吧,由于没有工具,我决定今天下午编写一些代码。我开始了一个看起来不错的项目,我想继续下去。

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

AST类型声明:

http://pastebin.com/gF9xF1vf

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

http://pastebin.com/83Z4GH38

以及生成的结果:

http://pastebin.com/jJPgm5PE

怎么会有人不爱Haskell呢?:)

ps:我写这个是因为我目前正在工作的项目在不久的将来将遭受巨大的变化,这些变化将使AST失效,从而迫使我编写另一个AST模块……现在我可以做得很快了!

不过,还是要感谢你的回答。

票数 1
EN

Stack Overflow用户

发布于 2012-02-17 00:18:26

通过巧妙地使用预处理器宏,您可能会得到一些有用的东西。

首先是头文件:

代码语言:javascript
复制
#ifndef AST_NODE
# define AST_NODE(token) \
    struct AST_ ## token \
    {                    \
        int kind;        \
    };
#endif

AST_NODE(TokenType1)
AST_NODE(TokenType2)

然后是源文件:

代码语言:javascript
复制
#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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9314438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档