如何在ANTLR的visitor模式下判断token对应的备选分支?
ANTLR Visitor判断arg分支的两种实现方案
方案1:调用生成上下文的内置判定方法
ANTLR4编译你的语法文件后,会自动为arg规则的每个备选分支生成对应判定方法,可直接调用:
在生成的RuleExpressionParser.ArgContext类中,自带4个分支判定方法:
isSTRING():返回true则当前arg命中STRING分支isINTEGER():返回true则当前arg命中INTEGER分支isBOOLEAN():返回true则当前arg命中BOOLEAN分支isexpression():返回true则当前arg命中嵌套expression分支
以下为Java版本的Visitor实现示例:
@Override public Object visitArg(RuleExpressionParser.ArgContext ctx) { if (ctx.isSTRING()) { // 字符串处理逻辑,可自行去除前后引号 String rawStr = ctx.STRING().getText(); return rawStr.substring(1, rawStr.length() - 1); } else if (ctx.isINTEGER()) { // 整数处理逻辑 return Integer.parseInt(ctx.INTEGER().getText()); } else if (ctx.isBOOLEAN()) { // 布尔值处理逻辑 return Boolean.parseBoolean(ctx.BOOLEAN().getText()); } else if (ctx.isexpression()) { // 嵌套表达式递归访问即可 return visitExpression(ctx.expression()); } return null; }
方案2:通过子节点非空判断
部分语言的ANTLR生成器如果没有生成isXXX系列方法,可以直接判断对应类型的子节点是否存在,逻辑和方案1完全一致:
- 判定STRING:
ctx.STRING() != null - 判定INTEGER:
ctx.INTEGER() != null - 判定BOOLEAN:
ctx.BOOLEAN() != null - 判定expression:
ctx.expression() != null
补充说明
你当前语法中STRING规则使用"作为边界,如果你的输入文本实际是普通双引号包裹的字符串,建议把STRING规则改为STRING: '"' .+? '"';,避免匹配异常,同时添加非贪婪匹配符?防止多个字符串被错误合并。
内容的提问来源于stack exchange,提问作者Gao
相关产品推荐
相关产品推荐

