是否可以在没有语法中定义的任何词法分析器标记的情况下访问规则?
Is it possible to visit a rule without any of the lexer tokens defined in grammar?
如果我有这条规则:
player : SELF | OPP;
SELF : 'self';
OPP : 'opp' | 'opponent';
是否可以在没有 SELF 或 OPP 令牌的情况下访问 player 规则?
我的代码更具体一些:
@Override
public Object visitPlayer(PlayerContext ctx) {
if (ctx.SELF() != null) {
return BehaviorExecutor.this.game.getPlayerStates()
.get(BehaviorExecutor.this.selfIndex);
} else if (ctx.OPP() != null) {
return BehaviorExecutor.this.game.getPlayerStates()
.get(BehaviorExecutor.this.oppIndex);
}
//is it possible to get to here?
BehaviorExecutor.this
.logger.log("Neither SELF nor OPP token found when visiting player rule.");
return null;
}
访问者不访问规则 -- 它访问解析树节点。除非相应规则(或替代子规则)的所有符号都与源令牌实例序列有效匹配,否则不会创建节点并将其添加到解析树中。因此,通常 'here' 无法访问。
当然,如果解析树是在构造后手动修改的,那么就不能保证一个节点的子节点对应于该节点的解析器规则定义。
如果我有这条规则:
player : SELF | OPP;
SELF : 'self';
OPP : 'opp' | 'opponent';
是否可以在没有 SELF 或 OPP 令牌的情况下访问 player 规则?
我的代码更具体一些:
@Override
public Object visitPlayer(PlayerContext ctx) {
if (ctx.SELF() != null) {
return BehaviorExecutor.this.game.getPlayerStates()
.get(BehaviorExecutor.this.selfIndex);
} else if (ctx.OPP() != null) {
return BehaviorExecutor.this.game.getPlayerStates()
.get(BehaviorExecutor.this.oppIndex);
}
//is it possible to get to here?
BehaviorExecutor.this
.logger.log("Neither SELF nor OPP token found when visiting player rule.");
return null;
}
访问者不访问规则 -- 它访问解析树节点。除非相应规则(或替代子规则)的所有符号都与源令牌实例序列有效匹配,否则不会创建节点并将其添加到解析树中。因此,通常 'here' 无法访问。
当然,如果解析树是在构造后手动修改的,那么就不能保证一个节点的子节点对应于该节点的解析器规则定义。