2010-08-23 2 views
3

내 목표는 자바 소스 파일을 분석하여 비 주석 코드가 포함 된 행 번호를 찾는 것입니다. StreamTokenizer는 slashStarComments()와 slashSlashComments()를 가지고 있기 때문에 주석과 코드가없는 라인을 걸러 내기 위해 사용할 것이라고 생각했습니다.StreamTokenizer를 사용하여 Java 주석 필터링

아래 프로그램은 주석이 아닌 각 줄에 대해 해당 줄에 줄 번호와 문자열 토큰을 인쇄합니다.

, Category.java을 그것은 시간의 가장을 작동하지만, 때로는하지 ... 예를 들어, 행 번호의 log4j에서 다음 소스 파일에 주석 행 144 태초 땐 생략 얻을 : http://logging.apache.org/log4j/1.2/xref/org/apache/log4j/Category.html 때때로 StreamTokenizer가 javadoc 주석 끝에있는 일부 행을 건너 뛴 것처럼 보입니다.

여기 내 코드입니다 : StreamTokenizer 그것처럼 행동하는 이유

 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.Reader; 
import java.io.StreamTokenizer; 

public class LinesWithCodeFinder { 
public static void main(String[] args) throws IOException { 
    String filePath = args[0]; 
    Reader reader = new FileReader(filePath); 
    StreamTokenizer tokenizer = new StreamTokenizer(reader); 
    tokenizer.slashStarComments(true); 
    tokenizer.slashSlashComments(true); 
    tokenizer.eolIsSignificant(false); 

    int ttype = 0; 
    int lastline = -1; 
    String s = ""; 
    while (ttype != StreamTokenizer.TT_EOF) { 
    ttype = tokenizer.nextToken(); 
    int lineno = tokenizer.lineno(); 
    String sval = ttype == StreamTokenizer.TT_WORD ? tokenizer.sval : ""; 
    if (lineno == lastline) { 
    s += " " + sval; 
    } 
    else { 
    if (lastline != -1) 
    System.out.println(lastline + "\t" + s); 
    s = sval; 
    } 
    lastline = lineno; 
    } 
} 
} 
  1. 사람이 이해합니까?

  2. 의견을 필터링하는 방법에 대한 대안 아이디어는 인정 될 것입니다.

답변

1

주석 내의 단락이 줄 수를 벗어납니다. 137에서 시작 ...

... 두 빈 줄이 줄 수를 2 줄씩 이동합니다. 따라서 146 행은 144 행 등으로보고됩니다. 그러나 확실하지는 않습니다. 주석을 다음과 같이 변경하면 :

/** 
    This constructor created a new <code>Category</code> instance and 
    sets its name.  
    <p>It is intended to be used by sub-classes only. You should not 
    create categories directly.  
    @param name The name of the category. 
*/ 

... 주석 뒤에 줄 번호가 올바르게보고됩니다.

1

내가 StreamTokenizer에서 버그를 발견했다고 생각합니다! 나는 클래스를 복사 MyStreamTokenizer로 이름을 변경하고,에서 라인 (700)을 변경 :

while (c == '\n') 

if (c == '\n') 

와 그것을 작동합니다!

@author James Gosling 
@since JDK1.0 
0

의 중앙 받는다는의 repo에서 사용할 수있는 항아리와 소스가, 버그 4517649는 "닫힘, 수정되지 않음"으로 표시. http://localhost/hawk.html?gwt.codesvr=127.0.0.1:9997&locale=en

인해 호환성 구속에 우리는 더이 기존에게 클래스를 진화하지 않습니다.xxxxx는이 xxxxx는 2002년 2월 14일

해결 방법 중 하나를

:-(주어지지 @
관련 문제