例如:在長跑比賽開始時 我處於等待的狀態下,待裁判喊 預備 時,我就會從等待狀態轉換到預備狀態。聽到裁判的槍聲時,我就從預備狀態轉換到奔跑狀態 。
這個過程就至關於有限狀態自動機。java
FSM的狀態就是一個事件當前所處於的狀況。編程
例如:對輸入的字符進行判斷 判斷字符串組成的數字屬於整型仍是浮點型。 同時它也是詞法分析的核心 可用於分析一串字符中給的組成詞的含義。數組
由於最近在學習編譯原理,因此想實現一個簡單的FSM。 計劃使用java語言。但願能作一個分析所輸入的字符串,解析出字符串組成的字串屬於什麼數據類型。學習
在編寫FSM程序以前須要先畫出狀態轉化圖,在個人構想裏:字體
1.整數是隻由0~9的數字組成。blog
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來表示吧
這樣子就二維數組就沒那麼大了。
下一次用代碼一步步實現