天天看點

《程式設計珠玑(續)(修訂版)》—第2章2.2節有窮狀态機模拟器

本節書摘來自異步社群《程式設計珠玑(續)(修訂版)》一書中的第2章,第2.2節有窮狀态機模拟器,作者【美】jon bentley,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

2.2 有窮狀态機模拟器

有窮狀态機(fsm)是計算的一種優雅的數學模型和有用的實踐工具,它在程式設計語言的詞法分析、通信協定以及簡單硬體裝置等許多應用領域都有廣泛的用途。wulf、shaw、hilfinger和flon在他們合著的fundamental structures of computer science③一書(addison-wesley出版社1981年出版)的1.1節讨論了這一主題。

作為例子,他們考慮這樣一個簡單的任務——“抑制”比特流中所有新出現的1:

緊跟在0後面的1被改成0,輸入流中的所有其他比特位不變。

下面的兩狀态自動機在其狀态中對最後一個輸入比特進行編碼:“liz”表示“last input zero”,而“lio”表示“last input one”。

《程式設計珠玑(續)(修訂版)》—第2章2.2節有窮狀态機模拟器

指向liz的橫向箭頭表明這是初始狀态。從liz到lio的弧線的意思是,如果自動機目前處于狀态liz且輸入是一個1,則輸出一個0并進入狀态lio。

執行fsm的程式使用兩個主要資料結構。如果fsm包含弧線

《程式設計珠玑(續)(修訂版)》—第2章2.2節有窮狀态機模拟器

那麼下面的等式成立:

名字trans表示狀态轉換,out表示輸出符号。

上面描述的自動機和輸入編碼如下:

前4行表示fsm中的4條邊。第一行說,如果自動機目前狀态為liz且輸入為0,那麼下一個狀态是liz并輸出0。第五行确定初始狀态,之後的行是輸入資料。

下面的程式按上面描述的形式執行fsm。

該程式有兩個主要的模式。起初,變量run值為零。在這個模式下,将自動機的轉換添加到數組trans和out中。當輸入的某一行的第一個字段是字元串"start"時,程式将相應的初始狀态存放到s中,然後切換到運作模式。然後每步的執行都将産生輸出并改變狀态,每步轉換後的狀态可以看成是目前輸入($1)和目前狀态(s)的函數。

這個微型的程式有很多缺點。例如,對于未定義的轉換,它做出的反應将是災難性的。事實上,這個程式頂多适合個人使用。另一方面,它為建立更健壯的程式提供了便利的基礎,見習題2。

繼續閱讀