這是我們的一次程式設計作業,要求用c編寫乙個簡單的詞法分析器。要求如下:
編制乙個單詞獲取程式,從檔案輸入的源程式中,識別出各個具有獨立意義的單詞,即關鍵字、識別符號、整數、小數、字串、分隔符、運算子等七大類。並依次輸出各個單詞的內部編碼及單詞符號自身文字串(遇到錯誤時可顯示「error」,然後跳過錯誤部分繼續顯示)。
注意:單詞型別大小寫不敏感(即不區分大小寫)
1、詞法規則
關鍵字: program、const、var、integer、decimal、string、procedure、begin、end 、if、then、else、while、do、call、read、write、not
單詞類別:1
識別符號: 字母或「_」打頭的由字母、數字串或「_」組成的任意長度的符號串。
單詞類別:2
整數: 數字串。
單詞類別:3
小數: 數字串·數字串
單詞類別:4
字串: 由一對「」括起來的任意長度的符號串。注意:可以多行。
單詞類別:5
分隔符: 、(、)、;、空格
單詞類別:6
運算子: :=、=、<、<=、>、>=、+、-、*、/
單詞類別:7
2、設計詞法分析函式gettoken( ),完成以下功能:
1)gettoken( )每呼叫一次就分析出乙個單詞;
2)返回單詞類別、單詞自身文字串、單詞在原始檔中的行列號;
3、編寫測試程式,反覆呼叫函式gettoken ( ),輸出單詞資訊。
以下是**實現:
注意的事項:
1,">="這一類操作符要進行判斷。
2,小數的識別。為了簡便,我把小數當成字串進行處理,後續可以加上乙個字串轉數字的程式,或者直接直接識別成小數。
3,輸入的源程式如何判斷結束,我使用的是"#"字元進行判斷,應該可以通過使用eof進行識別吧。
4,超前搜尋指標要回退。
#include #include#include
using
namespace
std;
#define kw 1 //
關鍵字#define id 2 //
識別符號#define int 3 //
整數#define flt 4 //
小數#define str 5 //
字串#define brk 6 //
分隔符#define op 7 //
操作符#define wordlen 100
char prog[80
],token[wordlen];
char
ch;int
p,j,syn;
intrownum,linenum;
char *keyword[18] = ;
void
gettoken()
token [i++] = '\0'
; p--;
syn =id;
for(int n = 0;n < 18 ;n++)}}
/*識別實數
*/else
if(ch >= '
0' && ch <= '9'
)
if(ch=='.'
) }
if(isdouble)
if(!isdouble)
p--;
}/*以下**用於判斷字串
*/else
if(ch == '\"'
) token[j] = prog[p++];
//p--;此處p不回退,因為上個while判斷語句沒有進行超前搜尋。
syn =str;
}/*以下**用於判斷運算子
*/else
switch(ch)
else
break
;
case
'>':
j = 0
; token[j++] =ch;
ch = prog[p++];
if(ch == '='
)
else
break
;
case':
':j = 0
; token[j++] =ch;
ch = prog[p++];
if(ch == '='
)
else
break
;
case'=
':syn = op;token[0] = ch;break
;
case'+
':syn = op;token[0] = ch;break
;
case'*
':syn = op;token[0] = ch;break
;
case'/
':syn = op;token[0] = ch;break
;
case
'':syn = brk;token[0] = ch;break
;
case'(
':syn = brk;token[0] = ch;break
;
case')
':syn = brk;token[0] = ch;break
;
case';
':syn = brk;token[0] = ch;break
;
case
'':syn = brk;token[0] = ch;break
;
case'\n
':syn = -2;rownum = 0;break
;
case'#
':syn = 0;break
;
default :syn = -1;break
; }
}int
main()
}do }
while(syn != 0
);
return0;
}
簡單詞法分析器實現
編寫分析器有兩種方法,一種是通過dfa對單詞進行識別,二是通過直接編敲 進行識別。本程式採用dfa對單詞進行識別。dfa的實現方法。大概思想和書上一致,在程式中,則是用二維陣列代表狀態轉換矩陣,用一維陣列表示終態。可以識別識別符號 keyword 數字和運算子,對凝視進行過濾。同一時候還能識別出程式...
簡單詞法分析器實現
編寫分析器有兩種方法,一種是通過dfa對單詞進行識別,二是通過直接編敲 進行識別。本程式採用dfa對單詞進行識別。dfa的實現方法。大概思想和書上一致,在程式中,則是用二維陣列代表狀態轉換矩陣,用一維陣列表示終態。可以識別識別符號 keyword 數字和運算子,對凝視進行過濾。同一時候還能識別出程式...
c 模擬簡單詞法分析器
編譯原理的基礎之一就是詞法分析,這裡便使用c 簡單模擬了乙個詞法分析器。這個詞法分析器的狀態轉換圖如下 而我的執行截圖如下 如下 include using namespace std define max len 200 將乙個字串內容清空 void cleararray char c 判斷是否為...