10
votes

CLANG: Qu'est-ce que ATT (Abstract Syntaxe Tree)?

Bonjour, je suis nouveau dans le développement du compilateur et je me demande comment AST ressemble. J'ai une petite section de code et j'utilise Clang pour générer l'AST. Je ne reçois pas beaucoup d'informations. À partir de celui-ci, l'arbre de syntaxe est exactement la même que la source, à l'exception d'une structure ajoutée à presque tous les échantillons que je testez avec.

Source: P>

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


2 commentaires

Si la question est de savoir ce que l'AST ressemble, et non à quoi ressemble CLang AST, vous trouverez peut-être cette réponse utile: Stackoverflow.com/questions/6376662/...


Juste une note: vous voudrez peut-être essayer -ast-décharge au lieu de -ast-imprimer; Cette représentation pourrait être plus proche de ce que vous recherchez.


3 Réponses :


6
votes

L'AST est une structure liée en mémoire ("arbre" ne rend pas justice à la complexité de la chose, mais c'est le nom des gens qui utilisent). Ce que -impression produit est une représentation textuelle de l'AST. Étant donné que l'humain qui définit l'option est déjà familiarisé avec la syntaxe C / C ++ - comme la syntaxe, elle est imprimée dans une représentation qui suit cette syntaxe. C'est un choix de conception, pas une bonne coïncidence.

Si vous voulez voir à quoi ressemble l'AST quand il n'est pas imprimé exprès dans un but dans une syntaxe familière, vous pouvez par exemple regarder Gimple , la représentation interne de GCC.


2 commentaires

Merci Pascal. La raison pour laquelle j'ai essayé d'imprimer l'AST est de comprendre ce que fait la collage. Je pensais que ce serait un point de départ pour passer à travers la création de AST pour une meilleure compréhension, et enfin d'ajouter des types / fonctions plus récents au sein de Clang. Je pense que je devrai trouver une solution alternative pour cela.


AVERTISSEMENT: La gimale est difficile à comprendre et à manipuler.



3
votes

Et si vous voulez jouer avec Gimple, vous pouvez même utiliser GCC Melt à cet effet. La masse fondue est une langue spécifique de haut niveau pour traiter avec Gimple!

et à l'intérieur des compilateurs, la représentation interne ne sont souvent pas des arbres, mais d'une manière ou d'une autre structures circulaires. Dans GCC, un bloc de base le sait gimple-s, mais le gimple-s peut connaître leurs blocs de base ... (c'est un peu plus complexe, mais vous avez l'idée).


0 commentaires

16
votes

Il y a une petite confusion entre les différentes options disponibles:

  • -imprimé jolie-impression de l'AST actuel, c'est-à-dire que cela rendra le code qu'il comprit aussi étroitement que possible de ce qu'il a analysé (mais en faisant des choses explicites, comme l'apparition du ceci )
  • -ast-Dump générera une représentation de type LISP de l'AST

    La jolie imprimante peut être utile pour vérifier que l'AST est sans perte (c'est-à-dire conservé le const de cette expression, etc ...) mais n'est pas vraiment sur le développement.

    Si vous souhaitez pirater sur le compilateur, vous avez besoin de -Assast-Dump , qui générera une sortie qui plante directement la représentation en mémoire du code qui a été analysé.


0 commentaires