賈燕梅
摘 要:近年來,信息技術(shù)的迅猛發(fā)展,對軟件技術(shù)和軟件工具的需求急劇增加,編譯技術(shù)已大量應(yīng)用于各種各樣軟件工具的研制和開發(fā)中。本課程設(shè)計從最初語言的定義開始,終結(jié)符號的說明,到驗證詞法分析器、語法分析器功能和語義分析功能的實現(xiàn),為后續(xù)內(nèi)容中間代碼、目標(biāo)代碼的生成打下更為堅實的理論和實踐基礎(chǔ)。
關(guān)鍵詞:編譯原理 編譯程序 解釋 詞法分析器 語法分析器
一、語言定義
(一) 字符集的定義:
1.<字符集>:= <字母> | <數(shù)字> | <單界符>
2.<字 母> := A | B…….| Z | a | b | ……….| z
3. <數(shù)字> := 0 | 1 | 2 |……| 9
4.<單界符> := ' | ( | ) | * | + | , | - | . | / | : | ; | < | = | > | [ | ] _ //15-31
(二) 單詞集的定義:
<單詞集>:= <保留字> | <雙界符> | <標(biāo)識符> | <常數(shù)> | <單界符>
6.<保留字> := and | array | begin | bool | call | case | char | constant | do | else | end | false | for | if | input | integer | not | of | or | output | read | real | repeat | return |set | then | to | true | until | main | void | while | write//32-64
7. <雙界符> := <> | <= | >= | := | /* | */ | ..// 1-7
8.<標(biāo)識符> := 〈字母〉| 〈標(biāo)識符〉〈數(shù)字〉| 〈標(biāo)識符〉〈字母〉
9.〈常數(shù)〉:= 〈整數(shù)〉|〈布爾常數(shù)〉|〈字符常數(shù)〉|〈常數(shù)標(biāo)識符〉|〈實數(shù)〉
10.<整數(shù)〉:=〈數(shù)字〉|〈整常數(shù)〉〈數(shù)字〉
(三) 表達(dá)式的定義
11. <表達(dá)式>:=<算術(shù)表達(dá)式>|<布爾表達(dá)式>|<字符表達(dá)式>
12.<算術(shù)表達(dá)式>:=<算術(shù)表達(dá)式>+-<項>|+-<項>|<項>
13. <項>:=<項>* <因子>|<項>/<因子> | <因子>
14. <因子>:=<算術(shù)量> | (<算術(shù)表達(dá)式>)
15.<算術(shù)量>:=<整數(shù)標(biāo)識符>|<實數(shù)標(biāo)識符> | <正整數(shù)常數(shù)> | <正實數(shù)常數(shù)>
(四) 語句定義
16. <語句>:=<變量聲明語句>|<函數(shù)聲明語句>|<賦值語句>|<布爾表達(dá)語句>|
<函數(shù)調(diào)用語句>|<輸入語句>|<輸出語句>|<return語句>|<復(fù)合語句>
17.<類型>:= integer | char | real | bool
18. <變量聲明語句>=<類型><賦值表達(dá)式>;|<類型><賦值表達(dá)式>,<賦值表達(dá)式>;
19. <輸入語句>:=input:<變量表>;
二、各終結(jié)符說明
(一)單終結(jié)符
三、各功能模塊的實現(xiàn)
(一)詞法分析器的實現(xiàn)
其基本思路是每次從源文件中讀一行放入緩沖區(qū)。再從緩沖區(qū)中每次讀取一個字符進(jìn)行判斷,為方便判斷,每次多讀一個字符,根據(jù)不同的字符進(jìn)入不同的處理過程。將識別出的每一個單詞(標(biāo)識符,立即數(shù))都填入符號表中,并返回符號表的入口以作為TOKEN的第二個分量。這樣構(gòu)成的TOKEN的第一個分量是種別碼,如果是關(guān)鍵字,第二個分量為空,否則,TOKEN的第二分量為該單詞在符號表中的入口地址。
(二)語法分析器的實現(xiàn)
本編譯器采用語法語義分析在同一遍中完成。所用中間代碼為四元式序列。語法分析階段采用LL(1)分析法,采用算符優(yōu)先的至頂向下分析法,但是不使用堆棧保存各種狀態(tài),而是設(shè)置一個字符變量表示當(dāng)前狀態(tài),再根據(jù)所出現(xiàn)的符號,判斷是否規(guī)約和執(zhí)行各種語義動作,直到出現(xiàn)終結(jié)狀態(tài)。在識別出合法的語義后,如果有四元式產(chǎn)生,則寫入中間代碼文件parser.txt中。
(三)四元式解釋器的實現(xiàn)
本編譯器直接將中間代碼四元式解釋執(zhí)行。四元式的結(jié)構(gòu)為:(運算符,direction,source1,source2)。
解釋程序?qū)懺趀xceut.h中,其就為一個switch語句,根據(jù)不同的四元式操作而執(zhí)行相應(yīng)的操作。源程序的執(zhí)行結(jié)果直接在標(biāo)準(zhǔn)輸出上輸出。解釋程序結(jié)束后,對資源進(jìn)行回收。
四、測試數(shù)據(jù)及結(jié)果
由于系統(tǒng)龐大,受篇幅的限制,僅選取了比較有代表性的幾個測試結(jié)果作為說明。
輸入源程序所在文件:我們選擇soure.txt內(nèi)容為
{函數(shù)調(diào)用}
Procedure add(x,y);
Begin
x:=x+y;
end;
{主函數(shù)}
Program exp;
Var a,b:integer;
begin
a:=4*(2-3)/2;{測試優(yōu)先級}
b:=10;
b:=a+b;
write(b);{測試輸出語句}
if a>b then{測試if-then-else}
a:=b;
else
b:=a;
write(b);
call add(a,b);{調(diào)用函數(shù)}
write(a);
While a<b do{測試while-do}
a:=b-a*2;
write(a);
end.
開始?xì)g迎界面,輸入1,我們看見符號表已近生成。當(dāng)然由于屏幕的原因,顯示不全。輸入2, 輸入1, 繼續(xù)執(zhí)行結(jié)果,我們發(fā)現(xiàn)實現(xiàn)正確的結(jié)果?!?/p>
參考文獻(xiàn):
[1] 賀汛.《編譯方法學(xué)習(xí)指導(dǎo)與實踐》,機械工業(yè)出版社