本學(xué)期修了《編譯原理》這門課嚎货。課程大作業(yè)是實(shí)現(xiàn)一個(gè)PL/0編譯器。接下來(lái)將記錄在實(shí)現(xiàn)過(guò)程中的心得蔫浆、遇到的問(wèn)題和解決辦法殖属,如有錯(cuò)誤之處,歡迎指正克懊。
PL/0語(yǔ)言描述
PL/0型語(yǔ)言是Pascal語(yǔ)言的一個(gè)子集。作為一門教學(xué)用程序設(shè)計(jì)語(yǔ)言七蜘,它比PASCAL語(yǔ)言簡(jiǎn)單谭溉,并作了一些限制。PL0的程序結(jié)構(gòu)比較完全橡卤,相應(yīng)的選擇扮念,不但有常量,變量及過(guò)程聲明碧库,而且分支和循環(huán)結(jié)構(gòu)也是一應(yīng)俱全柜与。
PL/0文法的EBNF表示如下:
<程序> ::= <分程序>.
<分程序> ::= [<常量說(shuō)明部分>][變量說(shuō)明部分>][<過(guò)程說(shuō)明部分>]<語(yǔ)句>
<常量說(shuō)明部分> ::= const<常量定義>{,<常量定義>};
<常量定義> ::= <標(biāo)識(shí)符>=<無(wú)符號(hào)整數(shù)>
<無(wú)符號(hào)整數(shù)> ::= <數(shù)字>{<數(shù)字>}
<標(biāo)識(shí)符> ::= <字母>{<字母>|<數(shù)字>}
<變量說(shuō)明部分>::= var<標(biāo)識(shí)符>{,<標(biāo)識(shí)符>};
<過(guò)程說(shuō)明部分> ::= <過(guò)程首部><分程序>;{<過(guò)程說(shuō)明部分>}
<過(guò)程首部> ::= procedure<標(biāo)識(shí)符>;
<語(yǔ)句> ::= <賦值語(yǔ)句>|<條件語(yǔ)句>|<當(dāng)型循環(huán)語(yǔ)句>|<過(guò)程調(diào)用語(yǔ)句>|<讀語(yǔ)句>|<寫語(yǔ)句>|<復(fù)合語(yǔ)句>|<重復(fù)語(yǔ)句>|<空>
<賦值語(yǔ)句> ::= <標(biāo)識(shí)符>:=<表達(dá)式>
<表達(dá)式> ::= [+|-]<項(xiàng)>{<加法運(yùn)算符><項(xiàng)>}
<項(xiàng)> ::= <因子>{<乘法運(yùn)算符><因子>}
<因子> ::= <標(biāo)識(shí)符>|<無(wú)符號(hào)整數(shù)>|'('<表達(dá)式>')‘
<加法運(yùn)算符> ::= +|-
<乘法運(yùn)算符> ::= *|/
<條件> ::= <表達(dá)式><關(guān)系運(yùn)算符><表達(dá)式>|odd<表達(dá)式>
<關(guān)系運(yùn)算符> ::= =|<>|<|<=|>|>=
<條件語(yǔ)句> ::= if<條件>then<語(yǔ)句>[else<語(yǔ)句>]
<當(dāng)型循環(huán)語(yǔ)句> ::= while<條件>do<語(yǔ)句>
<過(guò)程調(diào)用語(yǔ)句> ::= call<標(biāo)識(shí)符>
<復(fù)合語(yǔ)句> ::= begin<語(yǔ)句>{;<語(yǔ)句>}end
<重復(fù)語(yǔ)句> ::= repeat<語(yǔ)句>{;<語(yǔ)句>}until<條件>
<讀語(yǔ)句> ::= read'('<標(biāo)識(shí)符>{,<標(biāo)識(shí)符>}')‘
<寫語(yǔ)句> ::= write'('<標(biāo)識(shí)符>{,<標(biāo)識(shí)符>}')‘
<字母> ::= a|b|...|X|Y|Z
<數(shù)字> ::= 0|1|2|...|8|9
實(shí)現(xiàn)效果
項(xiàng)目整個(gè)界面分為導(dǎo)航欄巧勤,代碼區(qū),token表區(qū)弄匕,符號(hào)表區(qū)颅悉,Pcode區(qū)以及控制臺(tái)。各分區(qū)的功能如下:
分區(qū) | 功能 |
---|---|
導(dǎo)航欄 | 打開(kāi)迁匠,關(guān)閉或保存文件剩瓶;編譯和執(zhí)行代碼 |
代碼區(qū) | 展示并編輯代碼 |
Token表區(qū) | 展示代碼中的token |
Symbol表區(qū) | 展示代碼編譯過(guò)程中生成的symbol表 |
Pcode表區(qū) | 展示代碼生成的所有Pcode |
控制臺(tái) | 輸出編譯信息 |
相關(guān)代碼在shiyi001的PL/0編譯器,運(yùn)行環(huán)境為JRE1.8
NEXT ONE: PL/0簡(jiǎn)單編譯系統(tǒng)(一)