分析 `locloc(@$)` - benchen2001/matiec GitHub Wiki

好的,我們來分析 locloc(@$) 這個宏以及它在 new assignment_statement_c(locloc(@$), $1, $3) 中的用途。

  1. locloc 宏的定義 (位於 iec_bison.yy 第 136 行):

    #define locloc(foo) foo.first_line, foo.first_column, foo.first_file, foo.first_order, foo.last_line, foo.last_column, foo.last_file, foo.last_order
    
    • 說明: 這個宏接收一個參數 foo。它會將 foo 的 8 個成員變數展開成一個逗號分隔的列表。這些成員變數代表了原始碼中的位置資訊。
  2. @$ 的意義:

    • 在 Bison 的動作程式碼 ({ ... }) 中,@$ 代表當前正在被歸約 (reduce) 的語法規則左側非終端符號的位置資訊。這個位置資訊的類型是 YYLTYPE
    • YYLTYPE 結構通常包含以下成員 (雖然您提供的片段不完整,但根據 locloc 宏推斷):
      • first_line: 起始行號
      • first_column: 起始列號
      • first_filename: 檔案名稱 (通常是指向字串的指標)
      • first_order: 起始順序 (可能是字元偏移量)
      • last_line: 結束行號
      • last_column: 結束列號
      • last_filename: 檔案名稱 (通常與起始相同)
      • last_order: 結束順序 (可能是字元偏移量)
    • 因此,@$ 儲存了構成該非終端符號的整個語法片段在原始碼中的起始和結束位置。
  3. locloc(@$) 的展開式: 將 @$ 代入 locloc 宏,展開後變成:

    @$.first_line, @$.first_column, @$.first_file, @$.first_order, @$.last_line, @$.last_column, @$.last_file, @$.last_order
    
    • 這會提取出與當前規則左側非終端符號相關的所有 8 個位置資訊欄位。
  4. new assignment_statement_c(locloc(@$), $1, $3) 中的用途:

    • 這行程式碼是在匹配賦值語句 (assignment_statement : variable T_ASSIGN expression) 的規則時執行的動作。
    • new assignment_statement_c(...) 是在創建一個代表賦值語句的抽象語法樹 (AST) 節點。
    • $1 是賦值語句左側 variable 的 AST 節點指標。
    • $3 是賦值語句右側 expression 的 AST 節點指標。
    • locloc(@$) 的用途: 將整個賦值語句 (從 variable 的開始到 expression 的結束) 在原始碼中的完整位置資訊 (起始行/列/檔案/順序 到 結束行/列/檔案/順序) 作為參數傳遞給 assignment_statement_c 的建構子。
    • 目的: 讓創建出來的 AST 節點 (assignment_statement_c 的實例) 能夠儲存它所代表的原始程式碼片段的位置。這對於後續的編譯階段非常重要,例如:
      • 錯誤報告: 如果在語意分析階段發現這個賦值語句有問題,可以精確地指出錯誤發生在哪個檔案的哪一行、哪一列。
      • 除錯資訊: 生成除錯資訊時,可以將機器碼指令對應回原始碼的位置。
      • 程式碼轉換/生成: 在某些情況下,可能需要在生成的程式碼中保留原始位置的註解或標記。

總之,locloc(@$) 是一個方便的宏,用於將某個語法結構的完整原始碼位置資訊一次性傳遞給對應的 AST 節點建構子,以便 AST 能夠記錄其來源。