我想实现一种新语言,我想用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)
{ ... }
谢谢!
答案 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_TokenType1
和AST_TokenType2
。
上述源文件创建了两个函数:AST_TokenType1_new()
和AST_TokenType2_new()
,它们分配正确的结构并设置结构成员kind
。
答案 1 :(得分:1)
好吧,因为没有工具我今天下午决定编码。 我开始看起来像一个很好的项目,我想继续它。
我在Haskell中编写了一个简单的(在IO monad中只是一堆嵌套的折叠)代码生成器,它基于内置的haskell类型。
AST类型声明:
C代码生成器,基于AST声明:
生成的结果:
有人不喜欢Haskell吗? :)
ps:我编写了这个,因为我正在进行的项目在不久的将来会遭受大量的更改,而这些更改将使AST失效,从而迫使我编写另一个AST模块... 现在我可以很快地完成它!感谢您的回答。