0

私は新しい言語を実装したいと思っています。有名なflex + yaccの組み合わせでC言語でやりたいと思います。まあ、事は、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の作成とトラバースを助けることでした。残念ながら私はその名前を思い出すことができませんし、再び見つけることは容易ではないと思います。しかし、少なくともそのようなツールが存在する(または存在している)。 –

+0

emacsやvisual studioを使用している場合、スニペットを利用して多くの時間を得ることができます – Eregrith

答えて

1

ツールがなかったので、私は今日の午後に何かをコーディングすることに決めました。 私は素敵なプロジェクトのようなものを始めました。私はそれを続けたいと思います。

ハスケルでは、組み込みのhaskell型に基づいて、やや単純な(IOモナド内のネストされた折りたたみの束)コードを作成しました。

AST型宣言:AST宣言に基づいて

http://pastebin.com/gF9xF1vf

Cコード生成、:

http://pastebin.com/83Z4GH38

、生成結果:

http://pastebin.com/jJPgm5PE

どのように誰かがハスケルを愛していないことができますか? :)

ps:私が現在取り組んでいるプロジェクトは、近い将来に膨大な変更を被るため、これらの変更によってASTが無効になり、別のASTモジュール... 今私はかなり速くそれをすることができます!

回答ありがとうございます。

+0

私はHaskell(または類似の言語)を学ぶ時間は本当にありませんでしたが、一般的に関数型言語はコンパイラを作るのにとても良いと思います。 –

+0

@JoachimPileborg、それほど真実ではありません。グローバルアキュムレータのような非常に単純なタスクは、関数型プログラミングで大きな頭痛を引き起こすことがありますが、複雑なデータ構造を通過するシンプルなものや何かのためには、かなり良いです! – Victor

2

プリプロセッサマクロを巧みに使いこなすことができます。

まずヘッダファイル:

#ifndef AST_NODE 
# define AST_NODE(token) \ 
    struct AST_ ## token \ 
    {     \ 
     int kind;  \ 
    }; 
#endif 

AST_NODE(TokenType1) 
AST_NODE(TokenType2) 

はその後、ソースファイル:AST_TokenType1

#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_TokenType2

上記のソースファイルは、正しい構造を割り当て、構造体メンバkindを設定するAST_TokenType1_new()AST_TokenType2_new()という2つの関数を作成します。

+0

コードをお寄せいただきありがとうございます。マクロを使用しようとしましたが、私に必要なすべての「力」を与えることはできません。私は今日私がコード化したもので私の質問に答えたばかりです。 – Victor

関連する問題