簡單詞法分析器實現

2021-09-07 12:16:15 字數 1829 閱讀 7095

編寫分析器有兩種方法,一種是通過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 判斷是否為...