狀態機系列學習筆記01

2021-09-19 20:15:39 字數 1902 閱讀 7854

總的來說,有限狀態機系統,是指在不同階段會呈現出不同的執行狀態的系統,這些狀態是有限的、不重疊的。這樣的系統在某一時刻一定會處於其所有狀態中的乙個狀態,此時它接受一部分允許的輸入,產生一部分可能的響應,並且遷移到一部分可能的狀態。

狀態(state)
狀態,就是乙個系統在其生命週期中某一時刻的運**況,此時,系統會執行一些動作,或者等待一些外部輸入。

條件(guard)
狀態機對外部訊息進行響應的時候,除了需要判斷當前的狀態,還要判斷跟這個狀態相關的一些條件是否成立。這種判斷稱為guard(」條件「)。guard通過允許或禁止某些操作來影響狀態機的行為。

事件(event)
event(」事件「),就是在一定的時間和空間上發生的對系統有意義的事情。

動作(action)
當乙個event被狀態機系統分發的時候,狀態機用action(」動作「)來進行響應,比如修改一下變數的值、進行輸入輸出、產生另外乙個event或者遷移到另外乙個狀態等等。

遷移(transition)
從乙個狀態切換到另乙個狀態被稱為transition(」遷移「)。引起狀態遷移的事件被稱為triggering event(」觸發事件「),或者被簡稱為trigger(」觸發「)。

假如需要設計乙個統計.c檔案中注釋字元的個數的程式,這個程式需要分析出乙個.c檔案中c風格的注釋字元(/.../)的個數。」/.../「之外的字元統一認為是code(不考慮」//「作為注釋的情況)。

分析如下:

(1) 首先,我們可以假設一段輸入字元,比如:

a = b * c / d;/* calc expression is b*c/d. **/

(2) 因為event比較清晰,可以先確定下來:

char,表示字元。即除了斜槓和星號之外的所有字元。

slash,表示斜槓。

star,表示星號。

(3) 確定initial transition:

確定初始狀態為code態。(或者增加乙個idle態,根據第一字元再判斷。不過這個例子中不需要,因為不用計算code的個數。)

(4) 確定所有的state和transition。

在code態,如果輸入是char或者star,仍然處於code狀態。當輸入slash以後,則認為這個slash有可能是注釋的開始,進入新的狀態叫slash。

在slash狀態,檢查後面的輸入是否是star,如果是star,說明這個是注釋的開始部分,轉入comment狀態,如果是char或者slash,則認為前面輸入的slash和當前輸入的字元仍然是code,返回code態。

同樣,comment態的思路跟code態類似。star態的思路跟slash態類似。

cparser1.h

enum signal ;

enum state ;

struct cparser1 ;

#define cparser1tran(me_, target_) ((me_)->state__ = target_)

cparser1.c
void cparser1dispatch(cparser1 *me, unsigned const sig) 

break;

case slash:

switch (sig)

break;

case comment:

switch (sig)

break;

case star:

switch (sig)

break;

}}

學習筆記 狀態機

狀態機是有限狀態自動機的簡稱,是現實事物執行規則抽象而成的一種數學模型 將電路的全部工作方式,分成幾個場景,這些場景的工作方式明顯不同,然後將這些場景通過數學模型表示出來 輸出只和狀態有關而與輸入無關 狀態表 輸出不僅和狀態有關而且和輸入有關係 狀態表 人有三個狀態健康,感冒,中。觸發的條件有淋雨 ...

狀態機學習筆記(一)

狀態機可歸納為4個要素,即現態 條件 動作 次態。詳解如下 現態 是指當前所處的狀態。條件 又稱為 事件 當乙個條件被滿足,將會觸發乙個動作,或者執行一次狀態的遷移。動作 條件滿足後執行的動作。動作執行完畢後,可以遷移到新的狀態,也可以仍舊保持原狀態。動作不是必需的,當條件滿足後,也可以不執行任何動...

狀態機學習筆記(一)

狀態機可歸納為4個要素,即現態 條件 動作 次態。詳解如下 現態 是指當前所處的狀態。條件 又稱為 事件 當乙個條件被滿足,將會觸發乙個動作,或者執行一次狀態的遷移。動作 條件滿足後執行的動作。動作執行完畢後,可以遷移到新的狀態,也可以仍舊保持原狀態。動作不是必需的,當條件滿足後,也可以不執行任何動...