有限狀態自動機(FSM):是一種表達某一狀態到另一狀態發生轉化的數學模型。 例如:在長跑比賽開始時 我處於等待的狀態下,待裁判喊 預備 時,我就會從等待狀態轉換到預備狀態。聽到裁判的槍聲時,我就從預備狀態轉換到奔跑狀態 。這個過程就相當於有限狀態自動機。 FSM的狀態就是一個事件當前所處於的情況。 ...
有限狀態自動機(FSM):是一種表達某一狀態到另一狀態發生轉化的數學模型。
例如:在長跑比賽開始時 我處於等待的狀態下,待裁判喊 預備 時,我就會從等待狀態轉換到預備狀態。聽到裁判的槍聲時,我就從預備狀態轉換到奔跑狀態 。
這個過程就相當於有限狀態自動機。
FSM的狀態就是一個事件當前所處於的情況。
有限狀態自動機在編程中的應用十分廣泛
例如:對輸入的字元進行判斷 判斷字元串組成的數字屬於整型還是浮點型。 同時它也是詞法分析的核心 可用於分析一串字元中給的組成詞的含義。
因為最近在學習編譯原理,所以想實現一個簡單的FSM。 計劃使用java語言。希望能做一個分析所輸入的字元串,解析出字元串組成的字串屬於什麼數據類型。
準備
在編寫FSM程式之前需要先畫出狀態轉化圖,在我的構想里:
1.整數是只由0~9的數字組成。
2.浮點數比整數多了一個小數點,並且小數點不能出現在數字的第一位和最後一位。
3.增加科學計數法數字,例如:1.2e2 其中用e2代替10的二次方 e的左邊必須是小數,並且小數點只能出現在緊跟著第一位數字的後面。
4.可以對一行字元串進行解析。
基於上面4點,我大致畫了一下狀態轉換圖:
紅色字體代表8種狀態
箭頭上的 0-9 e . - 帶當輸入的字元位他們時
黃色下劃線代表改狀態可以輸出結果了
藍色代表迴圈
例如:初始狀態為0時,當輸入0-9任意一個字元時 狀態0向狀態1轉變。
當繼續輸入0-9時狀態不變,但是狀態1在輸入結束後可以輸出 int。
在狀態1的前提下若輸入 小數點,那麼就會向狀態2轉變。狀態2不支持輸出。
在狀態2的前提下輸入0-9那麼就會向狀態3轉變,同時,狀態3支持輸出。以此類推
狀態1可以輸出int (123)
狀態3可以輸出float(123.4)
狀態6可以輸出科學計數法(1.2e2)
狀態7可以輸出科學計數法(1.2e-2)
使用二維數組表示各狀態
如何才能將這些狀態信息表達出來,我使用的是二位數組
數組的縱軸表示8中狀態
數組橫軸表示輸入的字元
數組元素表示下一跳狀態
根據狀態轉換圖可以把二維表填滿
比如:
第0行的第0列 表示 在狀態0時輸入字元0
第0行的第1列 表示 在狀態0時輸入字元1
第0行的第10列 表示 在狀態0時輸入字元.
第0行的第11列 表示 在狀態0時輸入字元e
第0行的第12列 表示 在狀態0時輸入字元-
數組元素表示下一跳狀態值
簡單填一下 -1表示錯誤狀態 大概是這個樣子 貌似多了一行,而且填的時候可能有填錯的。不過大概就這樣先吧 哈哈。
通過觀察發現 可以進行簡化 ,對縱軸的下標0-9統一用下標0來表示吧
這樣子就二維數組就沒那麼大了。
下一次用代碼一步步實現