2011-10-28 7 views
10

Hola, soy nuevo en el desarrollo de compiladores, y me pregunto cómo será AST. Tengo una pequeña sección de código, y uso Clang para generar el AST. No obtengo mucha información de eso. Desde su aspecto, el árbol de sintaxis es exactamente el mismo que el de la fuente, a excepción de una estructura que se agrega a casi cualquier muestra con la que realice la prueba.Clang: ¿Cómo se ve AST (árbol de sintaxis abstracta)?

Fuente:

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 para generar AST:

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

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

Gracias

+6

Sólo una nota: es posible que desee probar -to-volcar en lugar de -ast-print; esa representación podría estar más cerca de lo que estás buscando. – servn

+2

Si la pregunta es qué aspecto tiene una AST, y no qué aspecto tiene la AST de Clang, puede encontrar esta respuesta útil: http://stackoverflow.com/questions/6376662/how-a-ast-for-an-object -orientado-programación-lenguaje-se-buscar-como/6378997 # 6378997 –

Respuesta

16

Hay una pequeña confusión entre las diversas opciones disponibles:

  • -ast-print será bastante-imprimir el AST actual, es decir, va a proporcionar el código se entiende lo más cerca posible a lo que se analiza (pero hacer algunas cosas explícita, como la aparición de la this)
  • -ast-dump generará una representación Lisp de la AST actual

la impresora bonita puede ser útil a ch Supongamos que el AST no tiene pérdidas (es decir, conserva el const -ness de tal expresión, etc.) pero no se trata realmente de desarrollo.

Si desea hackear el compilador, necesita -ast-dump, que generará una salida que mapee directamente la representación en memoria del código que se analizó.

5

El AST es una estructura ligada en la memoria (" árbol "no hace justicia" ce a la complejidad de la cosa, pero es el nombre que la gente usa). Lo que -ast-print produce es una representación textual del AST. Como el humano que estableció la opción ya está familiarizado con la sintaxis similar a C/C++, se imprime en una representación que sigue a esa sintaxis. Esta es una elección de diseño, no una feliz coincidencia.

Si desea ver cómo es el AST cuando no se imprime a propósito en una sintaxis familiar, puede, por ejemplo, consultar GIMPLE, representación interna de GCC.

+0

Gracias Pascal. La razón por la que traté de imprimir el AST es para entender qué está haciendo clang.Pensé que sería un punto de partida para avanzar en la creación de AST para una mejor comprensión, y finalmente para agregar tipos/funciones más nuevos dentro de Clang. Creo que tendré que encontrar una solución alternativa para eso. –

+3

Advertencia: GIMPLE es difícil de entender y engorroso de manipular. –

3

Y si quieres jugar con GIMPLE, incluso puedes usar GCC MELT para tal fin. MELT es un lenguaje de dominio específico de alto nivel para tratar con GIMPLE.

Y dentro de los compiladores, la representación interna a menudo no son árboles, sino estructuras circulares. En GCC, un bloque básico lo sabe, pero los gimple-s pueden conocer sus bloques básicos .... (es un poco más complejo, pero ya tienes la idea).

Cuestiones relacionadas