ParserATNSimulator.java 文件源码

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

项目:Scratch-ApuC 作者:
/**
 * Compute a target state for an edge in the DFA, and attempt to add the
 * computed state and corresponding edge to the DFA.
 *
 * @param dfa The DFA
 * @param previousD The current DFA state
 * @param t The next input symbol
 *
 * @return The computed target DFA state for the given input symbol
 * {@code t}. If {@code t} does not lead to a valid DFA state, this method
 * returns {@link #ERROR}.
 */
@NotNull
protected DFAState computeTargetState(@NotNull DFA dfa, @NotNull DFAState previousD, int t) {
    ATNConfigSet reach = computeReachSet(previousD.configs, t, false);
    if ( reach==null ) {
        addDFAEdge(dfa, previousD, t, ERROR);
        return ERROR;
    }

    // create new target state; we'll add to DFA after it's complete
    DFAState D = new DFAState(reach);

    int predictedAlt = getUniqueAlt(reach);

    if ( debug ) {
        Collection<BitSet> altSubSets = PredictionMode.getConflictingAltSubsets(reach);
        System.out.println("SLL altSubSets="+altSubSets+
                           ", configs="+reach+
                           ", predict="+predictedAlt+", allSubsetsConflict="+
                               PredictionMode.allSubsetsConflict(altSubSets)+", conflictingAlts="+
                           getConflictingAlts(reach));
    }

    if ( predictedAlt!=ATN.INVALID_ALT_NUMBER ) {
        // NO CONFLICT, UNIQUELY PREDICTED ALT
        D.isAcceptState = true;
        D.configs.uniqueAlt = predictedAlt;
        D.prediction = predictedAlt;
    }
    else if ( PredictionMode.hasSLLConflictTerminatingPrediction(mode, reach) ) {
        // MORE THAN ONE VIABLE ALTERNATIVE
        D.configs.conflictingAlts = getConflictingAlts(reach);
        D.requiresFullContext = true;
        // in SLL-only mode, we will stop at this state and return the minimum alt
        D.isAcceptState = true;
        D.prediction = D.configs.conflictingAlts.nextSetBit(0);
    }

    if ( D.isAcceptState && D.configs.hasSemanticContext ) {
        predicateDFAState(D, atn.getDecisionState(dfa.decision));
        if (D.predicates != null) {
            D.prediction = ATN.INVALID_ALT_NUMBER;
        }
    }

    // all adds to dfa are done after we've created full D state
    D = addDFAEdge(dfa, previousD, t, D);
    return D;
}
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号