2011-10-28 3 views
10

안녕하세요, 저는 새로운 컴파일러 개발 과정에서 AST가 어떻게 보이는지 궁금합니다. 작은 코드 섹션이 있으며 AST를 생성하기 위해 Clang을 사용합니다. 나는 그것에서 많은 정보를 얻지 않는다. 보이는 것부터, Syntax tree는 거의 모든 샘플에 추가 된 하나의 구조체를 제외하고는 소스와 정확히 동일합니다.Clang : AST (추상 구문 트리)는 어떻게 생겼습니까?

자료 :

class A { 
public: 
    int *a, *b, *c; 
    int i; 
    void sum() { 
    a = new int[5]; 
    b = new int[5]; 
    c = new int[5]; 
    for (i = 0; i < 5; i++) { 
     a[i] = i; 
     b[i] = i; 
    } 
    for (i = 0; i < 5; i++) { 
     c[i] = a[i] + b[i]; 
    } 
    delete[] a; delete[] b; delete[] c; 
    } 
}; 

class B : public A { 
}; 

int main() { 
    B bclass; 
    bclass.sum(); 
    return 0; 
} 

명령 생성 AST :

clang++ -cc1 -ast-print ~/sum.cpp 

AST 출력 :

struct __va_list_tag { 
    unsigned int gp_offset; 
    unsigned int fp_offset; 
    void *overflow_arg_area; 
    void *reg_save_area; 
}; 
typedef struct __va_list_tag __va_list_tag; 
class A { 
public: 
    int *a; 
    int *b; 
    int *c; 
    int i; 
    void sum()  { 
     this->a = new int [5]; 
     this->b = new int [5]; 
     this->c = new int [5]; 
     for (this->i = 0; this->i < 5; this->i++) { 
      this->a[this->i] = this->i; 
      this->b[this->i] = this->i; 
     } 
     for (this->i = 0; this->i < 5; this->i++) { 
      this->c[this->i] = this->a[this->i] + this->b[this->i]; 
     } 
     delete [] this->a; 
     delete [] this->b; 
     delete [] this->c; 
    } 


}; 
class B : public A { 
}; 
int main() { 
    B bclass; 
    bclass.sum(); 
    return 0; 
} 

감사

+6

참고 : -ast-print 대신 -ast-dump를 시도해 볼 수 있습니다. 그 표현은 당신이 찾고있는 것과 더 가깝습니다. – servn

+2

Clang의 AST가 아닌 AST가 무엇인지 묻는다면이 대답이 유용 할 것입니다. http://stackoverflow.com/questions/6376662/how-a-ast-for-an-object 지향 프로그래밍 언어로 보입니다/6378997 # 6378997 –

답변

16

사용할 수있는 다양한 옵션을 사이에 작은 혼란이 있습니다 :

  • -ast-print (현재 AST, 즉, 그것은 그것을 구문 분석 무엇에 최대한 가깝게 이해하는 코드를 렌더링을 꽤 - 인쇄 할 수 있지만, this)
  • -ast-dump의 유령과 같은 몇 가지 명시 적으로 만드는 것은 ch가 유용 할 수있는 현재 AST

예쁜 프린터의 혀짤배기 같은 표현을 생성합니다 AST가 무손실 (즉, const - 그러한 표현 등의 정도를 보존 함)을 말하지만 실제로는 개발에 관한 것은 아닙니다.

컴파일러를 해킹하려면 -ast-dump이 필요합니다.이 코드는 구문 분석 된 코드의 메모리 내 표현을 직접 매핑하는 출력을 생성합니다.

5

AST 메모리에 연결된 구조 ("이고 나무 "는 정의를 짓지 않는다. ce의 복잡성을하지만, 사람들이 사용하는 이름). -ast-print이 생성하는 것은 AST의 텍스트 표현입니다. 옵션을 설정 한 사람은 이미 C/C++와 유사한 구문에 익숙하므로이 구문을 따르는 표현으로 인쇄됩니다. 이것은 행복한 선택이 아닌 즐거운 우연의 일치입니다.

AST가 친숙한 구문으로 의도적으로 인쇄되지 않을 때 어떻게 보이는지 보려면 GCC의 내부 표현 GIMPLE을 볼 수 있습니다.

+0

Thanks Pascal. 내가 AST를 인쇄하려고 한 이유는 왜곡이 무엇인지 이해하는 것입니다.더 나은 이해를 위해 AST를 만드는 단계를 시작하고 마지막으로 Clang 내에 새로운 유형/기능을 추가하는 것이 출발점이 될 것이라고 생각했습니다. 나는 그것을위한 대안을 찾아야 할 것이라고 생각한다. –

+3

경고 : GIMPLE은 이해하기가 쉽지 않으며 다루기가 번거 롭습니다. –

3

그리고 GIMPLE로 연주하고 싶다면 GCC MELT을 사용해도됩니다. MELT는 GIMPLE을 다루는 고급 도메인 전용 언어입니다!

내부 컴파일러는 종종 나무가 아니며 어떻게 든 원형 구조입니다. GCC에서 기본 블록은 gimple-s를 알고 있지만 gimple-s는 기본 블록을 알 수 있습니다 .... (좀 더 복잡하지만 아이디어는 있습니다).