我正在嘗試學習ANTLR,並同時將它用於當前項目。如何使用ANTLR修改CommonTokenStream中令牌的文本?
我已經到了可以在一段代碼上運行詞法分析器並將其輸出到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映射到令牌名稱?
編輯:
有一件事對我來說重要的是我希望的標記有原來的開始和結束字符位置。也就是說,我不希望他們反映他們的新職位,變量名稱更改爲「V」。這就是我知道令牌在原始源文本中的位置。
只是想知道 - 是您使用ANTLR的要求爲了這? – cowboydan 2013-12-18 22:11:23