2011-10-28 10 views
10

Ciao, sono nuovo nello sviluppo del compilatore e mi sto chiedendo come assomigli ad AST. Ho una piccola sezione di codice e uso Clang per generare l'AST. Non ne ricavo molte informazioni. A giudicare dall'aspetto, l'albero della sintassi è esattamente uguale all'origine, ad eccezione di una struttura che viene aggiunta a quasi tutti i campioni con cui collaudo.Clang: Che aspetto ha AST (abstract syntax tree)?

Fonte:

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

comando per generare AST:

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

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

Grazie

+6

Solo una nota: si potrebbe voler provare -ast-dump invece di -ast-print; quella rappresentazione potrebbe essere più vicina a ciò che stai cercando. – servn

+2

Se la domanda è come appare un AST, e non come appare l'AST di Clang, potresti trovare utile questa risposta: http://stackoverflow.com/questions/6376662/how-a-ast-for-an-object -orientato-linguaggio di programmazione-sembrerebbe-like/6378997 # 6378997 –

risposta

16

C'è una piccola confusione tra le varie opzioni disponibili:

  • -ast-print sarà pretty-stampa l'AST corrente, vale a dire, renderà il codice è inteso il più vicino possibile a quello che analizzato (ma facendo alcune cose esplicita, come l'apparizione della this)
  • -ast-dump genererà una rappresentazione Lisp-like del AST corrente

la graziosa stampante può essere utile a ch eck che AST è senza perdita di dati (ovvero, conserva la const -ness di tale espressione, ecc.) ma non riguarda realmente lo sviluppo.

Se si desidera eseguire l'hacking sul compilatore, è necessario -ast-dump, che genererà un output che mappa direttamente la rappresentazione in memoria del codice che è stato analizzato.

5

L'AST è una struttura collegata in memoria (" albero "non fa justi ce alla complessità della cosa, ma è il nome che la gente usa). Quello che produce -ast-print è una rappresentazione testuale di AST. Dato che l'umano che imposta l'opzione ha già familiarità con la sintassi simile a C/C++, viene stampato in una rappresentazione che segue quella sintassi. Questa è una scelta progettuale, non una felice coincidenza.

Se si desidera visualizzare l'AST quando non viene stampato di proposito in una sintassi familiare, è possibile ad esempio guardare GIMPLE, la rappresentazione interna di GCC.

+0

Grazie Pascal. Il motivo per cui ho provato a stampare AST è capire cosa sta facendo clang.Ho pensato che sarebbe stato un punto di partenza per passare attraverso la creazione di AST per una migliore comprensione e, infine, per aggiungere nuovi tipi/funzioni all'interno di Clang. Penso che dovrò trovare una soluzione alternativa per questo. –

+3

Attenzione: GIMPLE è difficile da capire e macchinoso da manipolare. –

3

E se si desidera giocare con GIMPLE, è possibile utilizzare anche GCC MELT per questo scopo. MELT è un linguaggio di dominio di alto livello per gestire GIMPLE!

E all'interno dei compilatori, la rappresentazione interna spesso non sono alberi, ma strutture in qualche modo circolari. In GCC, un blocco base lo conosce gimple-s, ma i gimple-s potrebbero conoscere i loro blocchi di base .... (è un po 'più complesso, ma l'idea è stata presa).

Problemi correlati