2014-02-14 3 views
1

이 책에서는 (이전 코드 리팩토링을 위해) 주석 재 작성의 예를 제시합니다.antlr4에서 여러 주석 리팩토링

public void exitVarDecl(..) { // lexmagic/ShiftVarComments.java 
    Token semi = ctx.getStop(); 
    int i = semi.getTokenIndex(); 
    List<Token> cmtChannel = 
    tokens.getHiddenTokensToRight(i, CymbolLexer.COMMENTS); 
    if (cmtChannel!=null) { 
     Token cmt = cmtChannel.get(0); 
     if (cmt!=null) { 
      String txt = cmt.getText().substring(2); 
      String newCmt = "/* " + txt.trim() + " */\n"; 
      rewriter.insertBefore(ctx.start, newCmt); 
      rewriter.replace(cmt, "\n"); 
     } 
    } 
} 

불행히도 오래된 코드는 결코 쉬운 일이 아닙니다. 종종 사람들은 끝에서만이 아니라 명세서 사이에 코드를 넣습니다. 예 :

// here is a simple array initialization 
int index[2] = { // list of parameter indices 
    1,    // index for PARAM_A 
    4    // index for PARAM_D 
};    // finally terminating 

책 코드는 마지막 주석 만 인쇄합니다. 이 코드를 어떻게 수정하여 이전 인쇄물 이후의 모든 주석이 지금 처리됩니까?

+0

'cmtChannel.get (0)'은 오직 첫 코멘트 만 얻습니다. 가능한 모든 것을 반복하려고합니다. 값이 작동하지 않으면 선언을 반복하고 각 리터럴에서 "첫 번째 주석"을 가져올 수 있습니다. – petrbel

+0

이 입력에 오류가 없는지 여부 Cymbol.g4를 참조하고 있다고 가정하면 변경되지 않습니다. – cantSleepNow

답변

0

마지막 코멘트는 귀하의 varDecl 오른쪽에있는 유일한 의견입니다. varDecl은 "};까지 완료되지 않았습니다." 다른 의견은 VarDecl AST의 파스 트리 노드 사이에 흩어져 있습니다. 그들 모두를 모으려면, 그들 모두를 사냥해야합니다.

는 BufferedTokenStream에서

공개 목록 getTokens (INT 시작, INT 정지, 설정 유형)

봐 (CommonTokenStream의 슈퍼 클래스)를 가져 가라. exitVarDecl 메서드에서 ctx.getStart() 및 ctx.getStop()을 사용하여 첫 번째 두 매개 변수를 가져온 다음 CymbolLexer.COMMENTS가 포함 된 집합을 전달할 수 있습니다. 그게 당신에게 모든 코멘트를 줄 수 안에 당신의 varDecl (그리고 당신은 이미 첫 번째 코멘트를 잡아내는 코드가 있습니다.)