我正在尝试学习 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 映射到令牌名称?
编辑:
对我来说很重要的一件事是我希望标记具有其原始的开始和结束字符位置。也就是说,我不希望他们通过将变量名称更改为“V”来反映他们的新位置。这样我就知道标记在原始源文本中的位置。