有限狀態自動機(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來表示吧
這樣子就二維數組就沒那么大了。
下一次用代碼一步步實現