2016-09-10 2 views
1

AST에 Eclipse (org.eclipse.jdt)를 사용합니다.자바 코드를 추상 구문 트리로 구문 분석

나는 (?) 나는 필드의 선언과 사용법을 얻기 위해 온라인에서 유용한 코드를 얻었다고 생각한다. 하지만 루트 노드를 얻는 방법에 대해 고민했습니다.

ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setKind(ASTParser.K_COMPILATION_UNIT); 
parser.setSource(buffer.toString().toCharArray()); 
parser.setResolveBindings(true); 

CompilationUnit cu = (CompilationUnit) parser.createAST(null); 
ASTNode root = cu.getRoot(); 
System.out.println(root.toString()); 

다음 작업을 수행하면 루트 AST 노드가 아닌 전체 자바 코드가 인쇄됩니다.

대서양 표준시를 오해하고 있는지 잘 모르겠지만이 노드는 여러 노드를 가질 수 있다는 점을 제외하고는 이진 검색 트리와 비슷합니다. (picture)

이에 대한 설명이나 도움이 필요하십니까?

+1

왜 루트 노드를 인쇄 하시겠습니까? 기대했던 결과는 무엇입니까? 'toString()'의 Javadoc은 "디버깅 목적으로 만 적합한이 노드의 문자열 표현을 반환합니다."라고 말하면이 동작은 놀랄 수 있습니다. 반면에 나는 자연스러운 행동을 쉽게 생각할 수 없다. –

답변

0

toString 메서드는 AST를 다시 Java로 변환합니다.

당신이 accept 방법을 당신이 ASTVisitor 클래스를 사용하는 데 필요한 전체 AST 구조를보고 전화를 걸 경우 : visitorASTVisitor를 확장하는 클래스의 인스턴스

root.accept(visitor); 

. ASTVisitor에는 preVisit, visitpostVisit 개의 다른 AST 노드를보기 위해 무시할 수있는 메소드가 있습니다.

+0

나는 VariableDeclarationFragment, SimpleNode 등과 같은 몇 가지 메소드가있는 ASTVisitor를 만들 수 있었다. 하지만 요점은 그들을 나무로 만드는 방법이었습니다. AST는 그 기능을 가지고 있습니까? 아니면 그것을위한 트리를 만드는 자체 메서드를 만들어야합니까? –

+0

대서양 표준시는 나무입니다. 나무 구조로 인쇄하려는 경우 다양한 방문자 호출을 사용하여 직접 코딩해야합니다. –

+0

감사합니다. 그 대답은 실제로 제가 찾고 있었던 것입니다. 나는 AST라는 이름에 속았 기 때문에 자바 코드를 파스 트리로 만드는 기능이 있다고 생각했다. 자바 코드를 다음과 같이 변환하려고했다. [LINK] (http://www.oranlooney.com/static/misl/ast.png) –