實驗一、詞法分析實驗
專業 商業軟件3班 姓名 陳笑璞 學號 201506110218
一、 實驗目的
(1) 編制一個詞法分析程序
(2) 詞法分析是編譯的第一個階段,主要任務是從左至右逐個字符地對源程序進行掃描,產生一個個單詞序列,用於語法分析。
(3) 通過詞法分析的練習,能夠進一步了解編譯原理。
(4) 通過了解詞法分析程序的設計原則、單詞的描述技術、識別機制及詞法分析程序的自動構造原理。
二、 實驗內容和要求
(1) 輸入:源程序字符串
(2) 輸出:二元組(種別,單詞符號本身)。
三、 實驗方法、步驟及結果測試
實驗方法、步驟:
(1) 對字符串表示的源程序
(2) 從左到右進行掃描和分解
(3) 根據詞法規則
(4) 識別出一個一個具有獨立意義的單詞符號
(5) 以供語法分析之用
(6) 發現詞法錯誤,則返回出錯信息
2、原理分析: 我的設計思路是利用鏈隊列(好處:先進先出且不浪費存儲空間)進行存儲用戶輸入字符串,
以回車鍵結束(其中必須以非數字結尾,否則程序出錯)(這是我在后來的編程里遇到的問題,我知道問題出在哪里,
但我現在還解決不了,因為我是通過申請子針域來存儲,所以我是利用p->next來作為判斷結束條件,
如果以數字結束,那p->next指向未知領域,程序出錯,同時這也是很危險的),然后我是利用出隊列來判斷,
如果是字母存進數組里,直到下一個字符不是字母,調用函數判斷數組的字符串,利用strcmp來判斷,輸出數組,再清空數組;
void Print(char str[])//調用函數來判斷關鍵字與標識符並輸出 { int i=0; if(strcmp(str,"begin")==0) printf("(1,'%s')\n",str); else if(strcmp(str,"if")==0) printf("(2,'%s')\n",str); else if(strcmp(str,"then")==0) printf("(3,'%s')\n",str); else if(strcmp(str,"while")==0) printf("(4,'%s')\n",str); else if(strcmp(str,"do")==0) printf("(5,'%s')\n",str); else if(strcmp(str,"end")==0) printf("(6,'%s')\n",str); else { if(str[0]=='\0') return; printf("(10,'%s')\n",str); } memset(str,0,N);//清空數組str里的所有元素 }
結果測試:
四、 實驗總結
說實話,通過這次的編譯原理詞法分析的實驗,我遇到了不少問題,也學到了不少的東西,因為這次實驗
我是想用我自己的想法來編寫程序,我是用鏈隊列來存儲字符串的,也許用數組來存儲字符串會簡單點,
但我不想,我還是想利用鏈隊列來存儲字符串,這樣可以節約存儲空間,還可以利用隊列先進先出的特點,
不好就是利用隊列不夠靈活,每次都要出棧判斷、存儲,釋放p的子針域;雖然在編寫過程中,遇到不少問題,
遇到一個,就想辦法解決一個,通過問朋友老師等,也通過發朋友圈問,還通過發博客來問大神們,這種途徑是
最有效的,也是最好的;所以每次就差一點就做好了,又會遇到一個新的問題,就要想辦法去解決它,如今
除了字符串是以數字結尾會出現問題外(暫時沒找到好的方法),其他問題已解決。