2011-10-28 15 views
10

Merhaba Compiler geliştirmede yeni ve AST'nin nasıl olduğunu merak ediyorum. Küçük bir kod bölümüm var ve AST'yi üretmek için Clang kullanıyorum. Bundan fazla bilgi alamıyorum. Görünüşten hemen sonra, sözdizimi yaptığım hemen hemen tüm örneklere eklenen bir yapı dışında, sözdizimi ağacı kaynakla tam olarak aynıdır.Clang: AST (soyut sözdizimi ağacı) neye benziyor?

Kaynak:

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; 
} 

Komut üretmek için AST:

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

AST çıkışı:

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; 
} 

Teşekkür

+6

Sadece bir not: -ast-print yerine -ast-dump'i denemek isteyebilirsiniz; Bu temsil, aradığınız şeylere daha yakın olabilir. – servn

+2

Eğer soru AST'nin neye benzediğini ve Clang'ın AST'sinin neye benzediğini sorgulamıyorsa, bu cevabı yararlı bulabilirsiniz: http://stackoverflow.com/questions/6376662/how-a-ast-for-an-object -akıcı-programlama-dil-olur gibi/6378997 # 6378997 –

cevap

16

mevcut olan çeşitli seçenekler arasında küçük karışıklık var:

  • -ast-print (şimdiki AST, yani, o çözümlenen ne mümkün olduğunca yakından anlaşılan kodu verecek güzel-yazdırır ama this)
  • -ast-dump bir hayalet gibi, bazı şeyler açık hale ch yararlı olabilir güncel AST

oldukça yazıcı bir peltekçe temsilini üretecektir AST'nin kayıpsız olduğunu (yani, const gibi bir ifadenin korunmuş olduğunu, vb.) kontrol edin, ancak gerçekten geliştirme ile ilgili değildir.

Derleyicide kesmek isterseniz, ayrıştırılan kodun doğrudan bellek içi temsiliyle eşlenen bir çıktı üretecek olan -ast-dump gerekir.

5

AST bellekte bir bağlantılı yapı (" dir ağaç "justi yapmaz Bir şeyin karmaşıklığına ce, ama insanların kullandığı isim. -ast-print'un ne ürettiği, AST'nin metinsel bir temsilidir. Bu seçeneği ayarlayan insan C/C++ benzeri bir sözdizimini zaten bildiğinden, sözdizimini izleyen bir sunumda basılmıştır. Bu bir tasarım tercihi, mutlu bir tesadüf değil.

AST, bildik bir sözdiziminde yazdırılmadığında AST'nin neye benzediğini görmek isterseniz, GCC'nin iç gösterimi gibi GIMPLE örneğine bakabilirsiniz.

+0

Teşekkürler Pascal. AST'yi yazdırmaya çalışmamın nedeni, clang'ın ne yaptığını anlamaktır.Daha iyi anlaşılması için AST'nin yaratılması için adım atmanın ve sonunda Clang içinde daha yeni türler/fonksiyonlar eklemenin bir başlangıç ​​noktası olacağını düşündüm. Bunun için alternatif bir çözüm bulmam gerekecek. –

+3

Uyarı: GIMPLE, anlaşılması zor ve kullanışsızdır. –

3

Ve eğer GIMPLE ile oynamak istiyorsanız, bu amaçla GCC MELT'u bile kullanabilirsiniz. MELT, GIMPLE ile başa çıkmak için üst düzey bir alana özel bir dildir!

Derleyiciler içinde iç temsil çoğu kez ağaç değil, bir şekilde dairesel yapılardır. GCC'de, temel bir blok onu gimple-s bildiğini biliyor, ama gimple-ler temel bloklarını bilebilirler .... (biraz daha karmaşıktır, ama sizde bir fikir var).