2015-01-07 13 views
5

Ich implementierte ein Programm TreeScanner, um Informationen über alle Knoten in AST zu drucken. Das Programm unterstützt alle Arten (alle Besuchsmethoden sind implementiert). Das Problem besteht jedoch darin, dass für die Anweisung System.out.println(object.YYY); das Programm Feldreferenz YYY nicht besucht.Wie drucken Syntaxbaum mit Javac

Es erkennt Objekt als Identifikator, kann aber nicht YYY als Identifikator erkennen. Allerdings, wenn ich System.out.println (YYY) habe; Dann besucht visitIdentifier YYY.

Bitte lassen Sie mich wissen, was der Unterschied zwischen den beiden oben genannten Zeilen ist, während in einem YYY visitedidentifier besucht wird, in dem anderen Fall wird es nicht besucht.

Wie kann ich besuchen YYY in object.YYY?

In Klasse org.eclipse.jdt.core.dom wir haben FieldAccess, die in den beiden oben genannten Fällen für YYY genannt wird, scheint aber TreeScanner in Javac kein ähnliches Verfahren hat.

+2

Es könnte helfen, einen Code zu schreiben ... – tddmonkey

+0

Ist 'YYY' ein' statische final' (das heißt konstant) Feld? –

+0

Ich überprüfte alle diese Fälle: statisches, statisches endgültiges und normales Feld. In allen drei Fällen konnte YYY nicht als Kennung erkannt werden. –

Antwort

1

Die Methode visitIdentifier ruft Identifier-Notizen im AST auf, die erstellt werden, wenn ein Bezeichner als Ausdruck verwendet wird. Die Syntax für die Elementauswahl in Java lautet jedoch <expression>.<identifier>, nicht <expression>.<expression>, dh die YYY in object.YYY ist kein Unterausdruck und erhält daher keinen eigenen Teilbaum. Stattdessen enthält die MemberSelectTree für object.YYY einfach YYY als Name direkt, erreichbar über getIdentifier(). Es gibt keine visitName Methode in TreeScanner, so die einzige Möglichkeit, um YYY hier zu erhalten wäre, dies von visitMemberSelect direkt zu tun.

Hier ist, wie Sie object.YYYvisitMemberSelect mit drucken würde:

Void visitMemberSelect(MemberSelectTree memberSelect, Void p) { 
    // Print the object 
    memberSelect.getExpression().accept(this, p); 
    System.out.print("."); 
    // Print the name of the member 
    System.out.print(memberSelect.getIdentifier()); 
} 
+0

Danke. Akzeptieren Sie als die richtige Antwort. –