分析 `locloc(@$)` 這個宏以及它在 `new assignment_statement_c(locloc(@$), $1, $3)` 中的用途。 - 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_file: 檔案名稱 (通常是指向字串的指標)
      • first_order: 起始順序 (可能是字元偏移量或其他內部排序值)
      • last_line: 結束行號
      • last_column: 結束列號
      • last_file: 檔案名稱 (通常與起始相同)
      • 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(locloc(@$), $1, $3); }
      ;
      
    • new assignment_statement_c(...) 是在創建一個代表賦值語句的抽象語法樹 (AST) 節點。這個節點的類別是 assignment_statement_c (定義在 absyntax.hh)。
    • $1 代表規則右側第一個符號 (variable) 的值,通常是指向代表該變數的 AST 節點的指標。
    • $3 代表規則右側第三個符號 (expression) 的值,通常是指向代表該表達式的 AST 節點的指標。
    • locloc(@$) 的用途: 將整個賦值語句 (從 variable 的開始到 expression 的結束) 在原始碼中的完整位置資訊 (起始行/列/檔案/順序 到 結束行/列/檔案/順序) 作為參數傳遞給 assignment_statement_c 類別的建構子
    • 目的: 讓創建出來的 AST 節點 (assignment_statement_c 的實例) 能夠儲存它所代表的原始程式碼片段的精確位置。這對於編譯器的後續階段至關重要:
      • 錯誤報告: 如果在語意分析或代碼生成階段發現這個賦值語句有問題(例如類型不匹配),編譯器可以使用儲存的位置資訊,精確地告訴使用者錯誤發生在哪個檔案的哪一行、哪一列。
      • 除錯資訊生成: 在生成目標代碼時,可以將機器指令或中間代碼與原始碼的位置關聯起來,方便後續的除錯。
      • 程式碼分析與轉換: 某些工具或編譯階段可能需要知道程式碼片段的原始位置。

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