readEdges method
void
readEdges(
- ATN atn,
- dynamic sets
)
Implementation
void readEdges(ATN atn, sets) {
final nedges = readInt();
for (var i = 0; i < nedges; i++) {
final src = readInt();
final trg = readInt();
final ttype = TransitionType.values[readInt()];
final arg1 = readInt();
final arg2 = readInt();
final arg3 = readInt();
final trans = edgeFactory(atn, ttype, src, trg, arg1, arg2, arg3, sets);
// System.out.println("EDGE "+trans.getClass().getSimpleName()+" "+
// src+"->"+trg+
// " "+Transition.serializationNames[ttype]+
// " "+arg1+","+arg2+","+arg3);
final srcState = atn.states[src]!;
srcState.addTransition(trans);
}
// edges for rule stop states can be derived, so they aren't serialized
for (var state in atn.states) {
if (state == null) {
continue;
}
for (var i = 0; i < state.numberOfTransitions; i++) {
final t = state.transition(i);
if (t is RuleTransition) {
final ruleTransition = t;
var outermostPrecedenceReturn = -1;
if (atn.ruleToStartState[ruleTransition.target.ruleIndex]
.isLeftRecursiveRule) {
if (ruleTransition.precedence == 0) {
outermostPrecedenceReturn = ruleTransition.target.ruleIndex;
}
}
final returnTransition = EpsilonTransition(
ruleTransition.followState, outermostPrecedenceReturn);
atn.ruleToStopState[ruleTransition.target.ruleIndex]
.addTransition(returnTransition);
}
}
}
for (var state in atn.states) {
if (state is BlockStartState) {
// we need to know the end state to set its start state
if (state.endState == null) {
throw StateError('');
}
// block end states can only be associated to a single block start state
if (state.endState!.startState != null) {
throw StateError('');
}
state.endState!.startState = state;
}
if (state is PlusLoopbackState) {
final loopbackState = state;
for (var i = 0; i < loopbackState.numberOfTransitions; i++) {
final target = loopbackState.transition(i).target;
if (target is PlusBlockStartState) {
target.loopBackState = loopbackState;
}
}
} else if (state is StarLoopbackState) {
final loopbackState = state;
for (var i = 0; i < loopbackState.numberOfTransitions; i++) {
final target = loopbackState.transition(i).target;
if (target is StarLoopEntryState) {
target.loopBackState = loopbackState;
}
}
}
}
}