2014-05-04 2 views
0

J'utilise JavaCC pour imprimer un AST dans un format particulier. je besoin d'être comme ceci:Méthode de vidage JavaCC pour imprimer AST

LetNode(Identier(X), ExprNode(PlusNode(IntegerLiteral(8), IntegerLiteral(2)))) 

mais je reçois:

Start(LetNode(Identifier(x)(ExprNode(IntegerLiteral(5)(PlusNode(IntegerLiteral(5)())) 

J'utilise la méthode de vidage pour imprimer cette:

public void dump(String prefix) { 
    System.out.print(toString(prefix)); 
    System.out.print("("); 
    if (children != null) { 

    for (int i = 0; i < children.length; ++i) { 
     SimpleNode n = (SimpleNode)children[i]; 
     if (n != null) { 
     n.dump(prefix +""); 
     } 
    } 
    System.out.print(")"); 
    } 
} 

}

La sortie sans aucune modification est:

Start 
    Sxl 
    Statement 
    VariableDecl 
    Identifier 
    Type 
    Expression 
     SimpleExpression 
     Term 
     Factor 
     Literal 
      IntegerLiteral 
     AdditiveOp 
     Term 
     Factor 
     Literal 
      IntegerLiteral 

Ma méthode:

void AdditiveOp(): 
{} 
{ 
    (Plus() /*#Add(2)*/ | Minus() | Or()) 

} 

void Plus(): 
{ 
} 
{ 
    (<PLUS>) 
    #PlusNode 
} 

Si je retire le/* */il ne fonctionne pas comme il est dit qu'elle attend quelque chose d'autre ne +

Toute aide serait grandement appréciée!

+0

D'abord, vous aurez envie de changer la façon dont l'arbre est produit. Actuellement, vous avez essentiellement l'arbre d'analyse. Ce que vous voudrez, c'est plus d'un arbre de syntaxe abstraite. Lisez la documentation de JJT pour savoir comment procéder. –

+0

Je l'ai fait et j'ai modifié la méthode dump() en fait j'ai obtenu une sortie comme je l'ai dit plus haut. Tout ce que j'ai besoin est d'obtenir le nœud plus avant les entiers pas au milieu mais je ne peux pas comprendre comment – user3599420

Répondre

0

La manière habituelle de faire un AST avec JJT pour une grammaire d'expression est de faire quelque chose comme ça

void AdditiveExpression() #void : 
{ Token t ; } 
{ 
    MultiplicativeExpression() 
    ( "+" MultiplicativeExpression() #Add(2) 
    | "-" MultiplicativeExpression() #Subtract(2) 
)* 
} 
+0

quelle est la raison derrière (2)? merci – user3599420

+0

aussi s'il vous plaît voir ma mise à jour – user3599420

+0

En ce qui concerne le "(2)", vous devez lire la documentation JJT. En résumé '#Add (2)' signifie: (a) faire apparaître deux noeuds de la pile, (b) créer un nouveau noeud de type 'Add', (c) ajouter ces deux noeuds en tant qu'enfants au nouveau noeud, (d) Poussez le nouveau noeud sur la pile. Ainsi, l'ensemble de la méthode pousse 1 noeud sur la pile, en supposant qu'il en soit de même de 'MultiplicativeExpression'. –