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

 

有限狀態自動機(FSM):是一種表達某一狀態到另外一狀態發生轉化的數學模型。

例如:在長跑比賽開始時 我處於等待的狀態下,待裁判喊 預備 時,我就會從等待狀態轉換到預備狀態。聽到裁判的槍聲時,我就從預備狀態轉換到奔跑狀態 。
這個過程就至關於有限狀態自動機。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來表示吧

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

下一次用代碼一步步實現

相關文章
相關標籤/搜索