Переписать текст внутри лексера:
SingleLineComment
: '//' ~('\r' | '\n')* {setText("replacement");}
;
EDIT
Хорошо, вот небольшая демонстрация того, как вы можете отфильтровать определенные токены из языка:
SingleCommentStrip.g
grammar SingleCommentStrip;
parse returns [String str]
@init{StringBuilder builder = new StringBuilder();}
: (t=. {builder.append($t.text);})* EOF {$str = builder.toString();}
;
SingleLineComment
: '//' ~('\r' | '\n')* {skip();}
;
MultiLineComment
: '/*' .* '*/'
;
StringLiteral
: '"' ('\\' . | ~('"' | '\\' | '\r' | '\n'))* '"'
;
AnyOtherChar
: .
;
Main.java
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
SingleCommentStripLexer lexer = new SingleCommentStripLexer(new ANTLRFileStream("Test.java"));
SingleCommentStripParser parser = new SingleCommentStripParser(new CommonTokenStream(lexer));
String adjusted = parser.parse();
System.out.println(adjusted);
}
}
Test.java
// COMMENT
class Test {
/*
// don't remove
*/
// COMMENT AS WELL
String s = "/* don't // remove */ \" \\ me */ as well";
}
Теперь запустите демо:
java -cp antlr-3.3.jar org.antlr.Tool SingleCommentStrip.g
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar Main
который напечатает:
class Test {
/*
// don't remove
*/
String s = "/* don't // remove */ \" \\ me */ as well";
}
(т.е. однострочные комментарии удаляются)