From 843780586f522feafdc12524e6d6221f99e84a67 Mon Sep 17 00:00:00 2001 From: Zihan Chen Date: Mon, 13 Nov 2017 02:44:02 -0800 Subject: [PATCH] Update TODO_StateMachine.md --- TODO_StateMachine.md | 208 ++++++++++++++++++++++--------------------- 1 file changed, 108 insertions(+), 100 deletions(-) diff --git a/TODO_StateMachine.md b/TODO_StateMachine.md index fd251f47..984aa2b2 100644 --- a/TODO_StateMachine.md +++ b/TODO_StateMachine.md @@ -203,7 +203,7 @@ class Calculator } break; } - if (coroutine.Status == ::system::CoroutineStatus::Waiting) +            if (coroutine.Status != ::system::CoroutineStatus::Stopped) { var currentCoroutine = coroutine; currentCoroutine.Status.Resume(true, result); @@ -236,127 +236,135 @@ class Calculator previousCoroutine = coroutine; coroutine = $coroutine { - var state : State = startState; - - while (true) + try { - var currentState = state; - state = ::Calculator::State::Invalid; - switch (currentState) + var state : State = startState; + + while (true) { - case ::Calculator::State::Start : + var currentState = state; + state = ::Calculator::State::Invalid; + switch (currentState) { - state = ::Calculator::State::Calculate; - goto OUT_OF_STATES; // goto can only jump to the end of a containing block - return; - } - case ::Calculator::State::Digits : - { - $pause; - switch (input) + case ::Calculator::State::Start : { - case ::Calculator::Input::Digit - { - input = ::Calculator::Input::Invalid; - var i = i; - Value = Value & i; - state = ::Calculator::State::Digits; - goto OUT_OF_STATES; - } + state = ::Calculator::State::Calculate; + goto OUT_OF_STATES; // goto can only jump to the end of a containing block + goto OUT_OF_STATE_MACHINE; } - return; - } - case ::Calculator::State::Integer : - { - $pause; - switch (input) + case ::Calculator::State::Digits : { - case ::Calculator::Input::Digit + $pause; + switch (input) { - input = ::Calculator::Input::Invalid; - var i = i; - if (newNumber) // TODO: Declare the parameter - { - Value = i; - } - else + case ::Calculator::Input::Digit { + input = ::Calculator::Input::Invalid; + var i = i; Value = Value & i; + state = ::Calculator::State::Digits; + goto OUT_OF_STATES; } - state = ::Calculator::State::Digits; - goto OUT_OF_STATES; } + goto OUT_OF_STATE_MACHINE; } - return; - } - case ::Calculator::State::Number : - { - // TODO: Pass the parameter (true) - CreateCoroutine(::Calculator::State::Integer); - $pause; - $pause; - switch (input) + case ::Calculator::State::Integer : { - case ::Calculator::::Input::Dot: + $pause; + switch (input) { - input = ::Calculator::Input::Invalid; - Value = Value & "."; - } - default: - { - return; // pass_and_return + case ::Calculator::Input::Digit + { + input = ::Calculator::Input::Invalid; + var i = i; + if (newNumber) // TODO: Declare the parameter + { + Value = i; + } + else + { + Value = Value & i; + } + state = ::Calculator::State::Digits; + goto OUT_OF_STATES; + } } + goto OUT_OF_STATE_MACHINE; } - // TODO: Pass the parameter (false) - CreateCoroutine(::Calculator::State::Integer); - $pause; - } - case ::Calculator::State::Calculate : - { - CreateCoroutine(::Calculator::State::Number); - $pause; - $pause; - switch (input) + case ::Calculator::State::Number : { - case ::Calculator::::Input::Add: + // TODO: Pass the parameter (true) + CreateCoroutine(::Calculator::State::Integer); + $pause; + $pause; + switch (input) { - input = ::Calculator::Input::Invalid; - Calculate(); op = "+"; - } - case ::Calculator::::Input::Mul: - { - input = ::Calculator::Input::Invalid; - Calculate(); op = "*"; - } - case ::Calculator::::Input::Equal: - { - input = ::Calculator::Input::Invalid; - Calculate(); op = "="; - } - case ::Calculator::::Input::Clear: - { - input = ::Calculator::Input::Invalid; - valueFirst = ""; - op = ""; - Value = "0"; - } - case ::Calculator::::Input::Digit: - { - input = ::Calculator::Input::Invalid; - raise "Calculator::Digit cannot be called at this moment."; - } - case ::Calculator::::Input::Dot: - { - input = ::Calculator::Input::Invalid; - raise "Calculator::Dot cannot be called at this moment."; + case ::Calculator::::Input::Dot: + { + input = ::Calculator::Input::Invalid; + Value = Value & "."; + } + default: + { + goto OUT_OF_STATE_MACHINE; // pass_and_return + } } + // TODO: Pass the parameter (false) + CreateCoroutine(::Calculator::State::Integer); + $pause; + } + case ::Calculator::State::Calculate : + { + CreateCoroutine(::Calculator::State::Number); + $pause; + $pause; + switch (input) + { + case ::Calculator::::Input::Add: + { + input = ::Calculator::Input::Invalid; + Calculate(); op = "+"; + } + case ::Calculator::::Input::Mul: + { + input = ::Calculator::Input::Invalid; + Calculate(); op = "*"; + } + case ::Calculator::::Input::Equal: + { + input = ::Calculator::Input::Invalid; + Calculate(); op = "="; + } + case ::Calculator::::Input::Clear: + { + input = ::Calculator::Input::Invalid; + valueFirst = ""; + op = ""; + Value = "0"; + } + case ::Calculator::::Input::Digit: + { + input = ::Calculator::Input::Invalid; + raise "Calculator::Digit cannot be called at this moment."; + } + case ::Calculator::::Input::Dot: + { + input = ::Calculator::Input::Invalid; + raise "Calculator::Dot cannot be called at this moment."; + } + } + state = ::Calculator::State::Calculate; + goto OUT_OF_STATES; + goto OUT_OF_STATE_MACHINE; } - state = ::Calculator::State::Calculate; - goto OUT_OF_STATES; - return; } + OUT_OF_CURRENT_STATE:; // label can only appear at the end of a block statement } -         OUT_OF_STATES:; // label can only appear at the end of a block statement + OUT_OF_STATE_MACHINE:; + } + finally + { + coroutine = previousCoroutine; } }; }