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와 비슷한 fileformat을 사용하고 AST를 만들고 트래버스하는 데 도움이되는 도구와 함께 사용해야하는 도구를 사용해 보았습니다.불행히도 나는 그 이름을 기억할 수 없으며, 다시 찾을 수 있을지는 의심 스럽다. 그러나 최소한 그러한 도구가 존재합니다. –

+0

emacs 또는 visual studio를 사용하는 경우 미리보기를 사용하여 많은 시간을 얻을 수 있습니다. – Eregrith

답변

1

글쎄, 도구가 없어서 오늘 오후에 뭔가 코딩하기로 결정했습니다. 멋진 프로젝트처럼 보이기 시작했으며 계속하고 싶습니다.

내장 된 haskell 유형을 기반으로 하스켈의 코드 생성기 (IO Monad 내부에 몇 개의 중첩 된 폴드)를 코딩했습니다.

AST 타입 선언 다음 AST 선언에 기초

http://pastebin.com/gF9xF1vf

C 코드 발생기 :

http://pastebin.com/83Z4GH38

상기 생성 된 결과 :

http://pastebin.com/jJPgm5PE

어떻게 하스켈을 좋아하지 않을 수 있습니까? :)

ps : 내가 현재 작업하고있는 프로젝트가 가까운 장래에 큰 변화를 겪을 것이므로이 코드는 AST를 무효화하여 다른 AST 모듈 ... 이제 저는 그것을 아주 빨리 할 수 ​​있습니다!

답변을 주셔서 감사합니다.

+0

하스켈 (또는 유사한 언어)을 배울 시간이 없었지만 일반적으로 함수형 언어는 컴파일러를 만드는 데 매우 유용합니다. –

+0

@JoachimPileborg, 사실이 아닙니다. 글로벌 어큐뮬레이터와 같은 몇 가지 매우 간단한 작업은 함수형 프로그래밍에서 큰 골치 거리가 될 수 있지만, 복잡한 데이터 구조를 통과하는 단순함이나 무언가에 대해서는 매우 좋습니다! – Victor

2

사전 처리기 매크로를 영리하게 사용하면서 뭔가를 얻을 수 있습니다.

먼저 헤더 파일 :

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

AST_NODE(TokenType1) 
AST_NODE(TokenType2) 

그런 다음 소스 파일 : 당신이 다른 파일에서 "ast.h"파일을 포함하는 경우

#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_TokenType1를 및 AST_TokenType2.

위에서 설명한 소스 파일은 올바른 구조를 할당하고 구조체 멤버 kind을 설정하는 AST_TokenType1_new()AST_TokenType2_new()의 두 가지 기능을 만듭니다.

+0

코드를 보내 주셔서 감사합니다. 매크로를 사용하려했지만 필요한 모든 "힘"을주지 못합니다. 나는 방금 내가 코딩 한 것을 가지고 나의 질문에 대답했다. – Victor

관련 문제