簡單詞法分析器的實現

2022-08-20 14:27:08 字數 3375 閱讀 4492

這是我們的一次程式設計作業,要求用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 判斷是否為...