在ANTLR4中如何获取Token的实际输入字符串值(保留大小写)
ANTLR4获取Token原始输入字符串的方法
问题场景
在ANTLR4中定义了如下语法规则:
// grammar root: TRUE eof; // lexer TRUE: T R U E; fragment T: [tT]; fragment R: [rR]; fragment U: [uU]; fragment E: [eE];
当用户输入true时,生成的解析树结构如下:
root / \ TRUE EOF
目前仅能获取到TRUE这个Token标识,请问是否有办法获取用户输入的实际字符串(如true,保留原有大小写)?
解决方案
完全可以,ANTLR4的Token对象内置了原始输入的文本内容,无需修改语法规则,直接通过Token的API即可获取:
- Java环境:调用Token的
getText()方法,即可拿到对应Token的原始输入字符串 - Python环境:访问Token的
text属性即可获取
Java示例代码
// 假设已完成解析,获取到root节点的ParseTree ParseTree root = parser.root(); // 获取TRUE对应的Token(也可通过遍历解析树节点获取) Token trueToken = ctx.TRUE().getSymbol(); String originalInput = trueToken.getText(); // originalInput即为用户输入的原始字符串(如"true"、"TRUE"或"True"等)
监听器/访问者模式示例
如果使用监听器或访问者模式处理解析树,可在对应节点中直接获取Token并提取文本:
@Override public Void visitRoot(RootContext ctx) { Token trueToken = ctx.TRUE().getSymbol(); String originalText = trueToken.getText(); // 对原始文本进行后续处理 return visitChildren(ctx); }
原理很简单:ANTLR4词法分析器生成Token时,会完整保留输入文本的原始内容,TRUE只是该Token的类型标识,实际输入的字符串始终存储在Token的文本属性中。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

