2011-10-28 14 views
10

こんにちは、私はコンパイラの開発で新しく、どのようにASTのように見えるのだろうかと思っています。私はコードの小さな部分を持っており、私はASTを生成するためにClangを使用します。私はそれから多くの情報を得ることはありません。 見た目から、Syntaxツリーはソースとまったく同じですが、テストするほぼすべてのサンプルに追加される1つの構造体を除きます。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

質問がASTの外観であり、ClangのASTの外観ではない場合は、この回答が役に立ちます:http://stackoverflow.com/questions/6376662/how-a-ast-for-an-object -oriented-programming-language-like-look-like/6378997#6378997 –

答えて

16

利用できるさまざまなオプションとの間に小さな混乱があります:

  • -ast-print(現在のAST、つまり、それはそれが解析されたものにできるだけ近い理解コードをレンダリングしますが、かなり-印刷されますが、 this
  • -ast-dumpの幻影のように、いくつかのものは、明示的にすることは、CHに役立つことができ、現在のAST

プリティプリンタのlispのような表現を生成します。 ASTはロスレスである(すなわち、const - そのような表現の程度などを保存している)が、実際には開発に関するものではない。

コンパイラをハックする場合は、-ast-dumpが必要です。これは、解析されたコードのメモリ内表現を直接マップする出力を生成します。

5

ASTメモリ内のリンクされた構造は、(」です木は "正義をしないそれは人々の名前です)。 -ast-printが生成するものは、ASTのテキスト表現です。オプションを設定した人は既にC/C++のような構文に精通しているので、その構文に従った表現で表示されます。これはデザインの選択肢であり、幸せな偶然ではありません。

おなじみの構文で意図的に印刷されていないASTの外観を見たい場合は、例えばGIMPLE、GCCの内部表現を見ることができます。

+0

ありがとう、パスカル。私がASTを印刷しようとした理由は、何がしているのかを理解することです。私はそれがより理解のためのASTの作成をステップ実行し、最終的にClang内で新しいタイプ/機能を追加するための出発点であると思った。私はそれに代わる解決策を見つけなければならないと思う。 –

+3

警告:GIMPLEは理解するのが難しく、扱いが面倒です。 –

3

また、GIMPLEでプレイしたい場合は、その目的でGCC MELTを使用することもできます。 MELTは、GIMPLEに対処するためのハイレベルのドメイン固有の言語です!

コンパイラの内部表現は、しばしばツリーではなく、何らかの形で循環する構造です。 GCCでは、基本ブロックはそれがぎこちなくわかっていますが、ジムプルは基本ブロックを知っているかもしれません....(もう少し複雑ですが、あなたはその考えを持っています)。

関連する問題