基於有限狀態自動機的數據類型識別功能(1)


 

有限狀態自動機(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來表示吧

這樣子就二維數組就沒那么大了。

下一次用代碼一步步實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM