一、設計目的
了解詞法分析程式的基本構造原理,掌握詞法分析程式的手工構造及自動構造方法。
二、設計內容
根據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 #include2using
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.可以實現少量的管理人員完成大量的人員安排宿舍管理服...
編譯原理課程實驗一 詞法分析
鞏固對詞法分析的基本功能和原理的認識。能夠應用自動機的知識進行詞法分析。理解並處理詞法分析中的異常和錯誤。掌握詞法分析的基本功能,並將其實現。詞法分析程式應具有較好的可擴充套件性,應清晰明確。除對相關問題的全面考慮外,還需對區域性作一些優化考慮 如符號表 給出語言的詞法規則描述 針對這種單詞的狀態轉...