類C語言詞法分析器設(shè)計(jì)
一、問題描述
詞法分析器是編譯工作的第一個(gè)階段,主要完成對(duì)源程序的掃描,從而將源程序轉(zhuǎn)換成單詞序列,作為第二階段語法分析的輸入。
二、需求分析
預(yù)處理:過濾掉跳格符、回車符、換行符等編輯性字符。將多個(gè)連續(xù)的空格合并成一個(gè)空格。過濾注釋。
單詞符號(hào)的識(shí)別,將每個(gè)單詞符號(hào)進(jìn)行不同類別的劃分。單詞符號(hào)可劃分成5種。
關(guān)鍵字:如if、else、while、int、float等。
標(biāo)識(shí)符:用戶自己定義的名字,常量名、變量名和過程名。
常數(shù):各種類型的常數(shù)
運(yùn)算符:如+、-、*、<、>、>=等。
屆符:如逗號(hào)、分號(hào)、括號(hào)等。
最后將所有的單詞符號(hào)轉(zhuǎn)化為便于計(jì)算機(jī)處理的機(jī)內(nèi)碼形式
用戶界面使用圖形化界面
三、概要設(shè)計(jì)
1、 字符集說明:本詞法分析演示的是C語言的一個(gè)子集,字符集如下:
(1) 關(guān)鍵字:int,long,float,double,char,short,void,if,else,for,while,do,break,switch,
continue,case,default,return,static,struct
(2) 運(yùn)算符:+,-,*,/,%,>,<,=,!=,==,<=,>=,++,--,!,&,&&,||,[]
(3) 界符:,,;,{,},(,),:,’,”,#
(4) 標(biāo)識(shí)符:以字母開頭的字母數(shù)字串。
(5) 常數(shù):整型或浮點(diǎn)型。
2、 字符集的內(nèi)編碼形式:
字符 機(jī)內(nèi)編碼 字符 機(jī)內(nèi)編碼
int 1 = 26
long 2 > 27
char 3 < 28
if 4 ! 29
else 5 == 30
for 6 != 31
while 7 >= 32
return 8 <= 33
break 9 ++ 34
continue 10 -- 35
switch 11 & 36
case 12 && 37
default 13 || 38
float 14 [ 39
double 15 ] 40
void 16 , 41
struct 17 ; 42
static 18 ( 43
do 19 ) 44
short 20 { 45
+ 21 } 46
- 22 ‘ 47
* 23 “ 48
/ 24 : 49
% 25 # 50
如果是用戶自己定義的標(biāo)識(shí)符則機(jī)內(nèi)碼為51;
如果是常數(shù),則機(jī)內(nèi)碼為52。
錯(cuò)誤則用0表示機(jī)內(nèi)碼。
3、 相關(guān)變量說明:
(1) keyword[]:{"int","long","char","if","else","for","while","return","break",
"continue","switch","case","default","float","double","void","struct","static","do","short"};
(2) operater[]:{"+","-","*","/","%","=",">","<","!","==","!=",">=","<=","++","--",
"&","&&","||","[","]"};
(3) delimeter[]:{",",";","(",")","{","}","\'","\"",":","#"};
(4) 說明:1--20號(hào)為關(guān)鍵字,可直接用下標(biāo)表示,i+1就是其機(jī)內(nèi)碼,21--40為運(yùn)算符,間接下標(biāo):i+21就是其機(jī)內(nèi)碼, 41--50為界符,直接下標(biāo):i+41就是其機(jī)內(nèi)碼;
如果是用戶自己定義的標(biāo)識(shí)符,則其機(jī)內(nèi)碼為51;如果是常數(shù),則其機(jī)內(nèi)碼是52;如果是
錯(cuò)誤,則機(jī)內(nèi)碼為0.
4、 主要類說明:
(1) Analysis類:接收源程序,進(jìn)行詞法分析工作,再將分析結(jié)果傳到用戶界面。
(2) UserFrame類:不參與詞法分析工作,只提供用戶操作界面。接收用戶的輸入,并產(chǎn)生輸出。
5、 主要方法說明:
(1)preTreat():預(yù)處理,消除跳格符、換行符和回車符,合并空格并消除注釋。
(2)doAnalysis():主分析函數(shù),通過調(diào)用一系列子函數(shù),完成分析工作并輸出結(jié)果。
(3)divide():完成字符的分解,返回一個(gè)獨(dú)立的字符串(可能是關(guān)鍵字、標(biāo)識(shí)符、運(yùn)算符、界符或者數(shù)字串)。
(4)check():對(duì)divide()返回的字符串進(jìn)行檢查,判斷其是數(shù)字串、單個(gè)字符還是字符串,返回不同標(biāo)志。1:數(shù)字;2:?jiǎn)蝹(gè)字符;3:多個(gè)字符
(5)checkDigit():如果check()返回的是數(shù)字串,則調(diào)用該函數(shù)判斷其是整型還是浮點(diǎn)型,返回不同標(biāo)志。是正常的數(shù)字類型則返回常數(shù)對(duì)應(yīng)的機(jī)內(nèi)碼,否則,返回錯(cuò)誤的機(jī)內(nèi)碼。
(6)checkChar():如果check()返回的是單個(gè)字符,則調(diào)用該函數(shù)判斷其是標(biāo)識(shí)符、運(yùn)算符還是界符,返回其對(duì)應(yīng)的機(jī)內(nèi)碼。
(7)checkString():如果check()返回的是字符串,則調(diào)用該函數(shù)判斷其是關(guān)鍵字、標(biāo)識(shí)符還是運(yùn)算符,返回其機(jī)內(nèi)碼。