2014-02-14 75 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)'只有你第一條評論 - 嘗試遍歷所有可能的如果這不起作用,你可以遍歷聲明並在每個文字上獲取「first comment」 – petrbel

+0

這個輸入沒有錯誤嗎?假設你指的是Cymbol.g4並且它沒有改變。 – cantSleepNow

回答

0

最後一條評論是您的varDecl權利的唯一評論。你的varDecl不完整,直到「};」。您尋找的其他評論分散在VarDecl AST的分析樹節點之間(更像是之間)。爲了收集他們所有的人,你需要全部追捕他們。

看看

公開名單getTokens(INT開始,詮釋停止,集合類型)

在BufferedTokenStream(CommonTokenStream的超類)。在你的exitVarDecl方法中,你可以使用ctx.getStart()和ctx.getStop()來獲取前兩個參數,然後傳入一個包含CymbolLexer.COMMENTS的集合。這應該會給你所有裏面的你varDecl的內容(並且你已經有了代碼來抓取外面的第一條評論)