이 책에서는 (이전 코드 리팩토링을 위해) 주석 재 작성의 예를 제시합니다.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
책 코드는 마지막 주석 만 인쇄합니다. 이 코드를 어떻게 수정하여 이전 인쇄물 이후의 모든 주석이 지금 처리됩니까?
'cmtChannel.get (0)'은 오직 첫 코멘트 만 얻습니다. 가능한 모든 것을 반복하려고합니다. 값이 작동하지 않으면 선언을 반복하고 각 리터럴에서 "첫 번째 주석"을 가져올 수 있습니다. – petrbel
이 입력에 오류가 없는지 여부 Cymbol.g4를 참조하고 있다고 가정하면 변경되지 않습니다. – cantSleepNow