2013-05-02 2 views
24

Uso della grammatica Java 7 https://github.com/antlr/grammars-v4/blob/master/java7/Java7.g4 Desidero trovare metodi con un nome specifico e quindi stampare semplicemente tale metodo. Vedo che posso utilizzare la regola methodDeclaration quando corrisponde. Così ho sottoclasse Java7BaseListener e ignorare questo metodo ascoltatore:Come ottengo il testo originale a cui corrisponde una regola antlr4?

@Override public void enterMethodDeclaration(Java7Parser.MethodDeclarationContext ctx) { } 

Come faccio ad avere il testo originale fuori? ctx.getText() mi dà una stringa con tutti gli spazi bianchi spogliati. Voglio i commenti e la formattazione originale.

risposta

32

La classe CharStream di ANTLR ha un metodo getText(Interval interval) che restituirà la sorgente originale nell'intervallo. L'oggetto Context ha metodi per ottenere l'inizio e la fine. Supponendo di avere un campo nel listener chiamato input che ha la CharStream essere analizzato, si può fare questo:

int a = ctx.start.getStartIndex(); 
    int b = ctx.stop.getStopIndex(); 
    Interval interval = new Interval(a,b); 
    input.getText(interval); 
+13

Se non si dispone di accesso o non si desidera tenere traccia del 'CharStream', usa 'ctx.start.getInputStream()' per recuperarlo. – Peter

+0

CharStream input = ctx.start.getInputStream(); input.getText (intervallo); Errori di runtime .checkBoundsOffCount (String.java:3101) –

+0

E dove non fallisce rimuove ancora gli spazi bianchi –