2014-02-14 46 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的内容(并且你已经有了代码来抓取外面的第一条评论)