編譯原理詞法分析器實驗報告

2021-03-04 07:07:03 字數 2725 閱讀 4457

北華航天工業學院

《編譯原理》課程實驗報告

課程實驗題目: 詞法分析器實驗

作者所在系部: 電腦科學與工程系

作者所在專業: 電腦科學與技術

作者所在班級: b08512

作者學號18

作者姓名 : 李桂丁

指導教師姓名: 李建義

完成時間 : 2023年3月26日

一、實驗目的

了解詞法分析程式的兩種設計方法:1.根據狀態轉換圖直接程式設計的方式;2.利用dfa編寫通用的詞法分析程式。

二、實驗內容及要求

1.根據狀態轉換圖直接程式設計

編寫乙個詞法分析程式,它從左到右逐個字元的對源程式進行掃瞄,產生乙個個的單詞的二元式,形成二元式(記號)流檔案輸出。在此,詞法分析程式作為單獨的一遍,如下圖所示。

具體任務有:

(1)組織源程式的輸入

(2)拼出單詞並查詢其類別編號,形成二元式輸出,得到單詞流檔案

(3)刪除注釋、空格和無用符號

(4)發現並定位詞法錯誤,需要輸出錯誤的位置在源程式中的第幾行。將錯誤資訊輸出到螢幕上。

(5)對於普通識別符號和常量,分別建立識別符號表和常量表(使用線性表儲存),當遇到乙個識別符號或常量時,查詢識別符號表或常量表,若存在,則返回位置,否則返回0並且填寫符號表或常量表。

識別符號表結構:變數名,型別(整型、實型、字元型),分配的資料區位址

注:詞法分析階段只填寫變數名,其它部分在語法分析、語義分析、**生成等階段逐步填入。

常量表結構:常量名,常量值

2.能對任何s語言源程式進行分析

在執行詞法分析程式時,應該用問答形式輸入要被分析的s源語言程式的檔名,然後對該程式完成詞法分析任務。

3.能檢查並處理某些詞法分析錯誤

詞法分析程式能給出的錯誤資訊包括:總的出錯個數,每個錯誤所在的行號,錯誤的編號及錯誤資訊。

4. 本實驗要求處理以下兩種錯誤(編號分別為1,2):

1:非法字元:單詞表中不存在的字元處理為非法字元,處理方式是刪除該字元,給出錯誤資訊,「某某字元非法」。

2:源程式檔案結束而注釋未結束。注釋格式為:/* …… */

三、實驗程式設計說明

1.實驗方案設計

2.程式源**

#include

#include

#include

#include

using namespace std;

string keywords[20]=;

char aa[99999]=" ";

string id[10000];

int pp=0;

string nu[10000];

int **=0;

void initscanner() //程式初始化:輸入並開啟源程式檔案和目標程式檔案,初始化保留字表

char ch=fgetc(fp);

while(ch!=eof)

fclose(fp);

}int decide1(char a) //判斷是否是字母

int decide2(char a) //判斷是否是數字

int isalpha(int st) //識別保留字和識別符號

int flag=0;

for(int k=0;k<20;k++)

if(flag==0)

if(flagg!=-1) printf(" (id,%d) ",flagg);

else

}else

printf(",-) ");

}return st;

}int isnumber(int st) //識別整數,如有精力,可加入識別實數部分工功能

else if((k==0)&&(aa[st]=='.'))

else if(decide1(aa[st])==1)

else break;

}if(flag==0)

}else

return st;

}int isanotation(int st) //處理除號/和注釋

printf(" (");

for(int i=0;iprintf("%c",tabuf[i]);

printf(",unuseful things!) ");

}else if(aa[st]=='*')

else if(aa[st]=='=')

else printf

return st;

}int isother(int st) //函式識別其他特殊字元

{ switch(aa[st])

{case '=': st++;

if(aa[st]=='=')

st++;

printf(" (rlop,==) ");

else printf(" (rlop,=) ");

break;

case '+': st++;

if(aa[st]=='=')

st++;

printf

else if(aa[st]=='+')

st++;

printf

else printf

break;

case '-': st++;

if(aa[st]=='=')

st++;

printf

else if(aa[st]=='-')

st++;

printf

詞法分析器實驗報告

一 實驗內容 設計 編制並除錯乙個詞法分析程式,加深對詞法分析原理的理解。1.待分析的簡單詞法 1 關鍵字 所有的關鍵字都是小寫 begin if then while do end 2 運算子和界符 3 其他單詞是識別符號 id 和整型常數 num 通過以下正規式定義 id letter lett...

編譯原理詞法分析實驗報告

實驗1 詞法分析實驗報告 一 實驗目的 除錯並完成乙個詞法分析程式,加深對詞法分析原理的理解。二 實驗要求 1 待分析的簡單語言的詞法 1 關鍵字 begin if then while do end 所有關鍵字都是小寫。2 運算子和界符 3 其他單詞是識別符號 id 和整型常數 num 通過以下正...

編譯原理詞法分析實驗報告

實驗一詞法分析器設計 實驗目的 1 熟悉詞法分析的基本原理,詞法分析的過程和詞法分析中要注意的問題。2 複習高階語言,進一步加強用高階語言來解決實際問題的能力。3 通過完成詞法分析程式,了解詞法分析的過程。實驗內容 用c語言編寫乙個pl 0詞法分析器,為語法語義分析提供單詞,使之能把輸入的字串形式的...