編譯原理課程設計 說明語句的詞法分析器

2022-09-13 07:42:10 字數 4434 閱讀 2828

一、設計目的

了解詞法分析程式的基本構造原理,掌握詞法分析程式的手工構造及自動構造方法。

二、設計內容

根據pascal語言的說明語句形式,用手工及自動方法構造乙個對說明語句進行詞法分析的程式。該程式能對從鍵盤輸入或從檔案讀入的形如:

「const count=10,sum=81.5,char1=』f』,string1=」hj」, max=169;」

的常量說明串進行處理,分析常量說明串中各常量名、常量型別及常量值,並統計各種型別常量個數。

三、設計要求

1、輸入的常量說明串,要求最後以分號作結束標誌;

2、根據輸入串或讀入的文字檔案中第乙個單詞是否為「const」判斷輸入串或文字檔案是否為常量說明內容;

3、識別輸入串或開啟的文字檔案中的常量名。常量名必須是識別符號,定義為字母開頭,後跟若干個字母,數字或下劃線;

4、根據各常量名緊跟等號「=」後面的內容判斷常量的型別。其中:字元型常量定義為放在單引號內的乙個字元;字串常量定義為放在雙引號內所有內容;整型常量定義為帶或不帶+、- 號,不以0開頭的若干數字的組合;實型常量定義為帶或不帶+、- 號,不以0開頭的若干數字加上小數點再後跟若干數字的組合;

5、統計並輸出串或檔案中包含的各種型別的常量個數;

6、以二元組(型別,值)的形式輸出各常量的型別和值;

7、根據常量說明串置於高階語言源程式中時可能出現的錯誤情況,模仿高階語言編譯器對不同錯誤情況做出相應處理。

四、執行結果

1、輸入如下正確的常量說明串:

const count=10,sum=81.5,char1=『f』,max=169,str1=「h*54 2..4s!aasj」, char2=『@』,str2=「aa!+h」;

輸出:count(integer,10)

sum(float,81.5)

char1(char, 『f』)

max(integer,169)

str1(string,「h*54  2..4s!aasj」)

char2(char, 『@』)

str2(string,「aa!+h」)

int_num=2;  char_num=2; string_num=2; float_num=1.

2、輸入類似如下的保留字const錯誤的常量說明串:

aconstt count=10,sum=81.5,char1=『f』;

輸出類似下面的錯誤提示資訊:

it is not a constant declaration statement!

please input a string again!

3、輸入類似如下含常量名或常量值錯誤的常量說明串:

const count=10,12sum=81.5,char1=『ff』,max=0016;

輸出類似下面的錯誤提示資訊:

count(integer,10)

12sum(wrong! it is not a identifier!)

char1(wrong! there are  more than one char in 『』.)

max(wrong! the integer can』t be started with 『0』.)

int_num=1;  char_num=0; string_num=0; float_num=0.

4、其他型別的錯誤處理情況(略)。

五、提示

本課程設計重點有三個:一是作為常量名的識別符號的識別;二是如何根據「=」後出現的內容來判斷常量型別;三是對各種錯誤的處理。難點是對整型和實型常量的判斷必須綜合考慮多種可能情況。

用指標或陣列與指標相結合來處理輸入的常量說明串;

對整型和實型常量處理時,重點考慮常數中『0』的位置。

六、分析與討論

1、若考慮用e或e的科學計數法來表示整數和實數,應該如何實現?

2、若考慮布林型常量,且規定其值只能為true或false,應該如何實現?

3、如何對手工構造的詞法分析程式做進一步的優化,以提高**質量和執行效率?

1 #include2

using

namespace

std;

3char example[10000]; //

緩衝區4

int example_p;//

緩衝區指標56

char token[10];//

常量名7

int token_p;//

常量名指標89

char num[10000];//

資料10

int num_p;//

資料指標

11char

ch;12

13int int_num = 0, char_num = 0, float_num = 0, string_num = 0;14

15//

字元是字母

16bool is_letter(char

ch)

22//

字元是數字

23bool is_digit(char

ch)

2930

31//

消除空格

32void

space() 37}

3839

//const檢查

40bool

inspect()

51//

const比對

52if (strcmp(token, "

const

") == 0

) 55

else

56return

false;57

}5859}

6061

//串掃瞄 將常量名存入token 資料存入num

62void

scan()

77if (ch == '='

) 81

//消除空格

82space();

83//

獲取=後的資料 存入num 字元形式存入

84while (ch != ','

) 92

if (ch == ','

) 9697}

9899

//判斷資料型別

100const

char* type(char*num)

106//

字串型第乙個字元為雙引號

107else

if (num[0] == '"'

) 111

else

117}

118119

return

"interger";

120}

121}

122123

124125

intmain() while (str != ';'

);134

135 example_p = 0

;136 ch =example[example_p];

137138

//測試案例

139//

const count=10,sum=81.5,char1='f',max=169,str1="h*54 2..4s!aasj", char2='@',str2="aa!+h";

140//

aconstt count=10,sum=81.5,char1='f';

141//

const count=10,12sum=81.5,char1='ff',max=0016;

142143

if(inspect())

152//

字元型別有多個字元

153else

if (strcmp(type(num), "

char

") == 0 && sizeof(num) > 4

) 157

//整數第乙個字元不能為0

158else

if (strcmp(type(num),"

interger

")==0&&num[0]=='0'

) 163

else

175//

到達末尾時結束

176 } while (ch != ';'

);177 cout <178 cout << "

int_num=

"<< int_num << "

"<< "

char_num=

"<< char_num << "

"<< "

string_num=

"<< string_num << "

"<< "

float_num=

"<179 }else

183184 system("

pause");

185return0;

186 }

詞法分析程式課程設計

一.實驗目的 加深對詞法分析理論的理解,培養動手實踐的能力。詞法分析的功能 掃瞄源程式字元流,按照源語言的詞法規則識別出各類單詞版本號,並產生用於語法分析的符號串行,即將字串源程式轉換成符號串源程式.二.實驗內容與設計思想 內容 編寫乙個小的詞法分析程式,並進行簡單的詞法進行分析.設計思想 字元指標...

數 據 庫 系 統 概 論課 程 設 計 說 明

可以實現少量的管理人員完成大量的人員安排宿舍管理服務,使宿舍管理更加規範化 科學化,人性化.同時還要能夠動態的掌握每個宿舍管理的基本資訊,以及及時統計相關資料更新,宿舍管理不僅要減少人員的組織與花費,而且要提高宿舍管理的服務水平和質量。設計目標 1.可以實現少量的管理人員完成大量的人員安排宿舍管理服...

編譯原理課程實驗一 詞法分析

鞏固對詞法分析的基本功能和原理的認識。能夠應用自動機的知識進行詞法分析。理解並處理詞法分析中的異常和錯誤。掌握詞法分析的基本功能,並將其實現。詞法分析程式應具有較好的可擴充套件性,應清晰明確。除對相關問題的全面考慮外,還需對區域性作一些優化考慮 如符號表 給出語言的詞法規則描述 針對這種單詞的狀態轉...