Ich versuche ANTLR zu lernen und gleichzeitig für ein aktuelles Projekt zu verwenden.Wie kann ich den Text von Tokens in einem CommonTokenStream mit ANTLR ändern?
Ich bin zu dem Punkt gekommen, wo ich den Lexer auf einem Stück Code ausführen und es an einen CommonTokenStream ausgeben kann. Dies funktioniert einwandfrei, und ich habe überprüft, dass der Quelltext in die entsprechenden Token aufgeteilt wird.
Jetzt möchte ich in der Lage sein, den Text bestimmter Token in diesem Stream zu ändern und den jetzt geänderten Quellcode anzuzeigen.
Zum Beispiel habe ich versucht:
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());
}
}
Ich versuche, alle Identifier Token Text auf die Zeichenfolge zu setzen wörtliche "V".
Warum werden meine Änderungen am Token-Text nicht wiedergegeben, wenn ich tokens.toString() aufruft?
Wie soll ich die verschiedenen Token Type IDs kennen? Ich ging mit meinem Debugger durch und sah, dass die ID für die IDENTIFIER Tokens "4" war (daher meine Konstante an der Spitze). Aber wie hätte ich das sonst wissen sollen? Gibt es eine andere Möglichkeit, Token-Typ-IDs dem Token-Namen zuzuordnen?
EDIT:
Eine Sache, die mir wichtig ist, ist wünsche ich für die Tokens ihren ursprünglichen Start- und Zielzeichenpositionen haben. Das heißt, ich möchte nicht, dass sie ihre neuen Positionen mit den auf "V" geänderten Variablennamen widerspiegeln. So weiß ich, wo sich die Token im ursprünglichen Quelltext befanden.
Einfach fragen - ist es erforderlich, dass Sie ANTLR verwenden dafür? – cowboydan