/NTHU-CS135601_Mini_Project_1

I2P(II) mini project 1 - Simple Calculator Assembly code generator

Primary LanguageC

Simple-Calculator-Assembly-code-generator

I2P(II) mini project 1 - Simple Calculator Assembly code generator

運行

  • master, testing_master:多檔案架構,run solve.c
  • submit, testing_submit:單檔案架構,run submit.c
  • (單檔案架構中除 submit.c 有維護外,其他皆不保證版本及能否運行,反之亦然)

程式架構

Struct

  • ErrorType:(solve.c 預設)處理/指明各種 Error,方便 Debug。
  • BTNode:(solve.c 預設)樹節點,加入int weight記錄運算權重。
  • Symbol:(solve.c 預設)紀錄出現過的變數,加入int assigned記錄是否已被賦值。
  • Value:整合數值與未知值,簡化含未知值的計算。
  • Register:暫存器,int occupied記錄此暫存器是否已被占用。

Variables

  • (省略 solve.c 預設全域變數)
  • Register reg[]:宣告 8 個暫存器。
  • int DEBUG_MODE:切換 submit 與 debug 模式。(如果有要跑 code 可以改為 1,並將 line 864 的 inline 刪除,這是合併檔案時忘記改的 bug)
  • int reg_needed:記錄計算此 statement 所需的 Register 數量。
  • int total_clock_cycle:記錄使用的 clock cycle。
  • int last_clock_cycle:記錄前次 clock cycle,以計算此 Statement 使用的 clock cycle。

主要函式功能

(開發時切成 solve.c, lexer_parser.c, helpful.c, semantizer.c code_gen.c 等檔案撰寫,code 中有用註解標示,可用搜尋快速跳至。solve.c)

  • int main()

    變數初始化。(其他原 solve.c 內容分別移至 lexer_parser.c 跟 helpful.c。)

  • void statement()

    原 solve.c 函式,並將 parse tree 的後續處理分離至evaluate(BTNode *)中。

  • void evaluate(BTNode *)

    分離 submit 跟 debug 的輸出。先將 parse tree 傳至semantize()做預處理,後傳至codeGenerate()產出 Assembly Code。

  • Value *semantize(BTNode *)

    利用回傳值以計算數值,並更新運算權重。
    Token 為 ID 時,特別判斷變數未賦值的狀況。
    Token 為 Assign 時回傳NULL,以處理 multiple assign 的狀況。
    Token 為 Ops 時,如果兩個子節點數值已知,則可優化為一個常數節點。

  • Register generateCode(BTNode *)

    依照運算權重選擇優先執行的部分,以減少暫存器使用。