2014-02-19 14 views
5

Ich benutze Antlr4 und Java7-Grammatik (source) zum Ändern einer Eingabe-Java-Quelldatei. Genauer gesagt verwende ich die TokenStreamRewriter-Klasse, um einige Token zu modifizieren. Der folgende Code ist ein Beispiel, das zeigt, wie die Token modifiziert werden:ANTLR4: TokenStreamRewriter-Ausgabe hat kein richtiges Format (entfernt Leerzeichen)

public class TestListener extends JavaBaseListener {  
    private TokenStreamRewriter rewriter; 
    rewriter = new TokenStreamRewriter(tokenStream); 
    rewriter.replace(ctx.getStart(), ctx.getStop(), "someText"); 
} 

Wenn ich den veränderten Quellcode zu drucken, die weißen Leerzeichen und Tabulatoren werden entfernt und das neue Format der Quelldatei ist wie folgt:

importjava.util.ArrayList; publicclassMain {publicstaticvoidmain (String [] args {MyTimertimer = newMyTimer();}}.

ich verwende extractor.getText() für sie zurück Drucken

Ist das ein Problem der Grammatik verwendet oder sollte ich ein anderes m verwenden ethod aus der TokenStreamRewriter-Klasse?

Antwort

14

Das Problem ist, dass der Lexer keinen Leerraum an den Parser sendet, was bedeutet, dass der Rewrite-Stream auch keinen Zugriff auf die Token hat. Es ist wegen des Sprungs Lexer Befehls:

WS : [ \t\r\n\u000C]+ -> skip ;

Sie haben all jene -> channel(HIDDEN) zu ändern, die sie an den Parser auf einem anderen Kanal senden, sie in dem Token-Strom zu machen, aber unsichtbar für die Parser.

+0

Vielen Dank für Ihre schnelle Antwort. Die vorgeschlagene Änderung in der Datei (Java.g4) hat gut funktioniert. –