2010-07-06 4 views
0

Actuellement, je travaille sur la représentation d'un arbre AST écrit en SML en Java pour pouvoir le parcourir en Java quand je le souhaite. Je me demande si je devrais juste créer une classe de noeud dans Java qui a les données que je veux représenter, avec une liste de rangée (liste) pour représenter les enfants pour ce noeud spécifique? Ensuite, je peux avoir une classe ASTTree qui n'a que le nœud racine.Création d'un arbre AST en Java avec un autre arbre AST

Je ne sais pas s'il y a quelque chose de plus sophistiqué que je dois considérer.

Toutes les questions/commentaires seront grandement appréciés!

-Paul

Répondre

1

Cela dépend de ce que vous voulez faire sur cet arbre.

je mets en œuvre habituellement en créant un noeud spécifique pour chaque type d'opération je aurais besoin, par exemple

ASTBinaryOperation implements ASTNode 
{ 
    ASTNode left, right; 
    Operator op; 

    Result visit() 
    { 
    Result lr = left.visit(); 
    Result rr = right.visit(); 

    return op.apply(lr, rr); 
    } 
} 

pour un noeud opérateur binaire classique, alors que j'utiliser un ArrayList par exemple pour les déclarations:

ASTDecl implements ASTNode 
{ 
    String name; 
    Type type; 
    Value value; 
} 

ASTDecls implements ASTNode 
{ 
    ArrayList<ASTDecl> declarations; 
} 

construit par l'analyseur. Donc, un nœud racine serait quelque chose comme:

ASTRoot { 
    ASTDecls declarations; 
    ASTFunctions functions; 
} 

ASTFunctions { 
    ASTDecls args; 
    ASTBody body; 
    .. 
} 

ASTBody { 
    ArrayList<ASTStatement> statements; 
    ... 
} 

et ainsi de suite.

Bien sûr, cela dépend de ce que vous voulez faire, j'ai utilisé cette approche pour visiter l'AST pour générer un code intermédiaire en visitant récursivement l'arbre .. mais stocker quoi que ce soit dans un ArrayList vous fera perdre le comportement spécifique et la signification d'un seul ASTNode.