ParserATNFactory.java 文件源码

java
阅读 21 收藏 0 点赞 0 评论 0

项目:codebuff 作者:
public Handle elemList(List<Handle> els) {
    int n = els.size();
    for (int i = 0; i < n - 1; i++) {   // hook up elements (visit all but last)
        Handle el = els.get(i);
        // if el is of form o-x->o for x in {rule, action, pred, token, ...}
        // and not last in alt
           Transition tr = null;
           if ( el.left.getNumberOfTransitions()==1 ) tr = el.left.transition(0);
           boolean isRuleTrans = tr instanceof RuleTransition;
           if ( el.left.getStateType() == ATNState.BASIC &&
            el.right.getStateType()== ATNState.BASIC &&
            tr!=null && (isRuleTrans && ((RuleTransition)tr).followState == el.right || tr.target == el.right) )
        {
            // we can avoid epsilon edge to next el
            if ( isRuleTrans ) ((RuleTransition)tr).followState = els.get(i+1).left;
               else tr.target = els.get(i+1).left;
            atn.removeState(el.right); // we skipped over this state
        }
        else { // need epsilon if previous block's right end node is complicated
            epsilon(el.right, els.get(i+1).left);
        }
    }
    Handle first = els.get(0);
    Handle last = els.get(n -1);
    if ( first==null || last==null ) {
        g.tool.errMgr.toolError(ErrorType.INTERNAL_ERROR, "element list has first|last == null");
    }
    return new Handle(first.left, last.right);
}
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号