private bool TryReadFlowControl(UpperString text, out ActorFlowControl flowControl) { flowControl = null; if (!TryGetStateBranch(text, out ActorStateBranch branchType)) { return(false); } switch (branchType) { case ActorStateBranch.Goto: flowControl = ReadGotoLabel(); break; case ActorStateBranch.Loop: if (lastSeenLabelOrNull == null) { throw MakeException("Cannot loop when no label has been defined yet"); } flowControl = new ActorFlowControl(branchType, lastSeenLabelOrNull); break; default: flowControl = new ActorFlowControl(branchType); break; } return(true); }
private void ApplyStateBranch(ActorFlowControl flowControl) { if (justSeenLabelOrNull != null) { HandleLabelOverride(justSeenLabelOrNull, flowControl); } else { GetLastFrameOrThrow().FlowControl = flowControl; } }
private void HandleLabelOverride(UpperString label, ActorFlowControl flowControl) { switch (flowControl.FlowType) { case ActorStateBranch.Goto: case ActorStateBranch.Stop: currentDefinition.States.flowOverrides[label] = flowControl; break; default: throw MakeException("Flow control override after a label must be either 'Stop' or 'Goto'"); } }