通過(guò)本次實(shí)驗(yàn),加深對(duì)DFA及其識(shí)別的語(yǔ)言的理解,學(xué)習(xí)對(duì)一般的DFA的表達(dá)方法與編程實(shí)現(xiàn)方法。
編寫一個(gè)C語(yǔ)言程序,模擬實(shí)現(xiàn)DFA識(shí)別字符串的過(guò)程。
(1)DFA的輸入;
(2)DFA的存儲(chǔ)與讀寫;
(3)DFA的正確性檢查;
(4)DFA的語(yǔ)言集列表顯示;
(5)DFA的規(guī)則字符串判定;
(1)DFA的輸入:
分別輸入DFA的“字符集”、“狀態(tài)集”、“開始狀態(tài)”、“接受狀態(tài)集”、“狀態(tài)轉(zhuǎn)換表”等內(nèi)容,并保存在設(shè)定的變量中。
(2)DFA的存儲(chǔ)與讀寫:
將上述DFA的五元組保存在一個(gè)文本文件中,擴(kuò)展名指定為.dfa。請(qǐng)自行設(shè)計(jì)DFA文件的存儲(chǔ)格式,并說(shuō)明其含義。能將保存在內(nèi)存變量中的DFA寫入DFA文件,也能將DFA文件讀入內(nèi)存中。(思考:對(duì)稀疏DFA(轉(zhuǎn)換表中為空的地方較多)或用“或”表達(dá)轉(zhuǎn)換的DFA(如下的測(cè)試用例三),如何改進(jìn)DFA轉(zhuǎn)換表的表達(dá)。)
(3)DFA的正確性檢查:
1檢查所有集合的元素的唯一性。
2檢查“開始狀態(tài)”是否唯一,并是否包含在“狀態(tài)集”中。
3檢查“接受狀態(tài)集”是否為空,并是否包含在“狀態(tài)集”中。
4檢查“狀態(tài)轉(zhuǎn)換表”是否滿足DFA的要求。
5檢查“狀態(tài)轉(zhuǎn)換表”并非填滿時(shí)的處理是否得當(dāng)…
(4)DFA的語(yǔ)言集列表顯示:
輸入待顯示的字符串的最大長(zhǎng)度N,輸出以上定義的DFA的語(yǔ)言集中長(zhǎng)度≤N的所有規(guī)則字符串。(提示:注意算法中while循環(huán)的次數(shù))
(5)DFA的規(guī)則字符串判定:
輸入(或用字符集隨機(jī)生成)一個(gè)字符串,模擬DFA識(shí)別字符串的過(guò)程判定該字符串是否是規(guī)則字符串(屬于DFA的語(yǔ)言集)。
第一行是”字符集”,
第二行是”狀態(tài)集”、
第三行是”開始狀態(tài)”,
第四行是”接受狀態(tài)集”、
剩余行是”狀態(tài)轉(zhuǎn)換表”,0a1表示:輸入字符’a’由狀態(tài)0跳轉(zhuǎn)到狀態(tài)1。
DFA(1):
測(cè)試結(jié)果:
輸出文件:
DFA(2):
測(cè)試結(jié)果:
輸出文件
DFA(3) 其中的'|'表示任意字符,即圖中的others。
測(cè)試結(jié)果
輸出文件
聯(lián)系客服