編寫分析器有兩種方法,一種是通過dfa對單詞進行識別,二是通過直接編敲**進行識別。
本程式採用dfa對單詞進行識別。
dfa的實現方法。大概思想和書上一致,在程式中,則是用二維陣列代表狀態轉換矩陣,用一維陣列表示終態。
可以識別識別符號、keyword、數字和運算子,對凝視進行過濾。同一時候還能識別出程式錯誤。
使用說明:
本程式的輸入由當前資料夾下的in.txt檔案讀取輸入,輸出為一系列二元式
#include#include#include//用指標而不是二維陣列表示。這樣就不用指定字串長度,僅僅是不能改動指標所指向字串的內容char *key=;
char buffer[20];//儲存當前識別出的單詞
char *identifier[50];
char *num[50];
int ident_num;//標誌符數
int number;//數字數
int judgement_num(char c)
int judge(char c)
//next_i,next_j分別代表著狀態轉換表move的當前狀態與接收到的字元
//width代表每一狀態可能遇到的狀態數,length代表終態集大小
int dfa(int begin,int move,int width,int final,int length,int(*judge)(char))
buffer[len++]=next_char;
next_char=getchar();
}ungetc(next_char,stdin);
buffer[len]='\0';
for(int i=0;i'||c=='<')
}else if(c=='!')
}else if(c=='|')
}else if(c=='&')
}else if(c=='='||c=='('||c==')'||c=='['||c==']'||c==';'||c==','||c=='')
}void is_digit();
int final=;
int result=-1;
result=dfa(begin,move,2,final,2,judgement_num);
if(result==-1)
else if(result==0)
}num[number]=(char*)malloc(sizeof(buffer));
strcpy(num[number++],buffer);
printf("(num,%s)\n",buffer);
return; }}
void is_letter();
int final=;
int result=-1;
result=dfa(begin,move,3,final,1,judge);
if(result==-1)
else if(result==0)
}//如為標誌符
for(i=0;i}
//如不存在,則寫入
identifier[ident_num]=(char*)malloc(sizeof(buffer));
strcmp(identifier[ident_num++],buffer);
printf("(id,%s)\n",buffer);
return;
}}void init()
void work()
}int main()
簡單詞法分析器實現
編寫分析器有兩種方法,一種是通過dfa對單詞進行識別,二是通過直接編敲 進行識別。本程式採用dfa對單詞進行識別。dfa的實現方法。大概思想和書上一致,在程式中,則是用二維陣列代表狀態轉換矩陣,用一維陣列表示終態。可以識別識別符號 keyword 數字和運算子,對凝視進行過濾。同一時候還能識別出程式...
簡單詞法分析器的實現
這是我們的一次程式設計作業,要求用c編寫乙個簡單的詞法分析器。要求如下 編制乙個單詞獲取程式,從檔案輸入的源程式中,識別出各個具有獨立意義的單詞,即關鍵字 識別符號 整數 小數 字串 分隔符 運算子等七大類。並依次輸出各個單詞的內部編碼及單詞符號自身文字串 遇到錯誤時可顯示 error 然後跳過錯誤...
c 模擬簡單詞法分析器
編譯原理的基礎之一就是詞法分析,這裡便使用c 簡單模擬了乙個詞法分析器。這個詞法分析器的狀態轉換圖如下 而我的執行截圖如下 如下 include using namespace std define max len 200 將乙個字串內容清空 void cleararray char c 判斷是否為...