2012-03-24 2 views
4

필자가 작성중인 컴파일러에 대해 AST를 작성하기 위해 Bison과 협력 중입니다. AST에서 노드를 구축하는 가장 좋은 방법은 무엇입니까? 예를 들어 제 질문이 더 명확해질 수 있습니다. 다음 코드 감안할 때Bison을 사용하여 AST 작성하기

: I 필드 규칙이 필드 노드를 반환 할 위의 예에서

field 
    : modifier type TOK_IDENT TOK_SEMICOLON 
    { 
     // I want to return a pointer to a node of type Field 
     // i.e. $$ = new Field(name, isVisible, isStatic, type); 
    } 
    ; 

modifier 
    : visibility_opt static_opt 
    { 
     // Should I make the new Field here and pass it up? 
     // Or a new type that contains both vis and static options?  
    } 
    ; 

visibility_opt 
    : /* default */ { $$ = true; } 
    | TOK_PUBLIC { $$ = true; } 
    | TOK_PRIVATE { $$ = false; } 
    ; 

static_opt 
    : /* default */ { $$ = false; } 
    | TOK_STATIC { $$ = true; } 
    ; 

,하지만 난 구문 분석 중에 전달됩니다 수식 규칙의 일부 속성이 필요합니다 (즉 이들은 합성 된 속성이다).

문법을 변경하지 않고이 작업을 수행 할 수있는 두 가지 방법이 있다고 생각할 수 있습니다.

  1. 비 종단 수식어가 Field 유형을 갖고 여기에 새 Field를 작성하고, 할 수있는 것을 채우고, 나머지 수를 채우기 위해 필드로 전달하십시오.
  2. 수정 자에 두 개의 bool 값을 보유하는 고유 한 유형이 있고 필드 규칙에서 새 필드를 작성할 때 데이터를 추출하여 전달하십시오.

이런 상황에서 가장 좋은 방법은 무엇입니까?

+3

나는 대체적으로 두 가지로 갈 것입니다. 주로'modifier '는 실제로'field'가 아니기 때문에 별도의 것입니다. –

+0

그래, 수정 자에 std :: pair 유형을 부여하기 위해 두 번째 방법을 선택했습니다. 그것은 비록 다른 경우에 그것은 첫 번째 접근법과 함께가는 것이 더 합리적 이었기 때문에 그것이 의존하는 것처럼 보입니다 ... – mcorley

답변

2

다른 사람들은 가시성 및 정적 옵션이있는 구조체 수정자를 갖는 것이 바람직한 방법을 제안했습니다. 그러나 나는이 필드를 필드로 전달하지 않고 단순히 값을 추출한 다음 Field로 전달한다는 점에서 정적 수정 자일 수 있습니다. 심지어 스택에 할당 할 수도 있고 재사용하여 더 빨리 만들 수도 있습니다. 다음과 같은 라인을 따라

뭔가 : 당신이 언어의 미래에 꽤 특정 아니라면 또한

static struct { boolean vis_opt; boolean static_opt; } mod; 

field 
    : modifier type TOK_IDENT TOK_SEMICOLON 
    { 
     $$ = new Field(..., mod.vis_opt, mod.static_opt, ...); 
    } 
    ; 

modifier 
    : visibility_opt static_opt 
    { 
     mod.vis_opt = $1; 
     mod.static_opt = $2; 
    } 
    ; 

visibility_opt 
    : /* default */ { $$ = true; } 
    | TOK_PUBLIC { $$ = true; } 
    | TOK_PRIVATE { $$ = false; } 
    ; 

static_opt 
    : /* default */ { $$ = false; } 
    | TOK_STATIC { $$ = true; } 
    ; 

, 당신은 가시성을 열거을 고려할 수 있습니다. 언어를 개발하는 동안 꿈을 꿀 수있는 가시성이 어떤 것인지 결코 알지 못합니다. 적어도 열거 형에 넣으면 나중에 확장하기가 더 쉽습니다.

즐기십시오.