title: PL/0功能拓展及基于VSCode的IDE配置
date: 2024-08-06 22:46:38
tags: 做過的實驗||項目復盤
top: true
概述
PL/0語言可以看成PASCAL語言的子集,它的編譯程序是由C語言編寫的編譯解釋執行系統。PL/0能充分展示高級語言的最基本成分。
拓展了pl0語言的基礎功能(浮點數實現、出錯處理、實現整型數組以及格式化輸入輸出),增加了整型數組求和、平均值、最大最小值系統函數,基于VSCode插件來實現代碼補全和自動高亮。
項目地址:https://github.com/GorwayWong/Compiler-Theory-Assignment-PL-0-extend
PL/0基礎功能擴展實現
符號總覽以及格式化輸入/輸出
在編譯器源文件中添加以下新拓展:
其中 printfsym 代表格式化輸出,scanfsym 代表格式化輸入。
保留字符號及名字均按照字母表順序進行排列。
其中printf是格式化輸出符號,scanf是格式化輸入符號;同時沒有刪除pl0本來的輸入輸出函數write和read,是因為一些情況下用這些更方便。
設置printfsym以及scanfsym為語句的開始符號。
在statement函數中添加對printf語句以及scanfsym語句的處理。二者的基本代碼與write、read結構類似,就是多了對’d’以及’f’的處理,遇見d時以整型進行輸入輸出,而f則是浮點型。相對而言,scanf的處理更加復雜,由于浮點類型的讀入與整型類型的讀入存在區別,而原本的opr指令中只支持對整型的處理,所以我增加了一條新的指令(opr 0 17 0),與(opr 0 16 0)相互配合處理不同的類型輸入。
同時將原來的整型數據棧s改成了float類型,整型浮點型都用這個棧進行操作。
格式化輸入輸出測試結果:
給PL/0添加浮點數以及浮點數上下取整系統函數
首先設置floatsym為因子開始符號。
在getsym中進行修改,如果識別到一個詞有可能是數字,則如果在識別過程中遇到了小數點,則認為其是浮點類型:
上下取整采用系統函數的方式實現,即操作格式為:ceil(浮點數) floor(浮點數)。增加了兩個新的關鍵字符號ceilsym和floorsym,將二者設置成因子開始符號。
二者的處理思想較為類似,即將被上下取整操作之后的浮點數當作因子返回。在factor函數中增加對這兩個sym的識別以及處理。在對ceilsym的處理中,如果括號里的數是浮點數變量,則生成lod指令,最后一位參數為2(在前面已經提到,修改lod使得其能將浮點數轉換成int后加1放到棧頂)。如果是常量,則將其轉換成int類型再+1放到棧頂。
編寫的.plg測試文件以及結果:
其他功能
還擴展了整數數組、浮點數組、出錯處理模塊,具體請看GitHub地址源碼:
項目地址:https://github.com/GorwayWong/Compiler-Theory-Assignment-PL-0-extend
PL/0高級功能擴展實現
實現了四個系統的統計函數:sum(數組(求和范圍)),avg(數組(求平均范圍)),max(數組(求最大值范圍)),min(數組(求最小值范圍))。
這里的“范圍”可以是數組大小,也可以是大于0小于數組大小的一個數,比如有一個大小為3的數組list, sum(list(2))則是求前兩個數的和。
實現思路與浮點數上下取整功能實現類似,將處理之后的數字當作因子參與運算。于是在factor中增添了四個關鍵字符號的識別:sumsym,avgsym,maxsym,minsym。
對于求和函數sum:分別對整型數組和浮點數組進行處理,但二者的不同之處在于對于s棧頂數據的操作一個是整型一個是浮點型。求和思路為:依次將數組中的元素取到棧頂(使用lod方法,lod方法對不同的數據類型有不同的操作,具體請見源代碼),然后使用opr 0 2 0對棧頂元素進行兩兩相加,最后棧頂留下的元素就是數組的和了。
對于求平均值函數avg,前面的步驟與求和類似,在棧頂元素是數組之和之后,將求平均的范圍,也就是數組后跟的括號里的數(存在全局變量num中)存到棧頂,此時棧頂為數組大小,次棧頂為數組之和,再生成opr 0 5 0除法指令,得到的就是平均數了,存在棧頂。
對于求最大值函數max,將數組中的各個元素取到棧頂之后,調用opr 0 18 0指令(新增的DIY指令,將棧頂和次棧頂比較,將最大值存在次棧頂,原棧頂去掉,即t-1)若干次,次數為數組大小-1,完成后棧頂元素就是最大值了。
對于求最小值函數min,將數組中的各個元素取到棧頂之后,調用opr 0 19 0指令(新增的DIY指令,將棧頂和次棧頂比較,將最小值存在次棧頂,原棧頂去掉,即t-1)若干次,次數為數組大小-1,完成后棧頂元素就是最小值了。
效果圖:
編譯原理的魅力
基于VSCode實現PL/0支持插件
效果:
對于特定后綴的文件.plg,通過編寫自定義的vscode插件實現了關鍵字、標識符、以及其他符號的高亮。
同時,該vscode插件還可以實現自動補全(對于.plg文件),以下是效果圖一覽: