私はANTLRを学び、同時にそれを現在のプロジェクトに使用しようとしています。
コードのチャンクに対してレクサーを実行し、それを CommonTokenStream に出力できるようになりました。これは正常に機能しており、ソース テキストが適切なトークンに分割されていることを確認しました。
ここで、このストリーム内の特定のトークンのテキストを変更し、変更されたソース コードを表示できるようにしたいと考えています。
たとえば、私は試しました:
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());
}
}
すべての識別子トークンのテキストを文字列リテラル「V」に設定しようとしています。
tokens.toString() を呼び出したときに、トークンのテキストへの変更が反映されないのはなぜですか?
さまざまなトークン タイプ ID を知るにはどうすればよいですか? デバッガーを使用して調べたところ、IDENTIFIER トークンの ID が「4」であることがわかりました (したがって、定数が一番上に表示されます)。しかし、そうでなければどうやってそれを知ったでしょうか?トークン タイプ ID をトークン名にマッピングする他の方法はありますか?
編集:
私にとって重要なことの 1 つは、トークンに元の開始位置と終了位置を持たせたいということです。つまり、変数名を「V」に変更して新しい位置を反映させたくありません。これは、トークンが元のソース テキストのどこにあったかを知るためです。