Estoy tratando de aprender ANTLR y al mismo tiempo usarlo para un proyecto actual.¿Cómo puedo modificar el texto de los tokens en un CommonTokenStream con ANTLR?
He llegado al punto en el que puedo ejecutar el lexer en un fragmento de código y enviarlo a CommonTokenStream. Esto está funcionando bien, y he verificado que el texto fuente está dividido en los tokens apropiados.
Ahora, me gustaría poder modificar el texto de ciertos tokens en esta secuencia y mostrar el código fuente ahora modificado.
Por ejemplo, yo he probado:
import org.antlr.runtime.*;
import java.util.*;
public class LexerTest
{
public static final int IDENTIFIER_TYPE = 4;
public static void main(String[] args)
{
String input = "public static void main(String[] args) { int myVar = 0; }";
CharStream cs = new ANTLRStringStream(input);
JavaLexer lexer = new JavaLexer(cs);
CommonTokenStream tokens = new CommonTokenStream();
tokens.setTokenSource(lexer);
int size = tokens.size();
for(int i = 0; i < size; i++)
{
Token token = (Token) tokens.get(i);
if(token.getType() == IDENTIFIER_TYPE)
{
token.setText("V");
}
}
System.out.println(tokens.toString());
}
}
Estoy tratando de establecer texto de todo símbolo identificador de la cadena literal "V".
¿Por qué mis cambios en el texto del token no se reflejan cuando llamo a tokens.toString()?
¿Cómo se supone que debo conocer los diversos ID de tipo de token? Caminé con mi depurador y vi que la ID para los tokens del IDENTIFICADOR era "4" (de ahí mi constante en la parte superior). ¿Pero cómo habría sabido eso? ¿Hay alguna otra forma de asignar identificadores de tipo de token al nombre del token?
EDIT:
Una cosa que es importante para mí es que desear para las fichas tengan sus posiciones de inicio y final de caracteres originales. Es decir, no quiero que reflejen sus nuevas posiciones con los nombres de variables cambiados a "V". Esto es para que sepa dónde estaban los tokens en el texto fuente original.
preguntaba - ¿es un requisito que utilice antlr ¿para esto? – cowboydan