編寫乙個c語言程式,模擬實現dfa識別字串的過程。
dfa的輸入;
dfa的儲存與讀寫;
dfa的正確性檢查;
dfa的語言集列表顯示;
dfa的規則字串判定;
dfa的輸入:
分別輸入dfa的「字符集」、「狀態集」、「開始狀態」、「接受狀態集」、「狀態轉換表」等內容,並儲存在設定的變數中。
dfa的儲存與讀寫:
將上述dfa的五元組儲存在乙個文字檔案中,副檔名指定為.dfa。請自行設計dfa檔案的儲存格式,並說明其含義。能將儲存在記憶體變數中的dfa寫入dfa檔案,也能將dfa檔案讀入記憶體中。(思考:對稀疏dfa**換表中為空的地方較多)或用「或」表達轉換的dfa(如下的測試用例三),如何改進dfa轉換表的表達。)
dfa的正確性檢查:
dfa的語言集列表顯示:dfa的規則字串判定:
輸入(或用字符集隨機生成)乙個字串,模擬dfa識別字串的過程判定該字串是否是規則字串(屬於dfa的語言集)。
3 // 字符集中的字元個數 (以下兩行也可合併成一行)
/ * o // 以空格分隔的字符集。o代表任意非/和*的字元
5 // 狀態個數 (以下兩行也可合併成一行)
1 2 3 4 5 // 狀態編號。若約定總是用從1開始的連續數字表示,則此行可省略
1 // 開始狀態的編號。若約定為1,則此行可省
1 // 結束狀態個數。若約定為1,則此行可省略
5 // 結束狀態的編號
2 -1 -1 // 狀態1的所有出去的轉換。按字符集中的字元順序給出。-1表示出錯狀態
-1 3 -1
-1 4 3
5 4 3
-1 -1 -1
string inputchar; //要匹配的字串
string charracters; //字符集
int statenum = 0; //狀態個數,預設為0
int currstate = 1; //開始狀態編號,預設為1
int endnum = 1; //接受狀態個數,預設為1
int *acceptstate = null; //接受狀態
int **convertfrom = null; //轉換表
void init(); //手動輸入
void read(); //從.dfa檔案中讀取資料
void input()
void dfa()
//任意字元匹配匹配
else if (y == charracters.length() - 1 && charracters[y] == '?')
}if (i***ist)
else
}else
num++;
}bool notacceptstate = true; //判斷當前狀態是否在借號狀態中
for (int i = 0; i < endnum; i++)
}if (notacceptstate)
}
void outchars(int n, int *arr); //輸出函式
void isacceptstate(int currstate, int n, int *arr); //檢查函式
void searchchars(int currstate, int n, int n, int *arr)
else
for (int i = 0; i < (int)charracters.length(); i++)}}
ab41
42 3
4 32 4
4 4
手動輸入:1 ,從檔案讀取 0
0輸入要識別的字串
aabb
匹配成功
輸入待顯示的字串的最大長度n5aa
aaaaaaa
aaaaa
aaaab
aaab
aaaba
aaabb
aabaaba
aabaa
aabab
aabb
aabba
aabbb
abaa
abaaa
abaab
ababb
abbabba
abbaa
abbab
abbb
abbba
abbbb
baabaaa
baaaa
baaab
baab
baaba
baabb
babaa
babb
babba
babbb
bbbba
bbaa
bbaaa
bbaab
bbab
bbaba
bbabb
bbbbbba
bbbaa
bbbab
bbbb
bbbba
bbbbb
其他兩個dfa就不列出結果了,要測試其他兩個dfa只需要修改read()
函式的輸入檔案就好,**檔案後面會給出。
此外,並不能保證除此之外的dfa都能通過,因為測試檔案只有這三個,案例有限。還有這個dfa並沒有達到實驗的所有要求,所以要參考的請注意。
雖然這個實驗挺簡單的,只需要考慮周全就能完成,但還是帶給我很多麻煩的,比如第一次使用從檔案中讀取資料(不熟悉從檔案讀取的請多注意如何寫,以及是怎麼從檔案中讀取資料的,我寫的比較簡單,所以有疑問多拜訪拜訪度娘。),因為不熟悉,剛開始還要測試資料是否讀取成功,從我有個手動輸入的函式就知道我是怎麼多生疏了。雖然生疏,但用多了,測試多了就慢慢熟悉,後面還有幾個實驗,會更複雜,而我也寫的更複雜,會用上許多我對c++比較生疏的寫法,有興趣或者遇到困難的可以看下。
具體**請見dfa。
編譯原理實驗一 DFA的程式設計實現
初步認識編譯器系統和目標機,體會系統程式設計,了解條件編譯和增量程式設計。獲取tiny語言編譯器相關源 了解tiny語言定義,可參見文件 tiny語言及其編譯器實現 第一次實驗時對tiny語言有大致了解即可,後續實驗中會陸續閱讀更多tiny語言及其編譯器的文件,詳細了解其詞法 語法 語義 執行時環境...
編譯原理 DFA的化簡
任何正規語言都有乙個唯一的狀態數目最少的dfa dfa m的化簡是指 尋找乙個狀態數比m少的dfa m 使得l m l m 有窮自動機的多餘狀態 從自動機的開始狀態出發,任何可識別的輸入串也不能到達的狀態 化簡了的dfa m 滿足兩個條件 沒有多餘狀態 沒有兩個狀態是等價的。將dfa m的狀態集q分...
編譯原理實驗一 實現簡單的DFA
標頭檔案 include include 巨集定義 define max 100 define max1 1000 變數定義 int char num 字符集數目 char chars max 字符集 int state num 狀態數目 int states max 狀態集 int start s...