Skip to content

Latest commit

 

History

History
51 lines (31 loc) · 2.67 KB

File metadata and controls

51 lines (31 loc) · 2.67 KB

Delphi- 編譯器:用於代碼生成的掃描器與解析器修改說明

掃描器狀態

  • 支援 Delphi- 保留字的非大小寫敏感關鍵字匹配,並直接映射到解析器 Token。
  • 支援使用百分比符號的取模運算子,返回 MOD Token。
  • 雙引號字串字面量處理,正確解析雙引號轉義,以支援字串內部的巢狀引號。
  • 支援 Pascal 風格的區塊註解與 C++ 風格的單行註解。

符號表調整

為了配合 JVM 代碼生成,符號表中的 Symbol 結構新增了局部暫存器索引欄位:

局部暫存器索引

使用有符號整數欄位記錄局部變數分配。全域作用域變數標記為負索引,表示類別的靜態欄位(Static Field)。子程序內部的變數則獲得非負偏移量,對應 JVM 局部變數暫存器。

解析器與代碼生成架構

解析器已完全從驗證工具轉變為輸出 Jasmin 彙編的代碼生成器。

彙編輸出流控制

新增格式化 Jasmin 彙編輸出的輔助函數。解析器會建立以程式識別碼命名的目標檔案並寫入指令。

變數存儲分配

全域變數直接映射到 Java 類別的靜態欄位。局部變數則映射到 JVM 局部暫存器。若局部變數帶有初始值,解析器會生成指令將初始值載入堆疊,隨後存入分配的局部暫存器中。

基於堆疊的表達式求值

編譯期常數折疊被運行期的堆疊求值取代。表達式節點會生成標準的 JVM 算術指令。布林關係運算先將兩個操作數相減,隨後利用條件分支指令將 0 或 1 推入堆疊。邏輯運算子映射為位元運算,並利用與常數 1 進行異或來實現布林非運算。

控制流結構

  • 分支結構使用標記追蹤器與堆疊來支援任意巢狀
  • If-then-else 語句使用標記堆疊,根據條件求值結果引導跳轉到 else 分支或結束位置
  • While 循環在循環頭部生成條件評估標記,並在循環尾部生成無條件跳轉回進入點的指令
  • For 循環會初始化控制變數,通過堆疊操作數交換來使用減法評估邊界條件,執行語句區塊後將控制變數遞增,最後循環回頭
  • Repeat-until 循環先放置起點標記,執行循環語句後評估循環條件,若條件為假則跳轉回起點

方法宣告與呼叫

  • 函數與過程被宣告為靜態 JVM 方法
  • 參數從暫存器 0 開始依序接收
  • 參數簽名在宣告與呼叫時動態構建
  • Procedure 返回 void,函數則使用整數返回指令返回值

輸出整合

標準的 write 與 writeln 語句會載入 System.out 的 PrintStream 引用,與堆疊頂部的表達式進行交換,並呼叫對應的 print 或 println 方法。