Java 类org.antlr.v4.runtime.atn.AtomTransition 实例源码

项目:codebuff    文件:LexerATNFactory.java   
/** For a lexer, a string is a sequence of char to match.  That is,
 *  "fog" is treated as 'f' 'o' 'g' not as a single transition in
 *  the DFA.  Machine== o-'f'->o-'o'->o-'g'->o and has n+1 states
 *  for n characters.
 */
@Override
public Handle stringLiteral(TerminalAST stringLiteralAST) {
    String chars = stringLiteralAST.getText();
    chars = CharSupport.getStringFromGrammarStringLiteral(chars);
    int n = chars.length();
    ATNState left = newState(stringLiteralAST);
    ATNState prev = left;
    ATNState right = null;
    for (int i=0; i<n; i++) {
        right = newState(stringLiteralAST);
        prev.addTransition(new AtomTransition(right, chars.charAt(i)));
        prev = right;
    }
    stringLiteralAST.atnState = left;
    return new Handle(left, right);
}
项目:codebuff    文件:LexerATNFactory.java   
@Override
public Handle tokenRef(TerminalAST node) {
    // Ref to EOF in lexer yields char transition on -1
    if ( node.getText().equals("EOF") ) {
        ATNState left = newState(node);
        ATNState right = newState(node);
        left.addTransition(new AtomTransition(right, IntStream.EOF));
        return new Handle(left, right);
    }
    return _ruleRef(node);
}
项目:codebuff    文件:ParserATNFactory.java   
/** From label {@code A} build graph {@code o-A->o}. */

    @Override
    public Handle tokenRef(TerminalAST node) {
        ATNState left = newState(node);
        ATNState right = newState(node);
        int ttype = g.getTokenType(node.getText());
        left.addTransition(new AtomTransition(right, ttype));
        node.atnState = left;
        return new Handle(left, right);
    }
项目:codebuff    文件:ParserATNFactory.java   
/** Add an EOF transition to any rule end ATNState that points to nothing
    *  (i.e., for all those rules not invoked by another rule).  These
    *  are start symbols then.
 *
 *  Return the number of grammar entry points; i.e., how many rules are
 *  not invoked by another rule (they can only be invoked from outside).
 *  These are the start rules.
    */
public int addEOFTransitionToStartRules() {
    int n = 0;
    ATNState eofTarget = newState(null); // one unique EOF target for all rules
    for (Rule r : g.rules.values()) {
        ATNState stop = atn.ruleToStopState[r.index];
        if ( stop.getNumberOfTransitions()>0 ) continue;
        n++;
        Transition t = new AtomTransition(eofTarget, Token.EOF);
        stop.addTransition(t);
    }
    return n;
}
项目:goworks    文件:GroupHighlighterLexer.java   
private static Transition createSetTransition(ATNState target, IntervalSet set) {
    if (set.getIntervals().size() == 1) {
        Interval interval = set.getIntervals().get(0);
        if (interval.a == interval.b) {
            return new AtomTransition(target, interval.a);
        } else {
            return new RangeTransition(target, interval.a, interval.b);
        }
    } else {
        return new SetTransition(target, set);
    }
}
项目:goworks    文件:TemplateLexer.java   
private static Transition createSetTransition(ATNState target, IntervalSet set) {
    if (set.getIntervals().size() == 1) {
        Interval interval = set.getIntervals().get(0);
        if (interval.a == interval.b) {
            return new AtomTransition(target, interval.a);
        } else {
            return new RangeTransition(target, interval.a, interval.b);
        }
    } else {
        return new SetTransition(target, set);
    }
}
项目:antlrworks2    文件:GroupHighlighterLexer.java   
private static Transition createSetTransition(ATNState target, IntervalSet set) {
    if (set.getIntervals().size() == 1) {
        Interval interval = set.getIntervals().get(0);
        if (interval.a == interval.b) {
            return new AtomTransition(target, interval.a);
        } else {
            return new RangeTransition(target, interval.a, interval.b);
        }
    } else {
        return new SetTransition(target, set);
    }
}
项目:antlrworks2    文件:TemplateLexer.java   
private static Transition createSetTransition(ATNState target, IntervalSet set) {
    if (set.getIntervals().size() == 1) {
        Interval interval = set.getIntervals().get(0);
        if (interval.a == interval.b) {
            return new AtomTransition(target, interval.a);
        } else {
            return new RangeTransition(target, interval.a, interval.b);
        }
    } else {
        return new SetTransition(target, set);
    }
}
项目:goworks    文件:AbstractCompletionParserATNSimulator.java   
@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);
}
项目:antlrworks2    文件:AbstractCompletionParserATNSimulator.java   
@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);
}