Ich versuche, ANTLR zu erlernen und es gleichzeitig für ein aktuelles Projekt zu verwenden.
Ich habe den Punkt erreicht, an dem ich den Lexer auf einem Stück Code laufen lassen und ihn in einen CommonTokenStream ausgeben kann. Dies funktioniert gut, und ich habe überprüft, dass der Quelltext in die entsprechenden Token aufgebrochen wird.
Nun möchte ich in der Lage sein, den Text bestimmter Token in diesem Stream zu ändern und den nun geänderten Quellcode anzuzeigen.
Ich habe es zum Beispiel 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, den Text aller Identifier-Token auf das String-Literal "V" zu setzen.
-
Warum werden meine Änderungen am Text des Tokens nicht berücksichtigt, wenn ich tokens.toString() aufrufe?
-
Woher soll ich die verschiedenen Token-Typ-IDs kennen? Ich bin mit meinem Debugger durchgegangen und habe gesehen, dass die ID für die IDENTIFIER-Token "4" ist (daher meine Konstante oben). Aber woher hätte ich das sonst wissen sollen? Gibt es eine andere Möglichkeit der Zuordnung von Token-Typ-IDs zum Token-Namen?
EDIT:
Eine Sache, die mir wichtig ist, ist, dass ich möchte, dass die Token ihre ursprüngliche Start- und Endposition behalten. Das heißt, ich möchte nicht, dass sie ihre neuen Positionen widerspiegeln, wenn die Variablennamen in "V" geändert werden. Auf diese Weise weiß ich, wo sich die Zeichen im ursprünglichen Ausgangstext befanden.
0 Stimmen
Ich frage mich nur - ist es eine Voraussetzung, dass Sie ANTLR für diese verwenden?