編譯原理實驗一 實現簡單的DFA

2021-09-28 20:01:31 字數 3596 閱讀 9786

//標頭檔案 

#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中有...