2016-10-13 7 views
0

I는 다음과 소스가이 파일 (A.java) 우리가 다른 단어의 많은 빈 라인과 반드시 ​​같은 줄에 쓰여진 하나 개의 명령을 가지고Eclipse JDT Parser에서 구문 분석 된 Java 소스의 행을 가져 오는 방법은 무엇입니까? 내 하드 드라이브에

package DAO; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.io.Reader; 
import java.io.StringReader; 
import java.io.StringWriter; 
import java.io.Writer; 
import java.nio.charset.StandardCharsets; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.*; 
import java.util.concurrent.CountDownLatch; 


public abstract class A { 
public class A4{ 
    public String teste4(int i){ 
     return (new String("teste")); 
    } 
} 
public class A3{ 
    public String teste3(int i){ 
     return (new String("teste")); 
    } 
    public A4 teste33(int i){ 
     return (new A4()); 
    }  
} 
public class A2{ 
    public A3 teste2(int i){ 
     return (new A3()); 
    } 
} 
public class A1{ 
    public A2 teste1(int i){ 
     return (new A2()); 
    } 
} 


    public int[] toIntArray(List<Integer> list) { 
    A1 q=new A1(); 

    Integer t=q.teste1(
       (new A1()). 
       teste1(0). 
       teste2(0). 
       teste33(0). 
       teste4(0). 
       length()). 
      teste2(0). 
      teste3(0). 
      length(); 
    } 
} 

주, 그건 어쩌면 여러 줄에 퍼져있을 수도 있습니다 ("toIntArray"의 마지막 줄을보십시오). 이 경우, 모든 빈 줄이 제거 된 것을

package DAO; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.io.Reader; 
import java.io.StringReader; 
import java.io.StringWriter; 
import java.io.Writer; 
import java.nio.charset.StandardCharsets; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.*; 
import java.util.concurrent.CountDownLatch; 
public abstract class A { 
public class A4 { 
    public String teste4( int i){ 
     return (new String("teste")); 
    } 
    } 
public class A3 { 
    public String teste3( int i){ 
     return (new String("teste")); 
    } 
    public A4 teste33( int i){ 
     return (new A4()); 
    } 
    } 
public class A2 { 
    public A3 teste2( int i){ 
     return (new A3()); 
    } 
    } 
public class A1 { 
    public A2 teste1( int i){ 
     return (new A2()); 
    } 
    } 
    public int[] toIntArray( List<Integer> list){ 
    A1 q=new A1(); 
    Integer t=q.teste1((new A1()).teste1(0).teste2(0).teste33(0).teste4(0).length()).teste2(0).teste3(0).length(); 
    } 
} 

참고하고 명령 "정수 : 나는 AST이 소스 코드를 분석 할 때 는"CompilationUnit "의"toString "은 다음과 구조체 (AST 구조체)를 보여 t = q.teste1 .... "이 같은 줄에 쓰여있었습니다. 나에게 좋다. 따라서 "MethodInvocation"방문에서이 호출의 행 번호를 가져 오려고합니다. 이렇게하려면 내가 팔로우 내 astVisitors에서 소스 만들기 :

public boolean visit(final CompilationUnit node) { 
this.CompilationUnit=node; 
} 
public boolean visit(final MethodInvocation node) { 
Integer LineInFile=this.CompilationUnit.getLineNumber(node.getStartPosition()); 
} 

그러나 명령 "getLineNumber"을하지 AST 구조체에, 내 하드 드라이브에 소스 파일에 행 번호를 반환합니다. 이 경우 "q.teste1 ((new .....", 명령 "getLineNumber"는 줄 44와 줄 45를 반환하지만 줄 44 만 반환하면됩니다.) 줄을 어떻게 얻는 지 "AST의 구조체"의 숫자?

+0

왜 외부 파일이 아닌 "AST 구조체"에 "줄 번호"를 사용 하시겠습니까? 외부 파일은 사용자가 염려하거나 보았거나 인식 할 수있는 유일한 것입니다. 그녀는 AST 구조체에 전혀 관심이 없다. 그렇다면이 점은 무엇입니까? –

답변

1

CompilationUnit.toString 방법은 바로 NaiveASTFlattener 클래스를 사용하여 내부 AST의 대략적인 형식을하고있다.

대서양 표준시의 실제 내부 구조는 사물의 클래스 인스턴스의 그냥 큰 숫자입니다 Block, Comment, Statement 등 ... AST 자체에는 줄 번호가 없습니다. AST가 알고있는 유일한 줄 번호는 원본 소스 코드의 줄입니다.

+0

따라서 명령이 줄 44와 줄 45을 반환하는 이유는 무엇입니까? – user14272

+0

이 경우 라인의 측면에서 다음과 같은 반환을 기대 : 44, 45, 46, .... 53. – user14272

+0

'teste1'의 메소드 호출은 44 ~ 45 행에 불과합니다. 나머지 명령문은 다른 메소드 호출입니다. –

1

AST를 "추상 구문 트리"로 확장하여 시작할 수 있습니다.이 추상 구문은 소스 레벨 (= 콘크리트) 구문에 직접 연결되지 않음을 강조합니다. 화이트 스페이스와 같은 우발적 인 세부 사항을 생략하면서 의미 론적으로 관련된 측면을 포착하는 "모델"이라고 부를 수 있습니다. 되는 언어입니다 심지어 추상 구문을 변경하지 않고 키워드의 이름을 바꿀 수있는 등

그것은 사용자의 편의를 줄이 종료의 CompilationUnit 추가로 위치를 저장하는 것을, 그래서 그것이의 원래로 되돌려 AST 노드를 매핑 할 수 있습니다

소스 코드의 위치.