¿Cómo obtengo el texto original que coincide con una regla antlr4?


Usando la gramática Java 7 https://github.com/antlr/grammars-v4/blob/master/java7/Java7.g4 Quiero encontrar métodos con un nombre específico y luego simplemente imprimir ese método. Veo que puedo usar la regla methodDeclaration cuando concuerdo. Así que subclase Java7BaseListener y sobrescribo este método de escucha:

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

¿Cómo obtengo el texto original? ctx.getText() me da una cadena con todos los espacios en blanco eliminados. Quiero los comentarios y el formato original.

Author: monty0, 2013-05-02

2 answers

La clase CharStream de ANTLR tiene un método getText(Interval interval) que devolverá la fuente original en el rango de give. El objeto Context tiene métodos para obtener el principio y el final. Asumiendo que tienes un campo en tu oyente llamado input que tiene el CharStream siendo analizado, puedes hacer esto:

    int a = ctx.start.getStartIndex();
    int b = ctx.stop.getStopIndex();
    Interval interval = new Interval(a,b);
    input.getText(interval);
 36
Author: monty0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-02 16:37:07

Demo:

SqlBaseParser.QueryContext queryContext = context.query();
int a = queryContext.start.getStartIndex();
int b = queryContext.stop.getStopIndex();
Interval interval = new Interval(a,b);
String viewSql = context.start.getInputStream().getText(interval);
 0
Author: ideal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-28 03:23:55