我想实现一种新的语言,我想用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)
{ ... }谢谢!
发布于 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模块……现在我可以做得很快了!
不过,还是要感谢你的回答。
发布于 2012-02-17 00:18:26
通过巧妙地使用预处理器宏,您可能会得到一些有用的东西。
首先是头文件:
#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。
https://stackoverflow.com/questions/9314438
复制相似问题