//標頭檔案
#include #include //巨集定義
#define max 100
#define max1 1000
//變數定義
int char_num;//字符集數目
char chars[max];//字符集
int state_num;//狀態數目
int states[max];//狀態集
int start_state;//初始狀態編號
int accept_num;//接收狀態集數目
char accepts[max];//接收狀態集
int transtable[max][max];//狀態轉移表
int states_num[max1];//記錄狀態在陣列中的編號
int testn;//測試用例編號
file *f;//需要開啟的檔案
int flag_check2_4[max];//0表示未訪問過,1表示已經訪問過
//初始化設定為未訪問過
bool flag_dfa=false;//判斷dfa是否合法的標記符
char road[max];//dfs記錄之前的路徑
int road_length=0;//dfs路徑長度
int le=0;//字串的長度
//寫入函式,輸入dfa五元組,並將五元組寫入到.dfa檔案中
void write();
//檢查1:dfa儲存情況
//輸出:字符集,狀態集,開始狀態的編號,接收狀態集,狀態轉換集
void cheak1();
//檢查2:dfa正確性檢查
//檢查所有集合的元素的唯一性。
//檢查「開始狀態」是否唯一,並是否包含在「狀態集」中。
//檢查「接收狀態集」是否為空,並是否包含在「狀態集」中。
//檢查「狀態轉換表」是否滿足dfa的要求。(是否能到達接收狀態)
void check2();
bool check2_1();
bool check2_2();
bool check2_3();
void check2_4(int state);
//dfa的語言集列表顯示:
//輸入待顯示的字串的最大長度n,輸出以上定義的dfa的語言集中長度≤n的所有規則字串。
void dfs(int state,int n);//嘗試採用深度優先搜尋dfs
//dfa的規則字串判定:
//輸入(或用字符集隨機生成)乙個字串,模擬dfa識別字串的過程判定該字串是否是規則字串(屬於dfa的語言集)。
void judge(int state,char *l,int length);
int main()}
void write()
printf("請輸入字符集個數:");
scanf("%d",&char_num);
fprintf(f,"%d\n",char_num);
printf("請輸入字符集:(請換行輸入)\n");
for(int i=0;ifprintf(f,"\n");
printf("請輸入狀態集個數:");
scanf("%d",&state_num);
fprintf(f,"%d\n",state_num);
printf("請輸入狀態集:");
for(int i=0;ifprintf(f,"\n");
printf("請輸入開始狀態:");
scanf("%d",&start_state);
fprintf(f,"%d\n",start_state);
printf("請輸入接受狀態集個數:");
scanf("%d",&accept_num);
fprintf(f,"%d\n",accept_num);
printf("請輸入接受狀態集:");
for(int i=0;ifprintf(f,"\n");
printf("請輸入狀態轉換表:");
for(int i=0;ifprintf(f,"\n");
} printf("----下面是檢測部分----\n");
}void cheak1()
printf("\n");
} }//檢查所有元素集合的唯一性
bool check2_1()
} if(flag1) printf("字元集合正確。\n");
else printf("字元集合錯誤。\n");
//檢查狀態集合;
bool flag2=true;
for(int i=0;iif(flag2) printf("狀態集合正確。\n");
else printf("狀態集合錯誤。\n");
//接收狀態集合;
bool flag3=true;
for(int i=0;iif(flag3) printf("接收集合正確。\n");
else printf("接收集合錯誤。\n");
return flag1&flag2&flag3;//所有元素集合是否唯一
} //檢查「開始狀態」是否唯一,並是否包含在「狀態集」中。
bool check2_2()
if(flag) printf("開始狀態包含在「狀態集」中。\n");
else printf("開始狀態不包含在「狀態集」中。\n");
return flag;}
//檢查「接收狀態集」是否為空,並是否包含在「狀態集」中。
bool check2_3()
for(int i=0;iif(flag)printf("接受狀態都在狀態集中\n");
else printf("接受狀態不全在狀態集中\n");
return flag;
}//檢查「狀態轉換表」是否滿足dfa的要求。
//思路: 1. 是否是確定的(由輸入可知肯定是確定的)
//2.檢查能否到達接收狀態集合 用dfs判斷,從初始狀態開始,如果能夠到達接受狀態集合則正確
void check2_4(int state)
if(flag==true)
flag_dfa=true;
else
} }
void check2()
void dfs(int state,int n)
printf("\n");
} if(n==0) return;
for(int i=0;i}
void judge(int state,char *l,int length)//判斷最後乙個字元是否是接收狀態且中間的轉移過程沒有出錯
else if(length==0&&!flag)
int char_=max-1;
char cl=l[le-length];
for(int i=0;iif(cl==chars[i])
int state_=transtable[states_num[state]][char_];
if(state_==-1)
judge(state_,l,--length);
}
編譯原理實驗一 DFA的程式設計實現
初步認識編譯器系統和目標機,體會系統程式設計,了解條件編譯和增量程式設計。獲取tiny語言編譯器相關源 了解tiny語言定義,可參見文件 tiny語言及其編譯器實現 第一次實驗時對tiny語言有大致了解即可,後續實驗中會陸續閱讀更多tiny語言及其編譯器的文件,詳細了解其詞法 語法 語義 執行時環境...
編譯原理 DFA的程式設計實現
編寫乙個c語言程式,模擬實現dfa識別字串的過程。dfa的輸入 dfa的儲存與讀寫 dfa的正確性檢查 dfa的語言集列表顯示 dfa的規則字串判定 dfa的輸入 分別輸入dfa的 字符集 狀態集 開始狀態 接受狀態集 狀態轉換表 等內容,並儲存在設定的變數中。dfa的儲存與讀寫 將上述dfa的五元...
編譯原理實驗 將NFA轉化為DFA
將nfa轉化為dfa 1.實驗目的 輸入 非確定有限 窮 狀態自動機。輸出 確定化的有限 窮 狀態自動機 2.實驗原理 採用子集對nfa轉dfa。1 若nfa的全部初態為s1,s2,sn,則令dfa的初態為 s s1,s2,sn 其中方括號用來表示若干個狀態構成的某一狀態。2 設dfa的狀態集k中有...