狀態轉換圖
狀態轉換圖是一張有限有向圖
- 結點表示狀態,結點用圓圈表示
- 狀態之間存在有向弧,弧上標記有字符或字符集,
表示某一狀態接受箭弧上的字符/字符集輸入后到達另一狀態 - 一張狀態轉換圖中的狀態個數是有限的,其中有一個初態,至少有一個終態

如上圖表示狀態1為初態,狀態3為終態,狀態1接受字符a到達狀態2,接受數字到達狀態3
終態用雙圈表示
狀態轉換圖可用於識別 / 接受一定的字符串
若存在一條從初態到某一終態的道路,記這條路上所有弧上的標記符連接成的字(即字符串 )為α,則稱α被該狀態轉換圖識別 / 接受

比如上面的狀態轉換圖,可以用來識別以字母開頭,可以存在數字的標識符(狀態3的*號表示,不包含到狀態3的弧上的字符)

可以識別整常數的狀態圖
狀態轉換圖在詞法分析中的應用
有某種簡單的程序設計語言,單詞表如下
該語言所有合法的字都在該單詞表內描述
| 單詞符號 | 種別編碼 | 助記符 | 內碼值 |
|---|---|---|---|
| DIM | 1 | $DIM | — |
| IF | 2 | $IF | — |
| DO | 3 | $DO | — |
| STOP | 4 | $STOP | — |
| END | 5 | $END | — |
| 標識符 | 6 | $ID | 內部字符串 |
| 常數 | 7 | $INT | 標准二進制形式 |
| = | 8 | $ASSIGN | — |
| + | 9 | $PLUS | — |
| * | 10 | $STAR | — |
| ** | 11 | $POWER | — |
| , | 12 | $COMMA | — |
| ( | 13 | $LPAR | — |
| ) | 14 | $RPAR | — |
可為單詞表設計如下狀態轉移圖

狀態2識別關鍵字和標識符
狀態4識別常數
狀態5~12識別操作符和括號
狀態13為出錯狀態
那么,可以由此圖對該語言的所有代碼進行詞法分析
詞法分析器的實現:狀態轉換圖→程序
使用循環和swith或if,我們很容易把上面的狀態轉移圖實現為詞法分析程序
或者使用更巧妙的表驅動方式
| 當前狀態 \ 字符 | space | letter | digit | = | + | * | , | ( | ) | 其他 |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 1 | 3 | 5 | 6 | 7 | 10 | 11 | 12 | 13 |
| 1 | 0 | 1 | 3 | 5 | 6 | 7 | 10 | 11 | 12 | 13 |
| 3 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
| 7 | 8 | 8 | 8 | 8 | 8 | 9 | 8 | 8 | 8 | 8 |
設該數組為state
由當前狀態cur_state和讀取的字符ch
我們可以查表得到下一個狀態state[cur_state][ch]
狀態轉換圖與有限自動機
可以用狀態轉換圖等價表示確定有限自動機(DFA) 或者 非確定有限自動機(NFA)
2019/7/20
