@Override
public ATNState getReachableTarget(ATNConfig source, Transition trans, int ttype) {
if (ttype == CaretToken.CARET_TOKEN_TYPE) {
ATNState target = null;
if (trans instanceof AtomTransition) {
AtomTransition at = (AtomTransition)trans;
if (getWordlikeTokenTypes().contains(at.label)) {
target = at.target;
}
} else if (trans instanceof SetTransition) {
SetTransition st = (SetTransition)trans;
boolean not = trans instanceof NotSetTransition;
// TODO: this could probably be done with an intersects method?
for (int t : getWordlikeTokenTypes().toArray()) {
if (!not && st.set.contains(t) || not && !st.set.contains(t)) {
target = st.target;
break;
}
}
} else if (trans instanceof RangeTransition) {
RangeTransition rt = (RangeTransition)trans;
// TODO: there must be a better algorithm here :)
int[] wordlikeTokenTypes = getWordlikeTokenTypes().toArray();
int lb = Arrays.binarySearch(wordlikeTokenTypes, rt.from);
int ub = Arrays.binarySearch(wordlikeTokenTypes, rt.to);
if (lb >= 0 || ub >= 0 || lb != ub) {
target = rt.target;
}
} else if (trans instanceof WildcardTransition) {
target = trans.target;
}
if (caretTransitions == null) {
caretTransitions = new LinkedHashMap<>();
}
List<Transition> configTransitions = caretTransitions.get(source);
if (configTransitions == null) {
configTransitions = new ArrayList<>();
caretTransitions.put(source, configTransitions);
}
configTransitions.add(trans);
return target;
}
return super.getReachableTarget(source, trans, ttype);
}
AbstractCompletionParserATNSimulator.java 文件源码
java
阅读 23
收藏 0
点赞 0
评论 0
项目:goworks
作者:
评论列表
文章目录