編譯過程介紹
1 問題簡述
程序需要讀入用戶的腳本,然后判斷是否符合預(yù)定義的語法規(guī)則。若存在則將第一條出錯反饋給用戶,否則,程序?qū)τ脩舻哪_本代碼進行轉(zhuǎn)化,生成可進一步處理的中間代碼。
2 具體過程
2.1 第一步
載入預(yù)定義顏色映射表,關(guān)鍵字表。
初始化字典樹。
2.2 第二步
檢查各類可能錯誤。
2.2.1 具體步驟一
檢查用戶輸入腳本代碼的括號匹配,若存在問題,則進行反饋并中止編譯。
2.2.2 具體步驟二
分解用戶輸入的腳本代碼,將其分解為關(guān)鍵詞形式。若存在未知關(guān)鍵詞或者關(guān)鍵詞沖突,則進行反饋并中止編譯。
2.2.3 具體步驟三
檢查變量聲明問題,若存在變量未定義或重復(fù)定義,則進行反饋并中止編譯。
2.2.4 具體步驟四
檢查函數(shù)調(diào)用問題,若存在不合法調(diào)用、函數(shù)參數(shù)缺省或贅余,則進行反饋并中止編譯。
2.3 第三步
通過上述編譯過程后,程序完全分解用戶代碼。根據(jù)預(yù)定義的語法規(guī)則,輸出對應(yīng)符號相關(guān)信息(如變量內(nèi)容,函數(shù)參數(shù)等)。
2.4 第四步
對函數(shù)的參數(shù)中的表達式一項進行化簡處理,按照運算符優(yōu)先級進行模擬展開,并建立表達式樹,依次劃分運算順序,分離運算過程。
3 總結(jié)
3.1 時空復(fù)雜度分析
所有涉及操作的空間復(fù)雜度均低于OceanView中其他過程的空間復(fù)雜度,因此這里并不會產(chǎn)生空間使用超限的問題。
所有涉及操作的時間復(fù)雜度與讀入腳本的長度幾乎為線性相關(guān),相比較于OceanView中其他過程的時間復(fù)雜度,編譯用戶腳本的占用時間可以忽略不計。
3.2 優(yōu)勢
程序較為完美的根據(jù)預(yù)定義的語法規(guī)則,完成了代碼的轉(zhuǎn)化。(目前尚未測試出bug)
最終生成的代碼,依據(jù)表達式樹的形式給出,便于OceanView做進一步處理。
程序代碼經(jīng)過多次重構(gòu),封裝良好,最終只提供給用戶唯一調(diào)用接口,方便遷移和復(fù)用。
3.3 劣勢
由于預(yù)定義的語法規(guī)則比起一門正規(guī)語言要簡便,最終生成的目標(biāo)代碼也可以理解為高級語言的形式。因此程序省略了傳統(tǒng)編譯器中的部分過程,并不能算作一個完整的編譯器。