我正在尝试学习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