¿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.
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);
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);
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