詞法分析~實驗報告


實驗一、詞法分析實驗

                                            專業 商業軟件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的子針域;雖然在編寫過程中,遇到不少問題,

遇到一個,就想辦法解決一個,通過問朋友老師等,也通過發朋友圈問,還通過發博客來問大神們,這種途徑是

最有效的,也是最好的;所以每次就差一點就做好了,又會遇到一個新的問題,就要想辦法去解決它,如今

除了字符串是以數字結尾會出現問題外(暫時沒找到好的方法),其他問題已解決。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM