2016-10-13 61 views
0

在我的硬盤驅動器,我有如下來源:如何從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(); 
    } 
} 

注意,在這個文件(A.java)我們有很多的空行,而不一定是寫在同一行一個命令,在別人的話,它的也許分散在許多行中(參見「toIntArray」方法的最後一行)。 當我解析與AST此源代碼,的「CompilationUnit」「的toString」顯示後續的結構(AST STRUCT):

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(); 
    } 
} 

注意,在這種情況下,所有的空行被移除,並且命令「整數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. 所以,如何得到de行在「AST結構」多少?

+0

爲什麼要在「AST結構」中的「行號」而不是外部文件?外部文件是用戶唯一關心,或已經看到或將會識別的內容。她對AST結構毫無興趣,更不用說它存在的知識了。那麼這有什麼意義呢? –

回答

1

CompilationUnit.toString方法只是做使用NaiveASTFlattener類內部的AST的一個粗略的格式。

的AST的實際內部結構僅僅是大量的東西類實例像Block,Comment,Statement,...因爲AST本身沒有行號,AST唯一知道的行號是原始源代碼中的行號。

+0

因此,爲什麼命令返回44和45行? – user14272

+0

在這種情況下,根據線路,預計的跟隨回報:44,45,46,.... 53。 – user14272

+0

'teste1'的方法調用只是44到45行。該語句的其餘部分是其他方法的調用。 –

1

我們可能首先將AST擴展爲「抽象語法樹」,它強調我們沒有(直接)連接到源代碼級別(=具體)語法。您可以將其稱爲「模型」,它捕獲語義相關的方面,同時省略像空白這樣的意外細節。語言甚至可以重新命名它的關鍵字,而無需更改抽象語法等

這是爲了方便用戶的線端,一個CompilationUnit附加存儲的位置,因此它可以映射回一個AST節點到其原來在源代碼中的位置。