如果我有这条规则:
player : SELF | OPP;
SELF : 'self';
OPP : 'opp' | 'opponent';
是否可以在没有SELF或OPP令牌的情况下访问播放器规则?
这是我的代码更具体:
@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;
}
答案 0 :(得分:3)
访问者不访问规则 - 它访问解析树节点。除非相应规则(或替代子规则)的所有符号与源令牌实例序列有效匹配,否则不会创建节点并将其添加到解析树。因此,通常情况下,“此处”无法访问。
当然,如果在构造之后手动修改了解析树,则无法保证节点的子节点对应于解析器规则对该节点的定义。